时间序列异常检测

机器算法验证 时间序列 Python 变化点 异常检测
2022-03-18 15:50:10

我的任务是开发一个异常检测系统,用于以许多 1D 组织的数据(如果我选择可以超过 1D,但我认为这会使问题更加复杂)每日时间序列。该系列在很大程度上是非季节性的,但它们可能有趋势。我从两个最简单的实现开始,即指数时间加权移动平均线(即 Holt-Winters 方法的 Holt 部分,因为没有季节性)和一个简单的差分序列 Δ(t)= Y(t) – Y(t-1 ) 来检测突然的巨大运动。

最终,我想用一组算法实现一个集成,因为不同的算法处理不同的异常。(例如,在异常之后,SD 太大了,以至于我的第一个算法基本上没用;另一方面,如果有两个连续的异常,第二个算法无法检测到后一个)另外,我不知道是什么异常对最终用户来说更重要,所以如果我有一个允许用户查看结果的集成系统,可以有一个监督学习算法来学习不同算法的相对权重。

我担心的是 1) 我不确定我的两个简单算法是否足够好/足够强大。我查阅了文献,发现更多涉及的统计/概率方法,例如卡尔曼滤波器、ARIMA(我实际上实现了 ARIMA,但迭代到最佳参数在计算上是昂贵的。此外,在 python 中拟合 ARIMA 似乎真的很痛苦 - 需要很长时间,并且给了我很多警告,比如 Fail to Converge,有时它会直接失败,说 MA/AR 系数是不可逆的。因为我有很多时间序列,所以无法通过肉眼目视检查自相关/部分自相关图。但是,如果你有这个问题的解决方案,我肯定愿意尝试)和机器学习算法(如聚类、k-邻居等)。

2)虽然发现附加异常值很重要,但我也有兴趣实施变化检测(例如检测斜坡的存在、均值变化、方差变化等)。谷歌搜索并没有产生太多有希望的结果。对此领域的任何建议将不胜感激。

(顺便使用 Python)

2个回答

几年前,我的团队在 Holt-Winters (HW) 环境中实施了一种脉冲检测算法,这一次具有很强的季节性且没有趋势。

主要思想是寻找时间预测之间的不寻常差异t和实际价值:超出标准数倍的异常值。噪声偏差(从过去的错误估计的标准偏差)。

这篇文章是我们的起点:http ://www.jmlr.org/papers/volume9/li08a/li08a.pdf 。值得一读。但很快我们就意识到,即使全局异常值的想法是可以的,他们的精确想法也不起作用(第 2222 页第 3 点)。

有很多难点。其中之一是一旦冲动开始但未达到“这是冲动”的阈值,HW就已经受到影响。我们使用几何序列来平衡已经受到影响的事实。这行得通,但并不容易,需要做一些工作。

我们还需要处理重复的冲动并实施倒带,因为有时无法在线处理事物,您必须在消除过去的冲动后重新计算过去的事物。

这只是为了冲动。斜坡是另一回事。

我不相信 ARIMA 对这个特定问题会有很大帮助。它更复杂,但通常并不比硬件好。一个问题:不太健壮,这是一个问题,尤其是异常情况。

我建议自己动手,一步一步地尝试,直到它在大多数情况下都有效,一个一个地解决问题。至少,我不知道任何成熟的方法来解决这个问题。

我可以推荐的一种方法是使用他的 EDA 书中的 Tukeys 方法。使用他的平滑算法将时间序列拆分为平滑和粗糙。平滑充当参考水平,粗糙是数据与参考水平的距离。然后对粗糙数据应用箱形图的 Tukey 异常值检测方法,以识别数据何时离平滑数据太远。我使用各种不同版本的平滑,然后将它们组合起来给出结果。您不必将 Tukey 推荐的倍数用于异常值或远值,您可以使用对您的数据有意义的倍数。