【问题标题】:Recommended anomaly detection technique for simple, one-dimensional scenario?推荐用于简单一维场景的异常检测技术?
【发布时间】:2011-01-19 04:45:09
【问题描述】:

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

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

a = 10
b = 14
c = 25
d = 467
e = 12

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

我很想尝试使用我对特定领域的了解来检测异常。例如,找出有用的平均值的距离,并根据启发式进行检查。但是,我认为如果我研究更通用、更强大的异常检测技术可能会更好,因为它们背后有一些理论。

由于我的数学工作知识有限,我希望找到一种简单的技术,例如使用标准差。希望数据的单维性质会使这成为一个相当普遍的问题,但如果需要更多关于该场景的信息,请发表评论,我会提供更多信息。


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

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

我想对异常值/异常采取的措施是将其呈现给用户,并建议将数据点基本上从数据集中删除(我不会讨论他们将如何做到这一点,但是它对我的域有意义),因此它不会用作另一个函数的输入。

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


有关算法、技术或资源链接的信息以了解此特定场景是有效且受欢迎的答案。

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

【问题讨论】:

  • 不要低估科学知识的价值。黑盒程序很少是要走的路。尝试用简单的统计数据来表达你的科学知识。
  • @Tristan:您是说您认为我应该尝试提出一个模型,该模型具有一定的统计学基础,但最终是针对我的问题领域的?
  • 我只是说你对什么是合理的(即生成好数据和坏数据的模型)的了解是重要的信息。您应该设计一个程序,例如使用 IQR,这是由您对该领域的科学知识所激发的。我不喜欢 k-means 之类的东西,因为在我看来,它没有很好的动力,而且天生不灵活。

标签: machine-learning classification


【解决方案1】:

查看three-sigma rule

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

另一种方法是IQR outlier test

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

此测试通常由Box plots 使用(由胡须表示):


编辑:

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

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

更适合的技术是DBSCAN:一种基于密度的聚类算法。基本上,它将具有足够高密度的区域发展成集群,这些集群将是最大的密度连接点集。

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

如果邻居数大于等于minPoints,则形成一个簇。将起点及其邻居添加到此集群中,并将起点标记为已访问。然后该算法递归地对所有邻居重复评估过程。

如果邻居数量少于minPoints,则将该点标记为noise

如果集群完全扩展(访问范围内的所有点都已访问),则算法继续遍历剩余的未访问点,直到它们被耗尽。

最后将所有标记为噪声的点的集合视为异常值

【讨论】:

  • +1 三西格玛和 IQR 看起来是不错的技术,感谢您富有洞察力的回答。
  • 我喜欢这个简单的建议。基于 IQR 的统计数据的优点是不受会改变均值/标准差的极端异常值的影响。
  • @Anony-Mousse:已修复,谢谢。有趣的是,我第一次在使用 Weka 软件/书籍的机器学习课程中了解了 DBSCAN
  • 是的,Weka 软件和书的使用非常广泛。这就是为什么他们犯了这个错误很遗憾。另外,Weka 中的 DBSCAN 实现真的很糟糕。它的基准测试速度比我的慢 100 倍,甚至比他们的 OPTICS 实现还要慢? OPTICS 应该会慢一些。
  • @Anony-Mousse:如果你愿意并且有时间,你可以将你的实现贡献给 Weka。它是在 GPL 下开源的,不,我与他们没有任何关系:)
【解决方案2】:

您可以使用多种聚类技术来尝试识别数据中的中心趋势。我们在我的模式识别课程中大量使用的这样一种算法是K-Means。这将允许您识别是否存在多个相关数据集,例如bimodal distribution。这确实需要您对预期的集群数量有所了解,但相当高效且易于实施。

在你有了手段之后,你可以尝试找出是否有任何一点与任何手段相距甚远。您可以根据需要定义“远”,但我会推荐 @Amro 的建议作为一个很好的起点。

如需更深入地讨论聚类算法,请参阅wikipedia 关于聚类的条目。

【讨论】:

  • 同意。 K-Means 是解决这个问题的简单、有效和自适应的解决方案。创建两个集群,正确初始化,其中一个集群应包含有意义的数据,而另一个集群则包含异常值。但小心点;如果您没有异常值,那么两个集群都将包含有意义的数据。
  • 这就是有趣的地方。确定集群的数量通常非常困难,并且在实时系统中更难做到。即使在一个真正的集群和另一个异常值集群的情况下,也可以认为异常值开始代表数据的真实模式。我将添加更多链接以提供其他选项。
  • 这让我觉得这个工作的工具是错误的。他主要对肥尾感兴趣,而不是双峰分布。
  • 这取决于提问者的意图,所以我们不能完全确定。如果唯一的目的是评估数据点的异常程度,那么当然可以使用简单的统计数据。但是,如果您想使用“好”数据作为后续函数的输入,那么将点分类为“好”或“坏”(例如,通过 K-means 等)可能是有价值的。 .
  • @Steve 这实际上是错误的。没有理由为什么所有异常值都应该形成一个集群。 K-Means 找到距离其中心的欧几里德距离最小的集群 - 如果异常值均匀分布在集群周围,这将毫无帮助。欧几里得距离源于高斯假设,该假设非常容易受到异常值的影响。不要仅将 K-Means 用于异常值检测。如原作者所述,您可能希望将其用于预处理并在之后使用 3 sigma。
【解决方案3】:

经常使用三西格玛规则和IQR测试,并且有几个简单的算法可以检测异常。

The three-sigma rule is correct
mu  = mean of the data
std = standard deviation of the data
IF abs(x-mu) > 3*std  THEN  x is outlier

IQR 测试应该是:

Q25 = 25th_percentile
Q75 = 75th_percentile
IQR = Q75 - Q25         // inter-quartile range
If x >  Q75  + 1.5 * IQR or  x   < Q25 - 1.5 * IQR THEN  x is a mild outlier
If x >  Q75  + 3.0 * IQR or  x   < Q25 – 3.0 * IQR THEN  x is a extreme outlier

【讨论】:

  • 我刚刚注意到这一点,你是对的,我的 IQR 测试不正确。我会更新我的答案,谢谢。
猜你喜欢
  • 2010-11-18
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多