推荐的异常检测技术用于简单的一维场景?

Gru*_*eck 29 classification machine-learning

我有一个场景,我有几千个数据实例.数据本身表示为单个整数值.我希望能够检测出一个实例是一个极端的异常值.

例如,使用以下示例数据:

a = 10
b = 14
c = 25
d = 467
e = 12
Run Code Online (Sandbox Code Playgroud)

d 显然是异常,我想基于此执行特定的操作.

我很想尝试使用我对特定领域的知识来检测异常.例如,找出与有用的平均值的距离,并根据启发式检查该值.但是,我认为如果我研究更一般的,强大的异常检测技术可能会更好,这些技术背后有一些理论.

由于我的数学知识有限,我希望找到一种简单的技术,例如使用标准偏差.希望数据的单一尺寸性质会使这成为一个常见问题,但如果需要更多信息,请发表评论,我会提供更多信息.


编辑:以为我会添加有关数据的更多信息以及我尝试过的内容,以防它使一个答案比另一个更正确.

这些值都是正数且非零.我希望这些值会形成正态分布.这种期望是基于域的直觉而不是通过分析,如果这不是一件坏事,请告诉我.在聚类方面,除非还有标准算法来选择k值,否则我会发现很难将这个值提供给k-Means算法.

我想对异常/异常采取的行动是将它呈现给用户,并建议基本上从数据集中删除数据点(我不会了解他们将如何做到这一点,但它是有道理的对于我的域名),因此它不会被用作另一个函数的输入.

到目前为止,我已经尝试了三西格玛,并且我的有限数据集上的IQR异常值测试.IQR标记的值不够极端,三西格玛指出的实例更符合我对域的直觉.


有关此特定方案的算法,技术或资源链接的信息是有效且受欢迎的答案.

对于简单的一维数据,推荐的异常检测技术是什么?

Amr*_*mro 43

查看三西格玛规则:

mu  = mean of the data
std = standard deviation of the data
IF abs(x-mu) > 3*std  THEN  x is outlier
Run Code Online (Sandbox Code Playgroud)

另一种方法是IQR离群值测试:

Q25 = 25th_percentile
Q75 = 75th_percentile
IQR = Q75 - Q25         // inter-quartile range
IF (x < Q25 - 1.5*IQR) OR (Q75 + 1.5*IQR < x) THEN  x is a mild outlier
IF (x < Q25 - 3.0*IQR) OR (Q75 + 3.0*IQR < x) THEN  x is an extreme outlier
Run Code Online (Sandbox Code Playgroud)

该试验通常采用箱形图(由胡须表示):

箱形图


编辑:

对于您的情况(简单的一维单变量数据),我认为我的第一个答案非常适合.然而,这不适用于多变量数据.

@smaclell建议使用K-means来查找异常值.除了主要是聚类算法(实际上不是异常检测技术)之外,k均值的问题在于它需要预先知道聚类数K的良好值.

更适合的技术是DBSCAN:基于密度的聚类算法.基本上,它将具有足够高密度的区域生长成簇,这将是密度连接点的最大集合.

dbscan_clustering

DBSCAN需要两个参数:epsilonminPoints.它从一个尚未访问过的任意点开始.然后它找到epsilon起点距离内的所有邻居点.

如果邻居的数量大于或等于minPoints,则形成集群.将起点及其邻居添加到此群集,并将起始点标记为已访问.然后,算法递归地重复所有邻居的评估过程.

如果邻居的数量小于minPoints,则该点被标记为噪声.

如果群集完全展开(访问范围内的所有点都被访问),则算法继续迭代剩余的未访问点,直到它们被耗尽.

最后,标记为噪声的所有点的集合被认为是异常值.

  • 凉!感谢您的精彩回答和解释. (2认同)
  • +1三西格玛和IQR看起来像是很好的技术,感谢有见地的答案. (2认同)
  • 我喜欢这个简单的建议.基于IQR的统计数据具有不受极端异常值影响的优点,极端异常值将改变均值/标准差. (2认同)