我正在处理异常分数的时间序列(背景是计算机网络中的异常检测)。每分钟,我都会得到一个异常分数,它告诉我网络的当前状态有多“意外”或异常。分数越高,当前状态越异常。接近 5 的分数在理论上是可能的,但几乎不会发生。
现在我想提出一个算法或公式来自动确定这个异常时间序列的阈值。一旦异常分数超过此阈值,就会触发警报。
下面的频率分布是 1 天内异常时间序列的示例。但是,假设每个异常时间序列都看起来像这样是不安全的。在这个特殊的例子中,像 0.99 分位数这样的异常阈值是有意义的,因为最右边的少数分数可以被视为异常。
和时间序列相同的频率分布(它的范围仅从 0 到 1,因为时间序列中没有更高的异常分数):
不幸的是,频率分布可能有形状,其中 0.99 分位数没有用。下面是一个例子。右尾非常低,因此如果使用 0.99 分位数作为阈值,这可能会导致许多误报。此频率分布似乎不包含异常,因此阈值应位于分布之外,约为 0.25。
总而言之,这两个示例之间的区别在于,第一个似乎表现出异常,而第二个则没有。
从我幼稚的角度来看,算法应该考虑这两种情况:
- 如果频率分布的右尾很大(即几个异常分数),那么 0.99 分位数可能是一个很好的阈值。
- 如果频率分布的右尾很短(即没有异常分数),那么阈值应该位于分布之外。
/edit:也没有基本事实,即可用的标记数据集。因此,该算法对异常分数的性质是“盲目的”。
现在我不确定如何用算法或公式来表达这些观察结果。有没有人建议如何解决这个问题?我希望我的解释是足够的,因为我的统计背景非常有限。
谢谢你的帮助!