异常检测的自动阈值确定

机器算法验证 时间序列 异常值 临界点
2022-02-28 23:35:03

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

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

下面的频率分布是 1 天内异常时间序列的示例。但是,假设每个异常时间序列都看起来像这样是不安全的在这个特殊的例子中,像 0.99 分位数这样的异常阈值是有意义的,因为最右边的少数分数可以被视为异常。

在此处输入图像描述

和时间序列相同的频率分布(它的范围仅从 0 到 1,因为时间序列中没有更高的异常分数):

时间序列

不幸的是,频率分布可能有形状,其中 0.99 分位数没有用下面是一个例子。右尾非常低,因此如果使用 0.99 分位数作为阈值,这可能会导致许多误报。此频率分布似乎不包含异常,因此阈值应位于分布之外,约为 0.25。

在此处输入图像描述

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

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

  • 如果频率分布的右尾很大(即几个异常分数),那么 0.99 分位数可能是一个很好的阈值。
  • 如果频率分布的右尾很短(即没有异常分数),那么阈值应该位于分布之外。

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

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

谢谢你的帮助!

4个回答

你可能会发现这篇论文很有趣。另请参阅West & Harrison中对类似模型的更详细介绍还有其他这种监控的例子,很多都是最近的,但这不完全是我的驾驶室:)。毫无疑问,这些模型有合适的实现,但我不知道它们可能是什么……

基本思想是你有一个切换模型,其中一些观察/观察序列归因于异常的网络状态,而其余的则被认为是正常的。像这样的混合物可以解释你的第一个情节中的长右尾。动态模型还可以通过为属于问题状态的新观察分配高概率来实时提醒您异常跳跃,例如在 8:00 和 4:00。它也可以很容易地扩展到包括预测变量、周期性分量(也许你的分数随着活动而上升/下降)等等。

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

您是否有任何构成异常的“标记”示例?即与网络故障相关的值,或类似的东西?

您可能考虑应用的一个想法是 ROC 曲线,它对于选择满足特定标准的阈值很有用,例如最大化真阳性或最小化假阴性。

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

“原始系列”的图形不必展示任何预定义的结构。关键是“合适模型系列的残差”图需要展示高斯结构。这种“高斯结构”通常可以通过合并以下一个或多个“变换”来获得 1. arima 模型 2. 对局部电平偏移或局部时间趋势或季节性脉冲或普通脉冲的调整 3. 利用已证明的方差异质性的加权分析4. 处理特定方差异质性的可能功率变换(对数等) 5. 检测模型/参数可能发生变化的时间点。

干预检测将产生关于最近事件的统计意义的陈述,表明正常或异常

在 OP 对我之前的回答的回应中,他已将他的数据发布到网络上。每小时 60 个读数,持续 24 小时,持续 6 天由于这是时间序列横截面工具,如 DBSCAN,其相关性有限,因为数据具有时间依赖性。对于这样的数据,通常会寻找小时内和日内结构。除了这些类型的结构之外,人们还可以使用有据可查的方法(参见 Tsay、Tiao、Chen 等人的文献)来检测异常,这些异常可以是一次性的(脉冲)或本质上是系统的(电平转换)。 al.) 这些程序产生了以下“异常”。请注意,电平转换本质上暗示着单独的“集群”。最高识别的异常

                                HOUR/MINUTE     TIME