异常检测(Anomaly detection)是目前时序数据分析最成熟的应用之一,从正常的时间序列中识别不正常的事件或行为的过程。
作用:有效的异常检测被广泛用于现实世界的很多领域,例如量化交易,网络安全检测、自动驾驶汽车和大型工业设备的日常维护。以在轨航天器为例,由于航天器昂贵且系统复杂,未能检测到危险可能会导致严重甚至无法弥补的损害。异常随时可能发展为严重故障,因此准确及时的异常检测可以提醒航天工程师今早采取措施。
三种异常形式:
1)直接检测:针对点异常,直接定位离群点,离群值检测。
2)间接检测:上下文或集合异常先转化成点异常,再求解。
3)时间跨度检测: ARIMA, 回归模型,LSTM等,核心思想就是模型学习一段历史数据,
用预测值比对真实值与预测值的偏差判断是否为异常。
4)序列跨度检测:许多传感器应用程序产生的时间序列通常彼此紧密相关。例如,在一个传感器上的鸟叫通常也会被附近的传感器记录下来。此时可以使用一个序列来预测另一个序列。与此类预期预测的偏差可以报告为异常值,如隐式马尔科夫链HMM等。
时序特征筛选:
非数值型变量转化成数值型变量:如 categorical,text,mixed data
分布概率转换:不默认服从特定分布(如高斯),需要根据具体数据集定义概率分布(按比例),并按乘积方式与数值变量组合以创建单个多元分布。
线性转换:one-hot、LSA(潜在语义分析)
相似度转换:
时间序列特征构造:
统计特征:
拟合特征:
时域特征
频域特征
相关度:筛除无关特征
离群点通常是不符合正常数据依赖关系下模型的点,而无关的特征是不能用来单独建模的,反而会影响模型准确性,可以通过回归模型利用其他特征来预测某一个特征,如果均方根误差RMSE很大,说明这个特征和其他特征相关度非常低,应该被剔除。
实现:将所有的特征标准化,分别利用其他的特征来预测第k(k=1…N)个特征,得到均方根误差RMSE_k = √(E((θ ̂-θ)^2 ));如果RMSE_k 大于1,则预测误差大于特征的方差,特征 k 应剔除。也可以通过给予权重来衡量特征的重要性,特征 k 的权重为 max{ 0, 1-RMSE_k }。
PCA 主成分分析:筛除多重共线性特征
去除平均值->计算协方差矩阵->计算协方差矩阵的特征值和特征向量->将特征值从大到小排序->保留最大的N个特征值以及它们的特征向量
树模型输出特征重要性排序:有监督场景
单个决策树模型在建立时,实际上是寻找到某个特征合适的分割点,可以作为衡量所有特征重要性的一个指标。
基本思路如下:如果一个特征被选为分割点的次数越多,那么这个特征的重要性就越强。这个理念可以被推广到集成算法中,只要将每棵树的特征重要性进行简单的平均即可。
a) 针对单变量数据:
设X是一个随机变量,a>0为正实数,那么以下不等式成立:
纯随机序列(白噪声序列),序列各项间没有任何的关系,
序列在进行完全无序的随机波动, 可以终止对该序列的分析。
平稳非白噪声序列, 均值和方差是常数。ARMA 模型是最常用的平稳序列拟合模型。
非平稳序列, 方差和均值不稳定, 通常先转化成平稳序列,使用ARIMA 模型分析。
建模:
AR 是自回归, p 是自回归项,
MA 是移动平均, q 为移动平均项,
d 为时间序列平稳时做的差分次数。
原理: 将非平稳时间序列转换成平稳时间序列, 然后将因变量仅对它的滞后值(p阶)以及随机误差项的现值和滞后值进行回顾所建立的模型。
多变量数据:
马氏距离:计算样本X与中心点μ的距离,也可以用来做异常分值
马氏距离最强大的是引入了数据之间的相关性(协方差矩阵),且马氏距离不需要任何参数,通常一个简单的最近邻算法加上马氏距离就可以秒杀很多复杂的检测模型。
https://github.com/DaiDongyang/knn
基于距离的度量:
KNN:输入数据集D,对每个点计算它的k邻近距离->按照距离降序排序->前N个点认为是离群点
基于密度的度量:
LOF(Local Outlier Factor):局部离群因子检测方法,为每个点计算一个离群因子
若LOF远大于1,则认为是离群因子,接近于1,则是正常点。
离群因子计算方法:机器学习-异常检测算法(二):Local Outlier Factor - 知乎
KDE核密度估计:用平滑的峰值函数(“核”)拟合观察点,对真实的概率分布曲线模拟。
“核”是一个函数,提供权重。如高斯函数 (Gaussian) 就是常用的核函数,如果某一个数在观察中出现了,认为这个数的概率密度很大,与该数较近的数的概率密度也会比较大,离这个数远的数的概率密度会比较小。
KNN:简单方便,无分布假设;只能找到点不能找簇,仅适合全局异常。
LOF:可找到局部异常,异常为连续分值而不是二分类;对高维数据计算量大。
KDE:非参数估计,无分布假设;数据量少时无法准确拟合,在边界区有边界效应。
基于聚类:K-means,GMM,缺点:聚类参数难界定,导致检测效果偏差;聚类训练开销较大
基于树:孤立森林:https://www.jianshu.com/p/5af3c66e0410
基于集成学习(Ensemble),适用于连续数据的异常检测,通过多颗 iTree 形成森林判定是否有异常点;如果数据的分布不是沿着特征轴,而是随意分布,或流型分布,就不适用了。
基于谱(线性模型):通过与正常谱型进行残差对比,发现异常
简单的线性模型就是相关性分析。利用一些自变量来预测因变量。可以利用上一个值或者上几个值来预测当前值,将预测值和实际值的误差作为优化对象,建立一个正常数据的模型,背离这个模型的就被当作异常值,预测值和实际值的误差也可以作为异常分值来提供。
One-class SVM 矩阵分解法: 无监督,解决极度不平衡数据
OneClassSVM 是一种奇异值检测方法,其训练集不应掺杂异常点(训练集只有一类),否则会在训练时影响边界的选取。 但在数据维度很高,或者对相关数据分布没有任何假设的情况下,OneClassSVM也可以作为一种很好的outlier detection方法。
Replicator Neural Networks and Deep Autoencoders:基于神经网络(需要构造必要特征)适用于连续数据的异常检测,并通过寻找神经网络的重构误差来区分正常点和异常点。
基于深度学习的时间序列异常检测算法,可分为以下几种:
a) 使用正常数据训练建模,通过高重构误差来识别异常点,即生成式(Generative)的算法,如自编码器(Auto Encoder)类或者回声状态网络(Echo State Networks)。
b) 对数据的概率分布进行建模,根据样本点与极低概率的关联性来识别异常点,如DAGMM[1]。
c) 通过标注数据,模型学习正常数据特征,异常数据特征,通过有监督算法训练分类模型,也称判别式(Discriminative)算法。在判别式里面,包括时间序列的特征工程和各种有监督算法,还有端到端的深度学习方法。在端到端的深度学习方法里面,包括前馈神经网络,卷积神经网络,或者其余混合模型等常见算法。
基于AutoEncoder的无监督异常检测:【深度学习】 自编码器(AutoEncoder) - 知乎
Deep SVDD:使用神经网络将样本从输入空间 χ⊆Rd 映射到输出空间F⊆Rp,使得在隐空间上, 正常样本聚集类中心 c 附近。在测试时, 如果一个样本距离正常类中心 c 太远, 就认定为异常。
属于无监督异常检测方法,使用标签信息可以让网络更加明确地区分正常样本和异常样本。理想的情况是想将正常样本和异常样本在输出空间聚成两簇。
基于Transformer掩码重建的时序数据异常检测:【深度学习】Transformer详解 - 知乎
需要强调一下Multi-head 机制在这个时序数据任务中几乎没有发挥作用,可能是因为数据维度过少,只有 25 或 55维,而一般的 NLP 任务的词一般会嵌入 512 维度的词向量空间。
参考: