时序数据异常检测算法简述与分类

摘要:异常检测是目前时序数据分析最成熟的应用之一,有效的异常检测被广泛用于现实世界的很多领域,例如量化交易,网络安全检测、自动驾驶汽车和大型工业设备的日常维护。本文主要对目前主流的异常检测算法进行汇总并将其分为基于统计的异常检测、基于预测的异常检测等类别,介绍各自的优缺点并寻找适合时序数据的异常检测算法。

关键词:异常检测,时序数据分析

 

1 引言

    异常检测是目前时序数据分析最成熟的应用之一,有效的异常检测被广泛用于现实世界的很多领域,例如量化交易,网络安全检测、自动驾驶汽车和大型工业设备的日常维护。本文主要对目前主流的异常检测算法进行汇总并将其分为基于统计的异常检测、基于预测的异常检测等类别,介绍各自的优缺点并寻找适合时序数据的异常检测算法。
 

1.1 异常类型

    异常大致分为三种类型:点异常、上下文异常和集合异常。它们常见的表现形式如下:
(1)点异常:离群点、孤立点、异常值;
(2)上下文异常:值无异常,但在上下文环境中呈现异常(如时序数据);
(3)集合异常:单点无异常,但子集相对于全集呈现异常;

 

2 异常检测算法类别

    现有的异常检测算法大致可以分为以下四类:
(1)基于统计的异常检测算法:通过历史同期的数据分布来确定当前数据的合理波动范围。例如基于3σ准则的异常检测算法。
(2)基于预测的传统异常检测算法:比较预测值与真实值的差异,超出阈值则认为是异常点,例如ARIMA、指数平滑法。
(3)直接异常检测算法:如LOF、孤立森林、One-class SVM算法等。
(4)基于深度学习的异常检测算法:对数据降维再升维重构,不能良好复原的点认为是异常点。例如基于GAN,自编码器,变分自编码器等的异常检测算法。

 

2.1 基于统计的异常检测算法

1.  基于3σ准则的异常检测算法
    借助正态分布的优良性质,3σ准则常用来判定数据是否异常。由于正态分布关于均值μ对称,且数值分布在(μ-σ,u+σ)中的概率为0.6827,数值分布在(μ-3σ,u+3σ)中的概率为0.9973。即只有0.3%的数据会落在均值的±3σ之外,这是一个小概率事件。为了避免极端值影响到模型整体的鲁棒性,常将其判定为异常值并从数据中剔除。
    基于统计的异常检测算法优点为计算简单,缺点为要求数据分布近似正态,受异常点的影响较大。
注:除了常见的正态分布,还存在幂律分布。在日常的数据分析中,订单数据和浏览数据都会呈现出近似幂律分布的状态,其特点为少数群体占有多数资源。

 

2.2 基于预测的传统异常检测算法

震惊!(竟有这么好的)时序数据异常检测算法简述与分类-编程知识网

1.  ARIMA(p, d, q)数据预测模型
    ARIMA差分整合移动平均自回归模型,其中p为滞后值,d是非平稳序列转化为平稳序列所需的差分次数,q是预测误差的滞后值。AR模型描述的是当前值和历史值之间的关系。MA模型描述的是当前值与自回归部分误差累积的关系。对于非平稳序列,由于它的方差和均值不稳定,处理方法一般是将其转化成平稳序列。然后对它的滞后值以及随机误差值进行回顾来建立模型。 

2. 指数平滑预测模型
    指数平滑兼容了全期平均和移动平均所长,不舍弃过去的数据,但是仅给予逐渐减弱的影响程度,即随着数据的远离,赋予逐渐收敛为零的权数。主要是通过计算指数平滑值,配合一定的时间序列预测模型对现象的未来进行预测。

 

2.3 直接异常检测算法

1.  LOF局部离群因子检测法(基于密度)
    该算法为数据集中的每个点计算一个离群因子,通过判断其是否接近于1来判定该点是否为离群点。若离群因子远大于1,则该点为离群点,若接近于1,则为正常点。

2.  孤立森林
    该算法基于集成学习,适用于连续数据的异常检测,通过多棵iTree形成森林来判定是否有异常点。

3.  One-class SVM算法
    寻找一个超平面将样本中的正例圈出来,预测就是用这个超平面做决策,在圈内的样本就认为是正样本。适用于已知样本绝大多数为正样本,仅有极少数为负样本的场景。它可以通过已知数据训练一个一类分类器,得到一个紧凑的分类边界,超出这个边界就认为是不合格产品。

 

2.4 基于深度学习的异常检测算法

1.  基于GAN网络的异常检测算法
    通过生成式对抗网络仅仅学习正常数据的数据分布,得到的模型G只能生成或者重建正常数据。将测试样本输入训练好的模型G,如果G经过重建后输出的数据和输入样本一样或者接近,表明测试的是正常数据,否则是异常数据。

2.  基于AE(自编码器)的异常检测算法
    自编码器的输入层维度等于输出层维度,隐藏层维度小于输入层维度。通过自编码器学习数据分布最显著的特征,对原图进行重构并产生新图,新图与原图之间产生较大差异的点就是异常点。

3.  基于VAE(变分自编码器)的异常检测算法
    使用训练数据训练好一个VAE,该VAE的encoder能够将输入数据X映射到隐变量Z,decoder将隐变量Z再映射回X。当训练好一个VAE之后,如果输入一个异常数据,该模型很大概率会将该异常数据重构成一个正常数据,因此我们就可以判别输入数据是否是一个正常数据。正常数据重构成正常数据的概率很高,而异常数据重构成异常数据的概率很低。
    AE与VAE的主要区别在于前者是一种没有概率基础的确定性判别模型,而后者是可以提供校准概率的随机生成模型。

 

2.5 各类异常检测算法的优劣总结表

震惊!(竟有这么好的)时序数据异常检测算法简述与分类-编程知识网

 

3 不同异常检测算法的结合

    时间序列数据异常检测是指从正常的时间序列中识别不正常的事件或行为的过程,而由于时间序列数据具有周期性、趋势性、季节性、随机性,异常检测算法必须兼顾这些特性才能起到更好的检测效果,因此可以尝试不同类别异常检测算法组合,各取所长,从而提高检测的准确度。

1.  基于预测与统计的时序数据异常检测
    该方法采用Prophet算法与3σ准则实现。在时间序列分析领域,有一种常见的分析方法叫做STL分解,它把时间序列分解为季节项(seasonal)、趋势项(trend)、残余项(residue)。即当t≥0时,满足下式:

                                                    震惊!(竟有这么好的)时序数据异常检测算法简述与分类-编程知识网

而Prophet基于这种方法进行了必要的改进和优化,在上述三项的基础上又增加了节假日项,此时数据则满足下方的新公式:

                                                    震惊!(竟有这么好的)时序数据异常检测算法简述与分类-编程知识网

    其中g(t)为趋势项,表示时间序列在非周期上面的变化趋势;s(t)为周期项,或者称季节项,一般以周或者年为单位;h(t)为节假日项,表示在当天是否存在节假日;ϵt表示误差项或者称剩余项。Prophet 算法就是通过拟合这几项,然后进行累加就得到了时间序列的预测值。
    3σ准则借助历史的波动数据来估计并计算不同日期同一时刻的数值的标准差。
    最后,在Prophet预测上下界的基础上分别加减3σ得到数据波动的合理范围,当实际数据超过这个范围时则标注为异常数据。此算法训练快,效果好。

2.  基于预测与直接异常检测的方法
    首先去除时间序列数据的趋势和周期性。用预测模型给出的预测值与真实值相减计算序列的残差,残差不包含周期性和趋势性,可以作为直接异常检测算法的输入。此算法效果较好,适用于离线、测试、生产三种场景。

 

文末备注:本文是作者第一篇博客,如有不足之处,还请各位大佬海涵并提出修改意见,在下一定及时更正。内容来源于作者对百度和知乎上其他相关内容的汇总,涵盖了多数最基础的异常检测方法,如果各位有补充意见,请不吝赐教。谢谢大家的阅读!后续还会有其他关于异常检测的内容,愿与诸君共同进步!