时序异常检测汇总

异常检测(Anomaly detection)是目前时序数据分析最成熟的应用之一,从正常的时间序列中识别不正常的事件或行为的过程。

作用:有效的异常检测广泛用于很多领域,例如量化交易,网络安全检测、自动驾驶汽车和大型工业设备的日常维护,准确及时的异常检测可以提醒工程师及时采取措施。

三种异常形式

1)直接检测:针对点异常,直接定位离群点,离群值检测。

2)间接检测:上下文或集合异常先转化成点异常,再求解。

3)时间跨度检测: ARIMA, 回归模型,LSTM等,核心思想就是模型学习一段历史数据,

                             用预测值比对真实值与预测值的偏差判断是否为异常。

4)序列跨度检测:许多传感器应用程序产生的时间序列通常彼此紧密相关。例如,在一个传感器上的鸟叫通常也会被附近的传感器记录下来。此时可以使用一个序列来预测另一个序列。与此类预期预测的偏差可以报告为异常值,如隐式马尔科夫链HMM等。

时序特征筛选

非数值型变量转化成数值型变量:如 categorical,text,mixed data

分布概率转换:不默认服从特定分布(如高斯),需要根据具体数据集定义概率分布(按比例),并按乘积方式与数值变量组合以创建单个多元分布。

线性转换:one-hot、LSA(潜在语义分析)

相似度转换:

时间序列特征构造

统计特征

  • max、min、interval
  • avg、median
  • variance、偏度、峰度
  • 同比、环比、重复值

拟合特征

  • 移动平均算法
  • 带权重的移动平均算法
  • 1/2/3次指数移动平均算法
  • SVD算法
  • 线性拟合
  • 自回归:AR/MA/ARMA/ARIMA/卡尔曼滤波器

时域特征

  • 自相关,偏相关系数
  • 差分
  • 赫斯特指数
  • 趋势、周期
  • 噪声

频域特征

  • 小波分析特征(大象流/老鼠流):小波变换系数、变换波峰数、变换均值
  • 傅里叶变换偏度、峰度、方差、系数等

特征选择方法

相关度:筛除无关特征

离群点通常是不符合正常数据依赖关系下模型的点,而无关的特征是不能用来单独建模的,反而会影响模型准确性,可以通过回归模型利用其他特征来预测某一个特征,如果均方根误差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为正实数,那么以下不等式成立:

  • 比切雪夫不等式:随机变量集中在距离其数学期望值距离不超过a的区间上概率的上限估计:

  • 统计置信度检验:3-sigma: (μ−3σ,μ+3σ)区间内的概率为99.74;当数据分布区间超过这个区间时,即可认为是异常数据。

  • t 检验,f 检验,卡方检验:检验一个正态分布的总体的均值是否在满足H0假设的值之内
  • Grubbs' Test 和 ESD(Extreme Studentized Deviate test)

Grubbs假设检验

检验服从正态分布的单变量数据集Y中的单个异常值。若有异常值,则必为其中大值或小值。

使用Grubbs测试需要总体是正态分布的。算法流程:

1. 样本从小到大排序

2. 求样本的mean和dev

3. 计算min/max与mean的差距,更大的那个为可疑值

4. 求可疑值的z-score (standard score),如果大于Grubbs临界值,那么就是outlier

Grubbs 临界值可查表得到,由两个值决定:检出水平α(越严格越小),样本数量 n,排除outlier,对剩余序列循环做 1-4 步骤。

局限:

1、只能检测单维度数据

2、不能输出正常区间

3、判断机制是“逐一剔除”,每个异常值都要单独计算整个步骤,不使用与大数据量情况。

4、需假定数据服从正态分布或近正态分布

  • ARIMA类:

        纯随机序列(白噪声序列),序列各项间没有任何的关系,

        序列在进行完全无序的随机波动, 可以终止对该序列的分析。

        平稳非白噪声序列, 均值和方差是常数。ARMA 模型是最常用的平稳序列拟合模型。

        非平稳序列, 方差和均值不稳定, 通常先转化成平稳序列,使用ARIMA 模型分析。

建模:

AR 是自回归, p 是自回归项,

MA 是移动平均, q 为移动平均项,

d 为时间序列平稳时做的差分次数。

原理: 将非平稳时间序列转换成平稳时间序列, 然后将因变量仅对它的滞后值(p阶)以及随机误差项的现值和滞后值进行回顾所建立的模型。

多变量数据

马氏距离:计算样本X与中心点μ的距离,也可以用来做异常分值

马氏距离最强大的是引入了数据之间的相关性(协方差矩阵),且马氏距离不需要任何参数,通常一个简单的最近邻算法加上马氏距离就可以秒杀很多复杂的检测模型。

https://github.com/DaiDongyang/knn

基于相似度量的算法

基于距离的度量:

KNN:输入数据集D,对每个点计算它的k邻近距离->按照距离降序排序->前N个点认为是离群点。

依次计算每个样本点与近的K个样本的平均距离,将距离与阈值比较,如果大于阈值,则认为是异常点。优点是不需要假设数据的分布,缺点是仅可以找出全局异常点,无法找到局部异常点。

基于密度的度量:

LOF(Local Outlier Factor):局部离群因子检测方法,为每个点计算一个离群因子,若LOF远大于1,则认为是离群因子,接近于1,则是正常点。

通过给每个数据点都分配一个依赖于邻域密度的离群因子 LOF,判断该数据点是否为离群点。可以量化每个数据点的异常程度;

LOF算法流程如下:

  • 对于每个数据点,计算它与其他所有点的距离,并按从近到远排序;

  • 对于每个数据点,找到它的K-Nearest-Neighbor,计算LOF得分。

from sklearn.neighbors import LocalOutlierFactor as LOF

X = [[-1.1], [0.2], [100.1], [0.3]]
clf = LOF(n_neighbors=2)
res = clf.fit_predict(X)
print(res)
print(clf.negative_outlier_factor_)

离群因子计算方法:机器学习-异常检测算法(二):Local Outlier Factor - 知乎

COF是LOF的变种,可以处理低密度下的异常值,COF的局部密度是基于平均链式距离计算得到。先计算出每个点的KNN,再计算每个点的Set based nearest Path,

设 k=5,F临近点为B、C、D、E、G。SBN Path的第一个元素是F、第二个是E、第三个元素为D,第四和五个元素为C和G,第六个元素为B。F的SBN Path为{F, E, D, C, G, C, B},对应的距离e={e1, e2, e3,…,ek},依照上面的例子e={3,2,1,1,1}。

计算SBN Path,可直接计算点与其neighbor所有点所构成的graph的minimum spanning tree,再以该点为起点执行shortest path算法,得到SBN Path。链式距离:

from pyod.models.cof import COF
cof = COF(contamination = 0.06,  ## 异常值所占的比例
          n_neighbors = 20,      ## 近邻数量
        )
cof_label = cof.fit_predict(iris.values) # 鸢尾花数据
print("检测出的异常值数量为:",np.sum(cof_label == 1))

Stochastic Outlier Selection (SOS)

当一个点和其它所有点的关联度(affinity)都很小的时候,其为一个异常点。

SOS的流程:

  1. 计算相异度矩阵D;

  2. 计算关联度矩阵A;

  3. 计算关联概率矩阵B;

  4. 算出异常概率向量。

相异度矩阵D是各样本两两之间的度量距离, 比如欧式距离或汉明距离等。

关联度矩阵反映的是 度量距离方差, 如图7, 点 x5 的密度大, 方差小;  x6 的密度小, 方差大。

关联概率矩阵  (binding probability matrix) 是把关联矩阵(affinity matrix)按行归一化得到的。

得到关联矩阵后,每个点的异常概率值就用公式计算,当一个点和其它所有点的关联度(affinity)都很小的时候,它就是一个异常点。

import pandas as pd
from sksos import SOS
iris = pd.read_csv("http://bit.ly/iris-csv")
X = iris.drop("Name", axis=1).values
detector = SOS()
iris["score"] = detector.predict(X)
iris.sort_values("score", ascending=False).head(10)

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) - 知乎

PCA是线性降维,AutoEncoder是非线性降维。根据正常数据训练出来的AutoEncoder,能够将正常样本重建还原,但是却无法将异于正常分布的数据点较好地还原,导致还原误差较大。因此如果一个新样本被编码,解码之后,误差超出正常数据编码和解码后的误差范围,则视作为异常数据。AutoEncoder训练使用的数据是正常数据(即无异常值),因此AutoEncoder做异常检测时是一种有监督学习的方法。

Deep SVDD:使用神经网络将样本从输入空间 χ⊆Rd 映射到输出空间F⊆Rp,使得在隐空间上, 正常样本聚集类中心 附近。在测试时, 如果一个样本距离正常类中心 太远, 就认定为异常。

属于无监督异常检测方法,使用标签信息可以让网络更加明确地区分正常样本和异常样本。理想的情况是想将正常样本和异常样本在输出空间聚成两簇。 

基于Transformer掩码重建的时序数据异常检测:【深度学习】Transformer详解 - 知乎

Multi-head 机制在时序数据任务中几乎没有发挥作用,可能是因为数据维度过少,只有 25 或 55维,而一般的 NLP 任务的词一般会嵌入 512 维度的词向量空间。

参考:

时间序列异常检测(一)—— 算法综述 - 知乎

时间序列异常检测算法S-H-ESD - Treant - 博客园

八大无监督异常检测技术-爱数据

收藏!14 种异常检测方法总结 - 文章详情 (itpub.net)

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 时序异常检测算法主要通过对时间序列数据的分析和模型建立来检测异常数据点。常用的算法包括基于统计学的方法,如三阶统计量和高斯混合模型,以及基于机器学习的方法,如K-means和基于深度学习的方法。这些算法通过学习正常数据的特征来识别异常数据。 ### 回答2: 时序异常检测算法原理是一种用于识别时间序列数据中异常点的方法。该算法的目标是找出数据序列中与其它数据点或整体模式显著不同的点,以便进一步分析和处理。 时序异常检测算法的原理主要包括以下几个步骤: 1. 数据预处理:首先对原始数据做预处理,如去除噪音、处理缺失值等。可以使用平滑算法如移动平均法或指数平滑法来平滑数据,以减小噪音的影响。 2. 特征提取:对于时间序列数据,需要从中提取各种特征以便进行异常检测。常用的特征包括均值、标准差、最大值、最小值等。这些特征可以反映数据的整体分布情况。 3. 建立模型:根据特征提取的结果,可以建立模型来对数据进行建模。常用的模型包括ARIMA模型、支持向量机等。通过建立模型,可以对数据进行预测或拟合,以判断每个数据点与模型的拟合程度。 4. 异常点检测:根据建立的模型,计算每个数据点的预测误差或残差。如果某个数据点的预测误差大于一定阈值,就可以认为该点是异常点。也可以通过计算该点与其它数据点之间的相似度或距离,来判断是否异常。 5. 异常点处理:一旦发现异常点,需要对其进行处理。处理方法可以是删除异常点、修正异常点或标记异常点。根据具体情况选择合适的处理方法。 时序异常检测算法原理可以应用于各种领域,如金融、工业控制、交通管理等。通过对时间序列数据进行异常检测,可以帮助用户发现潜在的问题或异常情况,并采取相应的措施进行处理。 ### 回答3: 时序异常检测算法是一种用于检测时间序列数据中异常值的方法。它的原理是通过比较观测值与预期值之间的差异来判断是否存在异常。 时序异常检测算法的基本原理可以分为以下几个步骤: 1. 数据预处理:首先,需要对原始数据进行预处理,包括数据清洗、去除噪声等操作,以确保数据的准确性和可靠性。 2. 建立模型:接下来,需要建立一个模型来描述时间序列数据的特征。常用的模型包括统计模型、机器学习模型和深度学习模型等。选择适当的模型取决于数据的特点和需求。 3. 计算预期值:通过已建立的模型,计算出每个时间点的预期值。这可以通过训练模型并使用历史数据进行预测来实现。 4. 计算残差:将观测值与预期值进行比较,计算它们之间的残差。残差表示观测值与预期值之间的差异,它在统计学中常用于检测异常。 5. 检测异常:基于残差的统计指标,可以判断每个时间点是否存在异常。常用的统计指标包括均方根误差(RMSE)、标准差(SD)等。如果某个时间点的残差超过了一定的阈值,就可以认为存在异常。 6. 异常处理:一旦检测到异常,可以采取相应的措施进行处理。常见的做法包括将异常点剔除、重新训练模型、引入外部数据等。 总之,时序异常检测算法通过比较观测值与预期值之间的差异来判断是否存在异常。它可以帮助我们及时发现和处理时间序列数据中的异常情况,提高数据的质量和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值