好久没更新了,记录一下近两年研究的一套算法吧,只讲讲方法部分,细节再更新吧。
时序数据的异常检测我一般分成两类,单信号和多信号。
单信号
对于一条数据的异常检测,我划分成两类,与时序无关和与时序相关。
与时序无关
指的是单看信号即可完成异常的判断。这块主要方法就是数据质量监控。一般会加入时间窗平滑,如有必要还需对时间窗内分配权重。
- 检测异常值或空置出现的频率随时间的变化;
- 检测超过阈值数据的严重度和频率随时间的变化。
与时序相关
指的是信号会随时间发生分布的改变。这块主要就是建立信号与时间的数学模型,监控模型的变化情况。(一般异常检测并不包含老化,所以会加入一个衰减系数)
多信号
多信号是异常检测的难点,一般是对某一系统或系统的组合进行监控。难点主要在于特征的选择,分清哪些参数是主因,哪些只是分布近似但毫无关联。
能做的前提条件要有异常数据,需要多少异常数据取决于系统的复杂程度。
在拿到数据后,首先找相关业务做功课,缩小参数的选择空间。(并不是指以外的参数无用,只是作为初始化更加高效并有物理模型支撑)没有相关数据那就自己根据九年义务教育的知识找两个靠谱的参数开始也行。
写程序读数据,几个特征各种可视化先看一遍,要做到完全清楚这个特征是怎么分布或怎样变化的。(特别容易忽略的一步,但特别重要,磨刀不误砍柴工)
把数据根据异常时间分为三个部分,异常前,异常中,异常后。查看各参数在这三个阶段的变化情况,再加上时序看,最后两两结合看数学模型的变化。精简到用最少的特征在不同阶段表现出差异。
替换这些特征,找到差异最大化的一组参数。
最后加入无异常数据,增加新特征,以降低误报率同时保持精确度不下降太多。
以上步骤完成了特征的选择,根据这些特征,可以做出一个指标(算法核心自己根据数据调整),对单信号的异常监控就ok了。