《异常检测——从经典算法到深度学习》29 EasyTSAD: 用于时间序列异常检测模型的工业级基准

《异常检测------从经典算法到深度学习》

相关:

29. EasyTSAD: 用于时间序列异常检测模型的工业级基准

论文名称:UNRAVEL ANOMALIES: AN END-TO-END SEASONAL-TREND DECOMPOSITION APPROACH FOR TIME SERIES ANOMALY DETECTION

会议期刊:目前还未发表,

论文地址:arxiv | 阿里云盘

源码地址:https://github.com/dawnvince/EasyTSAD

29.1 论文内容概述

这篇论文介绍了一个名为TimeSeriesBench的综合基准测试平台,用于评估单变量时间序列异常检测模型。

主要贡献:

  • 在线排行榜:论文介绍了第一个时间序列异常检测算法的在线排行榜,从多个维度(如训练、推理、评估和数据集)增强了现有的评估框架。这帮助行业专家选择最佳的学术算法,并提供了工业级的评估方法。

  • 最先进方法的评估:使用TimeSeriesBench评估了多种知名的最先进(SOTA)异常检测方法。结果提供了新的见解和未来优化的方向。

  • EasyTSAD工具包:开发并发布了名为EasyTSAD的全面评估工具包,该工具包使用Python构建,提供了数据处理、模型训练和评估的一站式解决方案。该工具包是开源的,旨在加速现有异常检测算法的优化。

  • 精确的异常标注:为了解决现有公共数据集中异常标注不准确的问题,作者与一家全球公司合作,精细标注了在线系统中的异常。这些数据集作为TimeSeriesBench的一部分公开提供。

29.2 论文核心方法

29.2.1 banchmark 概述

工业级问题和TimeSeriesBench关于基准单变量时间序列异常检测算法的解决方案。

如图所示,从上往下看:

  • 首先完成 offline training 离线训练,这个过程中需要解决的是当前学习模式的负载问题,包括存储负载与维护的成本;而本论文提出的 benchmark 的解决方案是提 出学习模式分类法集成成本友好型学习模式。
  • 其次在线检测过程,这个过程中需要解决的是原算法在全新服务/系统上的表现没有可以提及。本论文的解决方案是集成零样本模式以评估模型在不可见序列上的性能。
  • 最后需要对算法的效果进行评估,需要解决的问题是现有评估指标的假设与实际需求脱节,本论文的解决方法是在实践原则指导下修订评价标准(在后面的内容中会提到基于best f1-score 以及基于事件发生的评估方法等)。

然后图片的右边进行了一个包裹操作,大概的意思就是,前面提到的所有,都可以在我这里(TimeSeriesBench)解决。

29.2.2 异常类型

前言、背景、动机我们统统跳过了,真的看麻了。

不过这里作者对异常类型的概述可以参考一下。

根据行为驱动的分类法,异常类型可以粗略地分为 点异常(Point-wise)模式异常(Pattern-wise)(图2)。 点异常指的是在单个时间点或非常短的时间内出现的峰值或故障等意外事件时间段。模式异常值表示跨越特定时间范围的异常子序列,通常表现为数据中的不协调或不一致。

29.2.3 学习模式(learning schema)

这里需要注意作者概述的几个重要的概念,这些对于后面源码解析、配置参数关系密切。

朴素模型(Naive schema)。在这种模式下,我们输入一个时间序列用于训练/拟合模型,并且专门使用训练好的检测器在该特定序列上进行在线检测。直观地说,这使得模型能够根据足够的数据对时间模式做出更精确的描述。然而值得注意的是,单个序列的数据量往往不足。

一体化架构(All-in-one schema)。在这种模式下,仅使用数据集中的所有序列训练一个统一的模型实例,然后在数据集的所有序列中实时应用该模型进行异常检测。这种架构使模型能够接触各种系列中嵌入的更多模式,从而为模型提供了额外的机会来学习时间序列之间的共同且固有的特征。然而,由于不同系列对异常的定义不同,这可能会导致在线检测异常时(即特定曲线中存在的异常不一定被视为其他曲线中的异常)模型被相互矛盾的信息所混淆。一些新的方法已经采用了这种受实际需求驱动的架构。

零样本架构(Zero-shot schema)。在零样本模式下,整个数据集被分成两个不相交的子集。一个子集用于模型训练,另一个用于评估检测性能。这种架构是在实际考虑的基础上设计出来的。具体来说,它处理了这样一个情况:系统在没有历史数据的情况下新部署,并且需要一个健壮且适应性强的模型来穿越这个差距。这要求模型具有更高的能力来捕捉时间序列的内在表示。

29.2.4 评价标准

论文中提出的评估标准主要是针对实时异常检测需求。这个与我们前面提到的 Bagel,Donut,LOF-VAE 是一致的,需要考虑检测延迟等,也就是我们前面提到过的 best F1-score 的计算法和准许 delay 的方法。

此外还有基于事件 event-wise 的评估方法,这个值得小伙伴们研究研究,如上图所示,如果一个 event 发生后,仅仅提供1个异常点,那么我们可以认为这个是突刺,但是如果出现多个连续的异常,我们可以认为这是一个事件event。在实际需求中,通常情况下我们也会更加关注 event-wise 的评估方法。我们可以认为异常发生,会带有一定长度的影响范围,而event-wise 就是指这种情况。

29.2.5 算法效果比较

这里我们主要需要知道两方面内容:

  • 本benchmark给小伙伴们实现了很多算法
  • 如果你们有新的算法,可以基于本benchmark直接评估

当然,还有一层还有就是,小伙伴们引用本benchmark记得在reference中明确指出。

这里我们不做介绍,感兴趣的小伙伴们可以下载源码,跑一下这些实验。

当然,也可以基于这个benchmark开发自己的算法,跑完所有的实验后记得发一篇论文,然后也贴出这样的表格,表示自己的算法也很优秀。

29.3 源码阅读

前往 https://github.com/dawnvince/EasyTSAD 可以查看源码内容。这里我不关注计算细节,主要希望通过其中某一两个算法介绍整个benchmark的运行流程。

我们这里选中的是 AR 算法。

29.3.1 环境准备

首先将源码 clone 到本地,并且前往 https://github.com/CSTCloudOps/datasets 克隆数据集到我们的项目中,最后的目录文件如下:

解下安装相关依赖

首先需要安装 toml ,避免出现 No module named 'toml' 这样的错误提示。

bash 复制代码
$ pip install toml

同样地,需要安装 poetry

bash 复制代码
$ pip install poetry

安装完成以后,我们需要使用 poetry 安装相关依赖到虚拟环境中。

bash 复制代码
$ poetry install

接着点击运行 Examples/run_baseline/run.py 还是报错如下:

这个是因为找不到 datasets 目录导致的。需要修改如图所示的目录

建议使用绝对路径,并注释掉后面一部分代码(用于指定特别数据集的指定KPI),如下图所示:

如果还提示别的缺包,使用 pip install 命令安装即可,最终执行效果大概如下:

执行的过程中,可以使用 nvidia-smi 命令查看 GPU 显存使用情况。

最后输出结果大概如下:

可以查看结果文件中的评分,以及基于事件识别的绘图等等,具体内容请自行了解。

29.4 基于 benchmark 研发自己的算法

这部分内容请参考 https://github.com/dawnvince/EasyTSAD/tree/main 的 README 内容,按照步骤逐个完成即可。比如准备数据,编辑配置文件,编写自己方法的主要类,继承于 BaseMethod 类等。

其他参考内容包括:

也可以考虑直接在AR的基础上进行修改,然后完成自己的模型结构开发,优化过程开发等等。

此外,需要注意的是,作者对原始数据的缺失点都进行了填充,所以如果小伙伴们的算法需要关注 "由于缺失引起的异常" 的话,请不要使用这个 benchmark。

其他一些配置细节这里不再重复介绍,需要根据需要结合文档进行调整。

29.5 总结

前面在第24章的时候,提到过 benchmark 的作用,也提到过需要发paper的小伙伴们可以考虑这方面的工作,另外开辟一条赛道,个人认为这篇论文就是一个很好的例子,尽管目前还没有正式发表,但总体而言这篇论文还是很值得研究学习。

这篇论文在提供一个全面且实际的评估平台方面做出了重要贡献,其提出的多样化数据集、新评估标准和多种学习模式为时间序列异常检测的研究和应用提供了宝贵的资源和指导。

最后我们总结一下这篇论文值得参考的地方:

  • 项目开源。小伙伴们可以基于这个开源的项目学习不同的算法实现,比如 Donut 等;(个人认为这个是最重要的,尤其是对于不太会动手写代码的小伙伴们来说,先有个模板用于学习非常重要)
  • 新的评估方法(有些方法已经提过),相关方法的实现也便于我们使用。比如我们可以基于某个评估指标来评估自己的算法,并且要注意 "自圆其说",比如我提出 "xxx" 算法,这个算法主要是针对 "event" 类的异常检测,然后再解释为什么自己的算法在这方面表现好等等。
  • 多种学习模式。包括零样本学习和全样本学习,以模拟不同的实际应用环境。这对于研究在不同数据可用性条件下模型的性能具有重要意义。
  • 数据集的多样性。TimeSeriesBench使用了多种数据集,涵盖了广泛的应用场景。这些数据集来源于不同的行业和应用,具有很高的多样性和代表性,有助于评估模型在不同环境下的泛化能力。
  • 工业级基准测试框架。该论文提出的TimeSeriesBench是一个工业级的基准测试平台,涵盖了多种实际应用场景。这为研究人员提供了一个统一的评估标准,可以帮助他们在更真实的环境中测试和比较各种算法的性能。

希望能帮到各位小伙伴 ~ 万分感谢各位的点赞、评论与关注支持 ~

Smileyan

2024.05.31 23:24

相关推荐
总裁余(余登武)2 分钟前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
Eric.Lee202114 分钟前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样
大神薯条老师15 分钟前
Python从入门到高手5.1节-Python简单数据类型
爬虫·python·深度学习·机器学习·数据分析
爱喝白开水a16 分钟前
关于大模型在企业生产环境中的独立部署问题
人工智能·深度学习·llm·大语言模型·ai大模型·计算机技术·本地部署大模型
huapiaoy36 分钟前
Redis中数据类型的使用(hash和list)
redis·算法·哈希算法
冷白白1 小时前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
鹤上听雷1 小时前
【AGC005D】~K Perm Counting(计数抽象成图)
算法
一叶祇秋1 小时前
Leetcode - 周赛417
算法·leetcode·职场和发展
Landy_Jay1 小时前
深度学习:基于MindSpore实现CycleGAN壁画修复
人工智能·深度学习
武昌库里写JAVA1 小时前
【Java】Java面试题笔试
c语言·开发语言·数据结构·算法·二维数组