自动确定阈值以进行异常检测


9

我正在处理时间序列的异常分数(背景是计算机网络中的异常检测)。每分钟,我都会得到一个异常分数,它告诉我网络的当前状态有多么“意外”或异常。分数越高,当前状态越异常。理论上接近5分是可能的,但几乎不会发生。xt[0,5]

现在,我想提出一种算法或公式,该算法或公式可以自动确定此异常时间序列的阈值。一旦异常分数超过此阈值,就会触发警报。

下面的频率分布是一个超过1天的异常时间序列的示例。然而,这是不是安全的假设,每一个异常的时间序列是要像她那样。在此特殊示例中,异常阈值(例如.99分位数)将是有意义的,因为最右边的分数可被视为异常。

在此处输入图片说明

并且具有与时间序列相同的频率分布(由于时间序列中没有更高的异常分数,因此它的范围从0到1):

时间序列

不幸的是,频率分布可能具有一定的形状,其中.99分位数无效。下面是一个示例。右尾非常低,因此,如果将.99分位数用作阈值,则可能会导致许多误报。该频率分布似乎不包含异常,因此阈值应位于0.25左右的分布范围之外。

在此处输入图片说明

总结起来,这两个示例之间的区别在于第一个示例似乎表现出异常,而第二个则没有。

从我幼稚的角度来看,该算法应考虑以下两种情况:

  • 如果频率分布具有较大的右尾(即几个异常分数),则.99分位数可能是一个很好的阈值。
  • 如果频率分布的右尾非常短(即没有异常分数),则阈值应位于分布之外。

/ edit:也没有基本事实,即可以使用带标签的数据集。因此,该算法针对异常得分的性质是“盲目的”。

现在,我不确定如何用算法或公式来表达这些观察结果。有人建议如何解决这个问题吗?我希望我的解释足够充分,因为我的统计背景非常有限。

谢谢你的帮助!


请注意,第一张图对我而言似乎并不正常。
mpiktas,2011年

1
@cryptron,关键问题是什么是声音阈值。例如,如果每个升高的警报和未升高的警报都产生一定的成本,则可以选择阈值以使总成本最小化。为此,我们需要成本数据。没有准确的声音定义,就无法衡量如何评估选择阈值的方法。
mpiktas,2011年

@mpiktas:我必须承认,在这种情况下,“声音”一词很不幸,因为我无法严格评估阈值(因此,我将其删除了)。基本上,该阈值应该使误报率最小化,因为在网络异常检测中,误报率比误报率昂贵得多。
cryptron 2011年

@cryptron,您是否有任何关于误报的数据?
mpiktas,2011年

1
我对你的阴谋感到困惑。这是一个单变量时间序列,取值?还是应该为?(通过在第一个图中查看x轴)。跟踪图也将更有帮助。例如,您是否在持续的时间段内或短时间内(或同时)获得高分?如果两者兼而有之,那么一个人比另一个人更麻烦吗?如果您可以为数据建立一个合理的模型,则可以使用拟合分布中的理论分位数,这将解决您在样本分位数中发现的问题。{xt}0<xt50<xt0.5
JMS

Answers:


2

您可能会发现本文感兴趣。另请参阅West&Harrison中类似模型的更详细介绍。还有这种监视的其他示例,其中许多是最近的,但这不完全是我的操舵手:)。毫无疑问,这些模型有合适的实现,但我不知道它们可能会派上用场...

基本思想是您拥有一个交换模型,其中某些观测值/观测值序列归因于异常的网络状态,而其余观测值被认为是正常的。这样的混合可能会导致您的第一个情节中的右尾较长。动态模型还可以通过将高概率分配给属于问题状态的新观察值,来实时提醒您(例如)在8:00和4:00出现异常跳变。它也可以很容易地扩展到包括预测变量,周期性成分(也许您的分数随活动而增/减)之类的东西。

编辑:我还应该补充一点,这种模型是“无监督的”,即通过显示较大的均值漂移或方差增加来捕获异常。收集数据时,可以通过提供更多有用的先验分布来改进模型。但是,也许一旦您有了足够的数据(以及通过处理网络问题来之不易的培训示例!),您就可以设计一些简单的监视规则(阈值等)


1

您是否有任何异常现象的“贴标”示例?即与网络故障或类似问题相关的值?

您可能会考虑应用的一个想法是ROC曲线,该曲线对于选择满足特定条件的阈值非常有用,例如最大化真实正数或最小化虚假负数。

当然,要使用ROC曲线,您需要以某种方式标记数据。


1
不幸的是,我没有标签数据集。仅假设长尾或离群值指示数据集中存在异常。
cryptron

@cryptron我明白了。因此,您需要的是一种动态识别异常值的方法。
Zach

可以解决部分问题,是的。
cryptron

1

“原始系列”的图不必显示任何预定的结构。至关重要的是,“来自适当模型系列的残差”的图必须显示出高斯结构。这种“高斯结构”通常可以通过合并以下“变换”中的一个或多个来获得:1. Arima模型2.调整局部水平移动或局部时间趋势或季节性脉冲或普通脉冲3.利用已证明的方差异质性进行加权分析4.可能的功率变换(对数等),以处理特定的方差异质性。5.检测模型/参数可能已更改的时间点。

干预检测将提供有关最近事件的统计显着性的陈述,表明正常或异常


0

在OP对我之前的回答的答复中,他已经将自己的数据发布到了网络上。每小时60次读数,持续24天,持续6天。由于这是时间序列,因此诸如DBSCAN之类的横截面工具具有有限的相关性,因为数据具有时间依赖性。有了这样的数据,通常会寻找小时内和日内结构。除了这些类型的结构之外,人们还可以使用已被充分证明的方法来进行异常的检测,该异常可以是仅一次(脉冲)或本质上是系统性的(电平移位)(请参见Tsay,Tiao,Chen等的文献。这些过程产生了以下“异常”。请注意,电平转换本质上暗示了单独的“簇”。 最常见的异常

                                HOUR/MINUTE     TIME

-1

在我的一个朋友向我指出了聚类算法的方向后,我偶然发现了DBSCAN,它根据两个预定义的参数在n维空间中构建了聚类。基本思想是基于密度的聚类,即密集区域形成聚类。离群值由算法分别返回。因此,当应用于我的一维直方图时,DBSCAN能够告诉我,我的异常分数是否存在任何异常值。注意:在DBSCAN中,离群值只是一个不属于任何群集的点。在正常操作期间,我希望该算法仅产生一个群集(没有异常值)。

经过一些实验,我发现参数 ϵ0.1效果很好。这意味着,点必须与“正常”群集的距离至少为0.1,才能被视为离群值。

在能够识别异常值之后,找到阈值可以归结为简单的规则,例如:

  • 如果集合显示异常值,请在“正常”和“异常值”群集之间设置阈值,以使两者的余量最大化。
  • 如果集合没有任何异常值,则将阈值设置为离最右边的点一个标准偏差。

无论如何,感谢所有有用的回复!


@crypton DBSCAN如何处理自相关系列。例如,时间序列1,9,1,9,1,9,5将具有一个内在/异常值。它处理系列中的水平转换或许多可能的趋势吗?它如何处理季节性自回归数据,而不是说每个月的6月是“常规”序列,而每个6月是“大”序列。是否将“六月大数值”检测为离群值?只是好奇 !
IrishStat

2
@IrishStat基本上,DBSCAN将点聚集在n维空间中。因此,它对时间序列分析的适用性非常有限。它适用于我的特殊情况,因为我期望我的(一维)直方图中只有一个聚类。回答您的问题:使用适当的参数时,示例值5将被检测为异常值。我想它可以处理趋势,但是在时间序列“ 1、2、3、4、5、6、7、2”中,值2不会被视为离群值!希望对DBSCAN的功能和局限性有个大概的了解。
cryptron

1
@crypton感谢您的信息。在我看来,当您提到1个群集时,您的意思是1,而平均值只有1。即使您的数据中的平均自相关没有变化,它也会呈现“时间序列”,这表明DBSCAN可能不如您认为的那样有用,因为它可以将信号与噪声分离,从而有效地识别不均匀数据。
IrishStat

1
@crypton在我看来,与一个具有1,1,1,1,2,2,2,2,2的时间序列相比,一个群集意味着1个平均值,这些值附近有一些小偏差。
IrishStat

2
@crpton我认为您正在使用横​​截面工具来解决时间序列问题。发布实际数据,我将尝试通过时间序列分析向您演示异常检测
IrishStat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.