KDD Cup 2021:异常检测Baseline思路

独家号 极客精选 原文链接

序列周期类型

本次赛题的数据为时序数据,需要选手完成具体的异常点定位。在进行实践之前,可以根据序列的波动情况完成类型的划分。

主要可以分为:周期型序列、稳定型序列、不稳定型序列


其中稳定型序列检测比较简单,可以根据波动情况进行检测。不稳定型序列简单难度较高。

在本次比赛中赛题数据大部分都为周期型序列,需要我们检测得到异常点。

针对周期型序列首先可以完成周期的识别,有助于后续的识别过程。可以通过滑动平均+周期分解得到序列的周期性。

基础思路

在完成序列类型的识别后,进一步可以对异常点的类型进行划分。在本次赛题中异常可以分为:单点异常、上下文异常和集合异常两种情况。

对于上下文异常,可以通过窗口内均值和周期均值进行识别。对于集合异常可以根据周期波动性进行识别。

下图是赛题中数据异常数据的一些案例。

👆集合异常,通过波动性可以判断

👆周期异常,周期性可以判断

👆单点异常,通过滑动平均可以判断

👆集合异常,通过周期波动性可以判断

其他算法

时序异常检测算法非常多,这里可以列举一些进行尝试:

  • ARIMA
  • 基于K-Means检测
  • 基于序列建模型的RNN、LSTM
  • Local Outlier Factor
  • One-Class SVM
  • Deep-SVDD

这里我推荐可以尝试使用序列建模的方法,

  • 步骤1:RNN模型训练数据自监督训练
  • 步骤2:在训练过程中随机加入“异常点”
  • 步骤2:预测结果与数据进行比较

https://github.com/khundman/telemanom

最后根据预测结果的差异性完成异常判断。整个训练训练可控,RNN模型也可以识别到序列的周期性。

另外也可以尝试尝试Deep-SVDD对数据进行映射,并根据距离完成异常检测。

进阶思路

由于赛题数据包含多个数据集,多种时序数据。因此赛题思路可以考虑根据时序数据分开进行处理:

  1. 优先识别周期稳定的序列,此种情况下异常稍微比较容易识别。
  2. 对周期不稳定的序列,可以考虑从周期性和波动性进行识别。

由于赛题给定了无异常的序列和只包含一个或一段段异常,所以可以考虑从数据入手。如何充分利用赛题数据就是赛题的关键。当然如果占用窗口和波动性判断,也可以有一定分数。

赛题资料

  • 华为KIP异常检测一等奖方案(规则+树模型),https://www.cnblogs.com/huaweiyun/p/14240075.html
  • 华为KPI异常检测二等奖方案(Deep-SVDD模型),https://zhuanlan.zhihu.com/p/330603707
  • One Class SVM,https://www.cnblogs.com/wj-1314/p/10701708.html
  • Anomaly Detection in Univariate Time-series: A Survey on the State-of-the-Art
  • https://iwringer.wordpress.com/2015/11/17/anomaly-detection-concepts-and-techniques/

我是东哥,最近正在原创👉「pandas100个骚操作」系列话题,欢迎订阅。订阅后,文章更新可第一时间推送至订阅号,每篇都不错过。

最后给大家分享《100本Python电子书》,包括Python编程技巧、数据分析、爬虫、Web开发、机器学习、深度学习。

现在免费分享出来,有需要的读者可以下载学习,在下面的公众号「GitHuboy」里回复关键字:Python,就行。

开发者头条

程序员分享平台