5

我想找到检测异常值的最佳方法是什么。这是问题所在,有些事情可能不起作用。假设我们想从 mysql 中的脏 varchar(50) 列中找出一些准统一数据。让我们从按字符串长度进行分析开始。

| strlen |  freq  | 
|      0 |   2312 |
|      3 |     45 |
|      9 |     75 |
|     10 |  15420 |
|     11 |    395 |
|     12 |    114 |
|     19 |     27 |
|     20 |   1170 |
|     21 |     33 |
|     35 |     9  |

我想做的是设计一种算法来确定哪个字符串长度很可能是故意唯一的,而不是打字或随机垃圾。该字段可能是“枚举”类型,因此有效值可能存在多个频率峰值。显然 10 和 20 是有效的,0 只是省略了数据。35 和 3 可能是一些随机垃圾,尽管它们的频率非常不同。19 和 21 可能是 20 格式的类型操作系统。11 可能是 10 的类型操作系统,但是 12 呢?

似乎仅仅使用出现频率 % 是不够的。在明显的异常值周围需要有更高“只是一个错误”概率的热点。

此外,当有 15 个唯一长度可以在 5-20 个字符之间变化时,固定阈值会失败,每个字符的出现率在 7% - 20% 之间。

标准差不起作用,因为它依赖于平均值。中值绝对偏差可能不起作用,因为您可能有一个无法丢弃的高频异常值。

是的,还会有其他参数用于清理代码中的数据,但长度似乎可以非常快速地对具有任意数量结构的字段进行预过滤和分类。

是否有任何已知的有效方法?我对贝叶斯过滤器或机器学习不是很熟悉,但也许他们可以提供帮助?

谢谢!莱昂

4

1 回答 1

2

听起来异常检测是要走的路。异常检测是一种用于发现异常值的机器学习。它有几个品种,包括有监督的和无监督的。在监督学习中,算法使用异常值的例子进行训练。在无监督学习中,该算法试图在没有任何示例的情况下找出异常值。这里有几个链接可以开始:

http://en.wikipedia.org/wiki/Anomaly_detection

http://s3.amazonaws.com/mlclass-resources/docs/slides/Lecture15.pdf

我没有找到任何指向现成库的链接。如果您无法在您选择的语言中找到异常检测库,则 MATLAB 或其免费表亲 Octave 之类的东西可能是一个不错的方法。https://goker.wordpress.com/tag/anomaly-detection/

于 2012-01-20T02:04:31.653 回答