时间序列进行异常检测(通过近 24h 数据) Python

sgld · 2024-9-12 11:38:01 · 109 次点击
最近被派了个活,对一些指标进行异常检测并提示。了解了几天相关知识了,有几问题想请教一下大家。

数据特点 --- 需要检测的数据指标非常多,1k+ ,好消息就是大多数指标都比较类似 --- 时序图同一类型长的差不多
(实在太多了再找人筛点)

对于点异常的判断,考虑的是使用孤立森林。
一段时间内比较正常的数据作为模型建立的基础数据集。每隔一段时间(1h?)采集过去 24h 内所有的点,将两个数据集合并在一起,看看这 24 个小时里面有没有异常点。
尝试了一下,预测效果还算 ok ,那种明显突出的都能抓到。 --- 我理解这就是动态阈值(参数又多,人工定阈值太难了)


难点是时间序列 --- 设备指标变化趋势有没有问题。比如本来是周期性的,其中一块突然异常波动一下,但是没超过阈值。比如液位、温度

长期趋势的异常检测 --- 直接使用 prophet 了,尝试了几个指标拟合曲线好像还行。
prophet 适用于长时间的,强季节性的数据,而且对于调参来说也比较简单。但是要求就是数据量要大,时间跨度也不能很短。


我想询问大家,对于短时间(一周或者一天 24h )的异常检测,应该怎么做呢?
对于比较平稳的时间序列,我想的是使用 ARMA ,然后通过残差和设置阈值进行对比,判定异常。
比如根据一周的数据(采样频率 30min)进行 fit ,预测过去 2h 数据,通过和实际数据的对比,进行判断。

但是 pq 的选择还得慢慢调,同时,对于一些比较陡峭的趋势,预测之间就飞了。。。。



想问问大家有什么比较好的方法推荐吗。
举报· 109 次点击
登录 注册 站外分享
6 条回复  
Do1phln 小成 2024-9-12 11:52:27
振动类信号之前尝试过转为频谱图,用视觉方法解决,也许有效果
013231 小成 2024-9-12 13:34:01
用滑动窗口算 mean 和 std ,超出 mean ± n * std 就算异常不行吗?
watry 小成 2024-9-12 14:04:52
没怎么实操过,我理解的短期异常检测一般是建立预测模型,然后检查预测结果与实际数据的差值,判断是否超过 N 个标准差
最简单的高低门限,相当于预测模型输出、标准差都取定值。2L 相当于预测值、标准差取近期测量结果。复杂一点可以用卡尔曼滤波等算法得到预测信号的标准差,来避免你说的陡峭趋势下误触发检测。
Sawyerhou 小成 2024-9-12 14:21:47
能不能贴个图?平稳序列检测不出的异常值长啥样子我想不出来

如果曲线光滑,那 diff 一下再找异常值呢?
shicheng1993 小成 2024-9-12 14:52:08
在百度听过一个分享,是百度运维团队做异常检测的,还挺受启发

https://mp.weixin.qq.com/s/9h-hOt630W6k077Rupc9CA
huangyezhufeng 小成 2024-9-12 15:08:10
https://datahonor.com/odyssey/aiops/tsad/paper/

先看看国内外大厂的解决方案吧。如果说 IF 都能抓到很多异常,那么上面列的这些方法大部分都会更好。
返回顶部