同样摘自知乎的回答:https://www.zhihu.com/question/29507442/answer/1212624591?utm_id=0
正巧之前做过时间序列的异常检测项目,这里介绍几种尝试过的方法,也算是抛砖引玉吧,欢迎大家讨论交流~
背景与定义
时间序列异常检测的目的就是在时间序列中寻找不符合常见规律的异常点,无论是在学术界还是工业界这都是一个非常重要的问题。
应用十分广泛,这里拿"智能运维"场景的异常检测应用举例。企业的运维场景中有海量的运维指标数据,如果单纯依靠人力来发现并定位异常,将是十分低效的,所以如果可以开发一个智能运维系统对于异常波动自动定位,将会提高运维效率。
课题背景与应用举例
现有方法
现有方法可以分为以下四类:
- 统计方法--通过历史同期的数据分布来确定当前数据的合理波动范围。例如,k-sigma方法。
- 预测方法--比较预测值与真实值的差异,超出阈值认为是异常点。
- 直接异常检测方法--有很多成熟算法,例如LOF,孤立森林,One-class SVM。
- 深度学习生成方法--对数据降维再升维重构,不能良好复原的点认为是异常点。例如GAN,VAE。
现有方法及优缺点
现有的方法在时间序列数据中也许直接使用效果不好,这一点我们接下来的实验也能看出。
尝试的方法
--统计方法
异常检测工具包(ADTK)是一个Python软件包,用于无监督/基于规则的时间序列异常检测。无需基于训练+测试范式,本方法具有极低的时间成本。基本思想是基于历史数据的统计,按照分位数或者阈值或者统计检验的方法来判断当前点是否异常。
ADTK实验效果
实验效果:模型倾向于把过多的点识别成异常值点。
--直接异常检测
这种方法成熟的方法较多,大家可以参照Python的pyod软件包。
One-class SVM实验效果
实验效果:时间序列正常的波动的高峰和低谷被判断为异常,没有充分利用时间维度的信息。
--预测+统计方法(Prophet+3-sigma)
**总体思路:**如果数据超出了预测值的合理的波动范围,认为是异常。
总体思路示意图
预测方法采用Prophet实现,3-sigma可以借助历史的波动数据来估计,例如我们将时间往前推数周,得到间隔不同周的同一时刻的数据;将时间往前推1~7天,得到同一周内不同天的同一时刻的数值。计算这些数值的标准差,作为sigma的估计。在Prophet的预测上下界的基础上分别加上和减去3-sigma得到数据波动的合理范围,超出范围用异常标注。
Prophet+3-sigma实验效果
实验效果:考虑了时间维度的相关性,准确、高效。
--预测+直接异常检测的方法
去除时间序列的趋势和周期性。用预测模型给出的预测值与真实值相减计算序列的残差,残差不包含周期性和趋势性,可以用作后续的异常检测。
框架示意图
当然为了提升模型的稳定性,我们可以在预测步骤采取多种预测方法,检测部分我们也可以用到pyod里面提供的多种方法,最终投票决定最终的结果。
模型集成
异常检测部分的11个模型介绍
实验效果
实验效果:较好。
--深度学习生成模型
这里我们尝试了LSTM-AE的方法,效果不错。
总体思路:将高维数据压缩至某一个特定维度大小,再还原至与原始数据同样的维度。训练模型使得复原数据和原数据差距尽可能小。不能良好复原的点被认为是异常点。
LSTM-AE示意图
实验效果
总结
第3、4、5模型效果较好,对于时间序列检测问题可以尝试。
注:实验结果并非答主一人完成,也感谢当时一起参与项目的小伙伴~此为原创内容,转载请注明原文链接~