异常检测

异常检测

异常,顾名思义是不同于正常的现象,常见的异常有一下三种:

点异常:指的是少数个体实例是异常的,大多数个体实例是正常的,例如正常人与病人的健康指标;

上下文异常:又称上下文异常,指的是在特定情境下个体实例是异常的,在其他情境下都是正常的,例如在特定时间下的温度突然上升或下降,在特定场景中的快速信用卡交易;

群体异常:指的是在群体集合中的个体实例出现异常的情况,而该个体实例自身可能不是异常,例如社交网络中虚假账号形成的集合作为群体异常子集,但子集中的个体节点可能与真实账号一样正常。

1、基于统计学方法

使用统计学方法对诊断数据的异常,常有一个前提假设:所有正常的数据都是由一个统计模型产生的,所以不遵守该统计模型的数据就是异常数据。

(1)参数方法

参数方法假定了数据分布的模型,通过数据学习到该模型的参数之后,把模型中低概率的点识别为异常点。

方法:正态分布、箱型图
μ = 1 m ∑ i = 1 m x ( i ) ∑ = 1 m ∑ i = 1 m ( x ( i ) − μ ) ( x ( i ) − μ ) T p ( x ) = 1 ( 2 π ) n 2 ∣ Σ ∣ 1 2 exp ⁡ ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) \mu=\frac{1}{m}\sum^m_{i=1}x^{(i)} \\ \sum=\frac{1}{m}\sum^m_{i=1}(x^{(i)}-\mu)(x^{(i)}-\mu)^T \\ p(x)=\frac{1}{(2 \pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}} \exp \left(-\frac{1}{2}(x-\mu)^{T} \Sigma^{-1}(x-\mu)\right) μ=m1i=1mx(i)=m1i=1m(x(i)μ)(x(i)μ)Tp(x)=(2π)2nΣ211exp(21(xμ)TΣ1(xμ))

(2)非参数方法

非参数方法是从正常数据中学习到一个模型分布,并不会提前设定一个先验,因为这种方法泛化性更强,所以也更加常用。

方法:HBOS(Histogram-based Outlier Score)

算法流程:

  1. 为每个数据维度作出数据直方图,统计每个维度的直方图中值的频数与相对频率。
  • 静态直方图

    ​ 在数据范围内,设置k个等宽箱,将样本的数量(频数)作为箱高的估计。

  • 动态直方图

    ​ 首先对每个维度内的数据值进行排序,然后将N个的连续值装到一个箱子中,设定箱子的面积一定,这箱高可以由箱宽计算得到,注意当某个值的数量超过设定的N,此时会导致该箱子的样本数超过设定的固定数量N。

  1. 对每个维度都计算一个独立的直方图之后,对每个维度的直方图做归一化处理,保证每一维度的直方图的最高高度为1,然后计算异常分数(越大越异常)。
    H B O S ( p ) = ∑ i = 0 d log ⁡ ( 1 hist i ( p ) ) H B O S(p)=\sum_{i=0}^{d} \log \left(\frac{1}{\text {hist}_{i}(p)}\right) HBOS(p)=i=0dlog(histi(p)1)

2、线性模型

真实世界中的数据的不同维度之间是有高度的相关性的,HBOS模型并没有考虑到相关性。线性模型其实就是一种回归建模,探索不同维度之间的相关性,线性模型具有两个假设:不同维度线性相关假设和子空间假设(在低纬子空间中,异常数据可明显区别于正常数据)

(1)数据探索

对于线性建模,数据的探索与可视化分析是十分重要。

## 相关性分析
numeric = Train_data
correlation = numeric.corr()
f , ax = plt.subplots(figsize = (14, 14))
sns.heatmap(correlation,square = True)
plt.title('Correlation of Numeric Features with Price',y=1,size=16)
plt.show())

在这里插入图片描述

#变量两两之间的相关性
sns.set()
sns.pairplot(Train_data[numeric_features],size = 2 ,kind ='scatter',diag_kind='kde')
plt.savefig('correlation.png')
plt.show()

在这里插入图片描述

(2)线性回归

这是一种有监督的异常检测方法,思路是通过线性回归得到各维度对异常的贡献程度。
Y = ∑ i = 1 d a i ⋅ X i + a d + 1 Y=\sum_{i=1}^{d} a_{i} \cdot X_{i}+a_{d+1} Y=i=1daiXi+ad+1
上面的公式就是理想的线性回归公式,我们要得到的就是其中 \a_i\ 的值。

  • 最小二乘法

L ( A ) = 1 2 ∥ Y − U ⋅ A ∥ 2 L(A) = \frac{1}{2}{\left\| {Y - U \cdot A} \right\|^2} L(A)=21YUA2

∂ L ( A ) ∂ A = 1 2 ∂ ∥ Y − U ⋅ A ∥ 2 ∂ A = − U T ( Y − U ⋅ A ) \frac{{\partial L(A)}}{{\partial A}} = \frac{1}{2}\frac{{\partial {{\left\| {Y - U \cdot A} \right\|}^2}}}{{\partial A}} = - {U^T}(Y - U \cdot A) AL(A)=21AYUA2=UT(YUA)

A = ( U T ⋅ U ) − 1 ⋅ ( U T ⋅ Y ) A=\left(U^{T} \cdot U\right)^{-1} \cdot\left(U^{T} \cdot Y\right) A=(UTU)1(UTY)

  • 随机梯度下降法

    在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失和有关模型参数的导数(梯度),最后用此结果与预先设定的学习率的乘积作为模型参数在本次迭代的减小量。
    l ( i ) ( w , b ) = 1 2 ( y ^ ( i ) − y ( i ) ) 2 L ( w , b ) = 1 n ∑ i = 1 n l ( i ) ( w , b ) = 1 n ∑ i = 1 n 1 2 ( w ⊤ x ( i ) + b − y ( i ) ) 2 ( w , b ) ← ( w , b ) − η ∣ B ∣ ∑ i ∈ B ∂ ( w , b ) l ( i ) ( w , b ) l^{(i)}(\mathbf{w}, b)=\frac{1}{2}\left(\hat{y}^{(i)}-y^{(i)}\right)^{2}\\ L(\mathbf{w}, b)=\frac{1}{n} \sum_{i=1}^{n} l^{(i)}(\mathbf{w}, b)=\frac{1}{n} \sum_{i=1}^{n} \frac{1}{2}\left(\mathbf{w}^{\top} \mathbf{x}^{(i)}+b-y^{(i)}\right)^{2} \\ (\mathbf{w}, b) \leftarrow(\mathbf{w}, b)-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w}, b)} l^{(i)}(\mathbf{w}, b) l(i)(w,b)=21(y^(i)y(i))2L(w,b)=n1i=1nl(i)(w,b)=n1i=1n21(wx(i)+by(i))2(w,b)(w,b)BηiB(w,b)l(i)(w,b)
    学习率( η \eta η): 代表在每次优化中,能够学习的步长的大小
    批量大小( B B B): 是小批量计算中的批量大小batch size

(3)主成分分析

对于 d 维,包含 N 个样本的数据,用 \R_{i}\ 表示其中第 i 行。由此可以得到协方差矩阵(标准的PCA应当计算相关系数矩阵,即对数据进行均值为0方差为1的标准化处理,而协方差矩阵只需要减去均值即可):
Σ = ( R − R ˉ ) T ⋅ ( R − R ˉ ) Σ = (R - \bar{R})^{T} \cdot (R - \bar{R}) Σ=(RRˉ)T(RRˉ)
易知协方差矩阵 \Σ\是对称并且半正定的,因此可以进行相似对角化:
Σ = P ⋅ D ⋅ P T Σ = P \cdot D \cdot P^{T} Σ=PDPT

  这里的 \D\为对角矩阵,对角元素为特征值;\P\为标准正交矩阵,每一行为对应的特征向量;这些标准正交向量提供了数据应该投影的轴线方向。与异常检测相关的主成分分析的主要性质如下:

  • 如果前 k 的特征向量选定之后(根据最大的k个特征值),由这些特征向量定义的k维超平面是在所有维度为 k 的超平面中,所有数据点到它的均方距离尽可能小的平面。

  • 如果将数据转换为与正交特征向量对应的轴系,则转换后的数据沿每个特征向量维的方差等于相应的特征值。在这种新表示中,转换后的数据的协方差为0。

  • 由于沿特征值小的特征向量的转换数据的方差很低,因此沿这些方向的变换数据与平均值的显着偏差可能表示离群值。

  在得到这些特征值和特征向量之后,可以将数据转换到新的坐标系中。新坐标系中的数据可以通过原始向量 \R_{i}\与包含新轴系的标准正交特征向量矩阵 \P\ 的乘积来实现。
Y i = R i ⋅ P {Y_i} = {R_i} \cdot P Yi=RiP
  在许多涉及高维数据集的真实场景中,很大一部分特征值往往非常接近于零。这意味着大多数数据都沿着一个低维的子空间排列。从异常检测的角度来看,这是非常方便的,因为离这些投影方向非常远的观测值可以被假定为离群值。例如,对于特征值较小(方差较小)的特征向量 j,第 i$条记录的 y_{ij} 与 y_{kj}的其他值的偏差较大,说明有离群行为。这是因为当j固定而k变化时,y_{kj} 的值应当变化不大。因此,y_{ij} 值是不常见的。

  在不选取任何特定的 k 维集合的情况下,一种更精确的异常检测建模方法是使用特征值来计算数据点沿每个主分量方向到质心的归一化距离。设 e_{j}为第 j个特征向量,λ_{j} 为沿该方向的方差(特征值)。数据点相对于对数据质心的总体归一化异常得分可以由下式给出:

Score ⁡ ( X ˉ ) = ∑ j = 1 d ∣ ( X ˉ − μ ˉ ) ⋅ e ˉ j ∣ 2 λ j \operatorname{Score}(\bar{X})=\sum_{j=1}^{d} \frac{\left|(\bar{X}-\bar{\mu}) \cdot \bar{e}_{j}\right|^{2}}{\lambda_{j}} Score(Xˉ)=j=1dλj(Xˉμˉ)eˉj2
  值得注意的是,对异常得分的大部分贡献是由特征值较小的主成分的偏差提供的,这一点上文中有提及过。主成分分析比因变量回归能更稳定地处理少数异常值的存在。这是因为主成分分析是根据最优超平面来计算误差的,而不是一个特定的变量。当数据中加入更多的离群点时,最优超平面的变化通常不会大到影响离群点的选择。因此,这种方法更有可能选择正确的异常值,因为回归模型一开始就更准确。

  当不同维度的尺度差别较大时,使用PCA 有时并不能得到直观有效的结果。例如,考虑一个包含年龄和工资等属性的人口统计数据集。工资属性的范围可能是几万,而年龄属性几乎总是小于100,使用主成分分析会导致主成分被高方差属性所控制。对于一个只包含年龄和工资的二维数据集,最大的特征向量几乎与工资轴平行,这会降低异常点检测过程的有效性。因此,一个自然的解决方案是对数据进行均值为0方差为1的标准化处理。这隐含地导致在主成分分析中使用相关矩阵而不是协方差矩阵。当然,这个问题并不是线性建模所独有的,对于大多数异常检测算法,都需要使用这样的预处理。

3、基于相似度的方法

(1)基于距离的方法

基于距离的异常检测有这样一个前提假设,即异常点的 k 近邻距离要远大于正常点。解决问题的最简单方法是使用嵌套循环。 第一层循环遍历每个数据,第二层循环进行异常判断,需要计算当前点与其他点的距离,一旦已识别出多于 k 个数据点与当前点的距离在 D 之内,则将该点自动标记为非异常值。

(2)基于密度的方法

LOF: https://zhuanlan.zhihu.com/p/354355119

4、高维异常检测

孤立森林: https://zhuanlan.zhihu.com/p/354355119

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值