V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sgld
V2EX  ›  Python

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

  •  
  •   sgld · 106 天前 · 1696 次点击
    这是一个创建于 106 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近被派了个活,对一些指标进行异常检测并提示。了解了几天相关知识了,有几问题想请教一下大家。

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

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

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

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

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

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

    想问问大家有什么比较好的方法推荐吗。

    18 条回复    2024-09-13 13:34:39 +08:00
    Do1phln
        1
    Do1phln  
       106 天前
    振动类信号之前尝试过转为频谱图,用视觉方法解决,也许有效果
    013231
        2
    013231  
       106 天前
    用滑动窗口算 mean 和 std ,超出 mean ± n * std 就算异常不行吗?
    watry
        3
    watry  
       106 天前
    没怎么实操过,我理解的短期异常检测一般是建立预测模型,然后检查预测结果与实际数据的差值,判断是否超过 N 个标准差
    最简单的高低门限,相当于预测模型输出、标准差都取定值。2L 相当于预测值、标准差取近期测量结果。复杂一点可以用卡尔曼滤波等算法得到预测信号的标准差,来避免你说的陡峭趋势下误触发检测。
    sgld
        4
    sgld  
    OP
       106 天前
    @Do1phln 这样的效率怎么样呢?因为需要处理的确实不少。
    sgld
        5
    sgld  
    OP
       106 天前
    @013231 滑动窗口尝试过,误报率比较大,可能当时没有认真一个个调整窗口的原因,指数滑动方法也尝试过。
    sgld
        6
    sgld  
    OP
       106 天前
    @watry 好的,卡尔曼滤波还没尝试过,我尝试下预处理效果
    Sawyerhou
        7
    Sawyerhou  
       106 天前 via Android
    能不能贴个图?平稳序列检测不出的异常值长啥样子我想不出来

    如果曲线光滑,那 diff 一下再找异常值呢?
    shicheng1993
        8
    shicheng1993  
       106 天前
    在百度听过一个分享,是百度运维团队做异常检测的,还挺受启发

    https://mp.weixin.qq.com/s/9h-hOt630W6k077Rupc9CA
    sgld
        9
    sgld  
    OP
       106 天前
    @Sawyerhou 今天在培训,晚点回去丢。倒不是检测不出,太敏感了。误报率比较高

    也有检测不出的,就是本来一个液位下降,中间有一段水箱之间窜水,斜率变了一点,那个异常确实看起来不像,不考虑那种。
    sgld
        10
    sgld  
    OP
       106 天前
    @shicheng1993 好的好的,我学习一下
    huangyezhufeng
        11
    huangyezhufeng  
       106 天前
    https://datahonor.com/odyssey/aiops/tsad/paper/

    先看看国内外大厂的解决方案吧。如果说 IF 都能抓到很多异常,那么上面列的这些方法大部分都会更好。
    sgld
        12
    sgld  
    OP
       106 天前
    @Sawyerhou 好像没法添加图片 qwq
    append 不行

    目前使用 prophet 尝试了大概 20+个指标(孤立森林的方法并不会放弃,对于点异常还是很好用的)

    问题就是最后面抽,这个预测最后明显是预测出现问题了的,前面拟合都还不错。

    预测大概是 24 个点,训练的数据集大概是 7*24*6 = 1008 个点(不是很多)

    主要是最后的部分出问题了 --- 预测曲线很突兀的下降,趋势非常陡峭,就很奇怪,然后报异常。前面的拟合都很好
    sgld
        13
    sgld  
    OP
       106 天前
    @Sawyerhou

    我传到了图床 --- 限制原因只能拍

    如下所示,前面三张图前面曲线拟合都很不错,最后一段显然是预测出现了异常问题,最后一张则是效果非常好。

    https://smms.app/image/Kt3W4fMBYLs5DHo
    https://smms.app/image/49rGbuEsMqVSYP8
    https://smms.app/image/QY4KleB1rRWOiuL
    https://smms.app/image/QtcTOUvaqwjoMZR

    这里使用的是 prophet ,没有使用参数 growth='logistic'(最后一段会飞,不知道为啥)
    sgld
        14
    sgld  
    OP
       106 天前
    @huangyezhufeng 好的好的,我了解一下,之前都是中文搜索的资料,没有尝试去看 paper
    Sawyerhou
        15
    Sawyerhou  
       106 天前
    @sgld #13 图挺有意思的,感谢分享。

    前面的预测准很正常,曲线光滑没毛刺,预测比较简单。

    后面的预测难也很正常,有尖刺,不光滑,预测难度比较大。
    试试在拟合和预测过程中都删掉异常点,沿用前值?

    比如最后一个图,超过 70 (这个阈值可以动态自适应)的点直接归为异常点,
    训练模型和实时预测过程中都用前值填充。
    Sawyerhou
        16
    Sawyerhou  
       106 天前
    @Sawyerhou #15 曲线结尾处差的远会不会是因为你设置的预测窗口不是 1 。

    比如你想预测未来 5 个点,那最后 5 个点一般都不准,只预测未来 1 个点就没这个问题了。
    sgld
        17
    sgld  
    OP
       106 天前
    @Sawyerhou 我懂你意思了,预测本身就是距离结尾越远越不准,而且我这里没有用 growth='logistic',等于用的是线性那个,最远的话偏差会越大
    所以就把我需要异常检测的点位置靠近模型训练的点结束位置靠近一些比较好。

    关于最后一个图那个前值填充那边,应该是不需要的,那个些突出来的本身就是异常点,需要检测异常然后报警提醒。
    7d6a4
        18
    7d6a4  
       105 天前
    - IQR 统计路子(类似 mean std 考虑中心趋势的偏离度 及异常事件不常发生的假设) <=Q1-1.5IQR && >= Q3+1.5IQR
    > 甚至可以用 Median+MAD 浮动的 mean+std 替代 也可以参考下布林通道的上下轨
    - 时频分析那一套 找几个频域分析的 demo 试试
    - 异常检测其实可以看成分类或者定位问题 当然预测的路子也不是不行
    - fashion 一点的 matrix profile 等等 需要追踪研究论文
    > 建议从高质量综述开始 关键词 time series anomaly detection
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2690 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:53 · PVG 20:53 · LAX 04:53 · JFK 07:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.