最近对预测及异常检测进行了一些研究和学习,把所学东西做一个汇总整理。欢迎交流拍砖 👏(侵权删)
目录
6.5 Holt exponential smoothing
6.6 Holt-Winters exponential smoothing
8.1.3 时间序列建模(移动平均、指数平滑、ARMA、ARIMA)
时间序列 (time series,TS) 是一组按照时间发生先后顺序进行排列的数据点序列。通常一组时间序列的时间间隔为一恒定值(如 1s,1min,1h,1d),因此时间序列亦可作为离散时间数据进行分析处理。
时间序列异常检测(TS anomaly detection)的主要目标是从时间序列中识别异常的事件或行为,异常检测算法目前广泛应用于众多领域中,例如量化交易,网络入侵检测,智能运维等。
与之相关的研究领域:
在实际场景中,不同的业务通常会对应不同类型的时间序列模式,一般可以划分为几种类型:趋势性、周期性、随机性、综合性。如下图所示:

因此在实际场景中,难以使用单一模型来学习不同类型时间序列的特征模式,一般使用集成模型或者多个模型同时对时间序列进行异常判断。
首先需要定义异常:在时间序列中,异常是指在一个或多个信号的模式发生意料之外的变化。主要可以分为以下三类异常。
即某些点与全局大多数点都不一样,如下图所示

即某个时间点的表现与前后时间段内存在较大的差异,如下图所示

时间序列的异常检测问题通常表示为相对于某些标准信号或常见信号的离群点。虽然有很多的异常类型,但是我们只关注业务角度中最重要的类型,比如意外的峰值、下降、趋势变化以及等级转换(level shifts)。
常见的异常有如下几种:
结合图片来看一下:

即个体不存在异常,但是个体同时出现表现出异常状态,如下图所示

通常来说,平稳的时间序列指的是这个时间序列在一段时间内具有稳定的统计值,如均值,方差。许多时间序列的统计学模型都是依赖于时间序列是平稳的这一前提条件。
常用平稳性验证方法包括 Augmented Dickey Fuller Test (ADF Test),Kwiatkowski-Phillips-Schmidt-Shin Test (KPSS Test)。
对于非平稳的时间序列,可以通过差分、log 变换或平方根变换转化为平稳序列。
当一个时间序列数据长期增长或者长期下降时,表示该序列有趋势 。在某些场合,趋势代表着“转换方向”。
当时间序列中的数据受到季节性因素(例如一年的时间或者一周的时间)的影响时,表示该序列具有季节性 。季节性总是一个已知并且固定的频率。
当时间序列数据存在不固定频率的上升和下降时,表示该序列有周期性。周期波动通常至少持续两年。
周期性和季节性的区别:当数据的波动是无规律时,表示序列存在周期性;如果波动的频率不变并且与固定长度的时间段有关,表示序列存在季节性。一般而言,周期的长度较长,并且周期的波动幅度也更大。

指的是时间序列中某一个时刻的值和另一个时刻的值具有一定的相关性。
通常用于时间序列的周期性检测,可以参考:时间序列-周期性检测方法及其 Python 实践
白噪声是一个对所有时间其自相关系数为零的随机过程。即任何两个时间的随机变量都不相关。
对于白噪声而言,我们期望它的自相关值接近0。但是由于随机扰动的存在,自相关值并不会精确地等于0。对于一个长度为T的白噪声序列而言,我们期望在0.95的置信度下,它的自相关值处于±2/√T之间。如果一个序列中有较多的自相关值处于边界之外,那么该序列很可能不是白噪声序列。

在上例中,序列长度 T=50,边界为±2/√50=±0.28。所有的自相关值均落在边界之内,证明序列是白噪声。
很多变量间的序列相关性非常强,但是实际上很可能是虚假相关性。

更多虚假相关性案例:Spurious Correlations
许多时间序列同时包含趋势、季节性以及周期性。当我们选择预测方法时,首先应该分析时间序列数据所具备的特征,然后再选择合适的预测方法抓取特征。
数据平滑通常是为了消除一些极端值或测量误差。即使有些极端值本身是真实的,但是并没有反映出潜在的数据模式仍需处理。
原理是通过拟合出一个近似的模型来对未来进行预测, 我们可以通过这个预测值和实际的值进行比较, 如果差距过大, 我们就可以判定这个点是异常的。目前存在多种数据平滑方法:
即移动平均,给定一个时间序列和窗口长度N,moving average等于当前data point之前N个点(包括当前点)的平均值。不停地移动这个窗口,就得到移动平均曲线。
即累加移动平均:

即加权移动平均:

一次指数平滑,从最邻近到最早的数据点的权重呈现指数型下降的规律。指数平滑算法只有一个参数。
适用:针对没有趋势且没有季节性的序列。
指数移动与移动平均的区别:

二次指数平滑,通过引入一个额外的系数来解决指数平滑无法应用于具有趋势性数据的问题。
适用:针对有趋势但没有季节性的序列。
三次指数平滑,通过再次引入一个新系数的方式同时解决了 Holt exponential smoothing 无法解决具有季节性变化数据的不足。
所有的指数平滑法都要更新上一时间步长的计算结果,并使用当前时间步长的数据中包含的新信息。通过”混合“新信息和旧信息来实现,而相关的新旧信息的权重由一个可调整的参数来控制。
面对一个全新的异常检测问题,建议遵循以下步骤分析:
通常,异常检测算法应该将每个时间点标记为异常/非异常,或者预测某个点的信号,并衡量这个点的真实值与预测值的差值是否足够大,从而将其视为异常。使用后面的方法,你将能够得到一个可视化的置信区间,这有助于理解为什么会出现异常并进行验证。
从分类看,当前发展阶段的时序异常检测算法和模型可以分为以下几类:

下边就具体算法进行详细总结。
主要是对数据的分布做出假设,并找出假设下所定义的“异常”,因此往往会使用极值分析或者假设检验。比如对最简单的一维数据假设高斯分布,然后将距离均值特定范围以外的数据当做异常点。而推广到高位后,可以假设每个维度各自独立,并将各个维度上的异常度相加。如果考虑特征之间的相关性,也可以用马氏距离来衡量数据的异常度。
优点:
缺点:
8.1.1.1 适用对象
一维特征空间
8.1.1.2 方法描述
数字异常值方法是一维特征空间中最简单的非参数异常值检测方法,异常值是通过IQR(InterQuartile Range)计算得的。
箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。如下图所示,绘制箱线图需要一组数据的最大值、最小值、中位数和两个四分位数:
箱线图为我们提供了识别异常值的一个标准:异常值被定义为小于Q1-a*IQR或大于Q3+a*IQR的值,即超出样本上下限之外的数组元素被视为异常值;其中,a为唯一的参数,取值取决于样本数据的分布。

8.1.2.1 适用对象
一维特征空间中的参数异常检测方法,比如在反欺诈领域,用户支付金额、支付频次、购买特定商品次数等等,都适用于上述方法。
8.1.2.2 方法描述
3-Sigma原则又称为拉依达准则,该准则定义如下:假设一组检测数据只含有随机误差,对原始数据进行计算处理得到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的就属于异常值。

统计检验是最直观也最容易的一个方法,通常来说就是:假设原数据服从某个分布(如高斯分布),异常值是分布尾部的数据点,因此远离数据的平均值。首先计算μ和σ ,μ代表均值,σ代表标准差,再计算
的区间,最后落在区间之外的数据点就被认为是异常值(暗含的思想是,落在尾部分布的数据概率很小了,几乎不可能出现;但是出现了,所以是异常的)。 3-Sigma范围(μ–3σ,μ+3σ)内99.73%的为正常数据。下面是3-Sigma的Python实现:
- import numpy as np
- def three_sigma(df_col):
- '''
- df_col:DataFrame数据的某一列
- '''
- rule = (df_col.mean() - 3 * df_col.std() > df_col) | (df_col.mean() + 3 * df_col.std() < df_col)
- index = np.arange(df_col.shape[0])[rule]
- out_range = df_col.iloc[index]
- return out_range
8.1.2.3 存在问题

流程:

方法:
1 看时序图
2 假设检验
8.1.3.1 自回归(AR)
自回归(AR)方法将序列中的下一步建模为先前时间步骤的观察的线性函数。
该模型的符号涉及指定模型 p 的顺序作为 AR 函数的参数,例如, AR(P)。例如,AR(1)是一阶自回归模型。
该方法适用于没有趋势和季节性成分的单变量时间序列。
8.1.3.2 移动平均线(MA)
移动平均(MA)方法将序列中的下一步建模为来自先前时间步骤的平均过程的残余误差的线性函数。
移动平均模型与计算时间序列的移动平均值不同。
该模型的表示法涉及将模型 q 的顺序指定为 MA 函数的参数,例如, MA(Q)。例如,MA(1)是一阶移动平均模型。
该方法适用于没有趋势和季节性成分的单变量时间序列。
8.1.3.3 自回归移动平均线(ARMA)
自回归移动平均(ARMA)方法将序列中的下一步建模为先前时间步骤的观测和再造误差的线性函数。
它结合了自回归(AR)和移动平均(MA)模型。
该模型的表示法涉及将 AR(p)和 MA(q)模型的顺序指定为 ARMA 函数的参数,例如,ARMA 函数的参数。 ARMA(p,q)。 ARIMA 模型可用于开发 AR 或 MA 模型。
该方法适用于没有趋势和季节性成分的单变量时间序列。
8.1.3.4 自回归综合移动平均线(ARIMA)
自回归整合移动平均(ARIMA)方法将序列中的下一步建模为先前时间步长的差异观测值和残差误差的线性函数。
它结合了自回归(AR)和移动平均(MA)模型以及序列的差分预处理步骤,使序列静止,称为积分(I)。
该模型的表示法涉及将 AR(p),I(d)和 MA(q)模型的顺序指定为 ARIMA 函数的参数,例如 ARIMA 函数的参数。 ARIMA(p,d,q)。 ARIMA 模型也可用于开发 AR,MA 和 ARMA 模型。
该方法适用于具有趋势且没有季节性成分的单变量时间序列。
8.1.3.5 季节性自回归整合移动平均线(SARIMA)
季节性自回归综合移动平均线(SARIMA)方法将序列中的下一步建模为差异观测值,误差,差异季节观测值和先前时间步长的季节误差的线性函数。
它结合了 ARIMA 模型,能够在季节性水平上执行相同的自回归,差分和移动平均建模。
该模型的表示法涉及指定 AR(p),I(d)和 MA(q)模型的顺序作为 ARIMA 函数和 AR(P),I(D),MA(Q)和 m 的参数。季节性参数,例如 SARIMA(p,d,q)(P,D,Q)m 其中“m”是每个季节(季节性时期)的时间步数。 SARIMA 模型可用于开发 AR,MA,ARMA 和 ARIMA 模型。
该方法适用于具有趋势和/或季节性分量的单变量时间序列。
异常点因为和正常点的分布不同,因此相似度较低,由此衍生了一系列算法通过相似度来识别异常点。比如最简单的K近邻、基于密度聚类、孤立森林等均可以做异常检测,大部分异常检测算法都可以被认为是一种估计相似度,无论是通过密度、距离、夹角或是划分超平面。通过聚类也可以被理解为一种相似度度量。
8.2.1.1 方法描述
认为异常点距离正常点比较远,因此可以对于每一个数据点,计算它的K-近邻距离,即数据对象与最近的k个点的距离之和(或平均距离),与k个最近点的距离越小,异常分越低;与k个最近点的距离越大,异常分越大。设定一个距离的阈值,距离高于这个阈值,对应的数据对象就是异常点。
或者是将全部样本的K-近邻距离排序,取前n个最大的作为异常点。计算距离时一般使用欧式距离,也可以使用角度距离。
8.2.1.2 优缺点
优点:
缺点:
另外的,对于多变量数据。采用马氏距离:用来计算样本X与中心点μ的距离,也可以用来做异常分值,计算方式:

马氏距离最强大的地方是引入了数据之间的相关性(协方差矩阵)。 而且马氏距离不需要任何参数,这对无监督学习来说无疑是一件很好的方法。通常一个简单的最近邻算法加上马氏距离就是一个很好的检测模型。
项目参考:马氏距离+ KNN
基于聚类的异常检测优缺点:
优点:
缺点:
此类方法主要有三种假设,三种假设下有各自的方法。计算复杂度很大程度上取决于聚类算法的计算复杂度。
假设一:不属于任何聚类的点是异常点,主要方法包括DBSCAN、SNN clustering、FindOut algorithm、WaveCluster Algorithm。
缺点:不能发现异常簇
该技术基于DBSCAN聚类方法,DBSCAN是一维或多维特征空间中的非参数,基于密度的离群值检测方法。
DBSCAN算法在聚类过程中主要通过寻找核心对象来不断扩展密度可达的样本,从而将样本空间中不同位置的高密度空间找出来。除了高密度空间外的其它不属于任何类簇的样本就被视为异常点。
在DBSCAN聚类技术中,所有数据点都被定义为核心点(Core Points)、边界点(Border Points)或噪声点(Noise Points)。
从而,异常检测取决于所要求的最小包含点数、距离ℇ和所选择的距离度量,比如欧几里得或曼哈顿距离。
假设二:距离最近的聚类结果较远的点是异常点,主要方法包括K-Means、Self-Organizing Maps(SOM)、GMM。
首先进行聚类,然后计算样例与其所属聚类中心的距离,计算其所属聚类的类内平均距离,用两者的比值衡量异常程度。
缺点:不能发现异常簇
假设三:稀疏聚类和较小的聚类里的点都是异常点,主要方法包括CBLOF、LDCOF、CMGOS等。
首先进行聚类,然后启发式地将聚类簇分成大簇和小簇。如果某一样例属于大簇,则利用该样例和其所属大簇计算异常得分,如果某一样例属于小簇,则利用该样例和距离其最近的大簇计算异常得分。三种算法的区别在于计算异常得分的方式不同
优点:考虑到了数据全局分布和局部分布的差异,可以发现异常簇
在无监督学习时,提高模型的鲁棒性很重要,因此集成学习就大有用武之地。比如上面提到的Isolation Forest,就是基于构建多棵决策树实现的。
Isolation Forest,也称IForest。
8.3.1.1 适用对象
一维或多维特征空间中大数据集的非参数方法。适合高维数据上的异常检测。

8.3.1.2 方法描述
该方法一个重要概念是孤立数。孤立数是孤立数据点所需的拆分数。通过以下步骤确定此分割数:
与孤立非异常值相比,它需要更少的分裂来孤立异常值,即异常值与非异常点相比具有更低的孤立数。因此,如果数据点的孤立数低于阈值,则将数据点定义为异常值。
阈值是基于数据中异常值的估计百分比来定义的,这是异常值检测算法的起点。contamination是异常值占比,是IsolationForest的一个核心参数。预设的异常值占比越接近真实占比,模型效果越好。
实现:iForest (Isolation Forest)孤立森林 异常检测 入门篇
8.3.1.3 存在问题
8.3.1.4 资料补充
paper地址:Isolation-based Anomaly Detection
8.3.2.1 介绍
基于深度学习的时间序列异常检测算法,主要可以分为以下这么几种
在判别式里面,包括时间序列的特征工程和各种有监督算法,还有端到端的深度学习方法。在端到端的深度学习方法里面,包括前馈神经网络,卷积神经网络,或者其余混合模型等常见算法。借用张大大的图大致做一个总结:

8.3.2.2 几种深度学习方法 + 代码实例
1)基于AutoEncoder的无监督异常检测算法(Tensorflow)
可以参考一篇博文:【深度学习】 自编码器(AutoEncoder)
2)Deep SVDD:来自论文Deep One-Class Classification
3)基于Transformer掩码重建的时序数据异常检测算法(pyTorch)
可以参考一篇博文:【深度学习】Transformer详解
1、开源Python异常检测工具库PyOD项目地址:https://github.com/yzhao062/Pyod
2、异常检测学习资源:https://github.com/yzhao062/anomaly-detection-resources
3、腾讯异常检测开源学件Metis:https://github.com/Tencent/Metis
此外,在业务的实际场景下,异常点的检测有的时候只是一种辅助手段,帮助机器学习从业者迅速定位异常。但是,如果要保证效果和输出的话,最好是在定位了异常之后,把数据保存下来当做样本和标签,然后建立一个有监督学习的模型。这样通常来说就能够解决不少的问题。通常的套路都是:
原始数据 -> 无监督算法 -> 人工标注 -> 特征工程 -> 有监督算法
时间序列丨基础概念理论 & 异常检测算法 & 相关学习资源 & 公开数据集