异常检测-线性模型

1、引言

真实数据集中不同维度的数据通常具有高度的相关性,这是因为不同的属性往往是由相同的基础过程以密切相关的方式产生的。在古典统计学中,这被称为——回归建模,一种参数化的相关性分析。 一类相关性分析试图通过其他变量预测单独的属性值,另一类方法用一些潜在变量来代表整个数据。前者的代表是 线性回归,后者一个典型的例子是 主成分分析。本文将会用这两种典型的线性相关分析方法进行异常检测。
  需要明确的是,这里有两个重要的假设:
  假设一:近似线性相关假设。线性相关假设是使用两种模型进行异常检测的重要理论基础。
  假设二:子空间假设。子空间假设认为数据是镶嵌在低维子空间中的,线性方法的目的是找到合适的低维子空间使得异常点(o)在其中区别于正常点(n)。

基于这两点假设,在异常检测的第一阶段,为了确定特定的模型是否适合特定的数据集,对数据进行探索性和可视化分析是非常关键的。查看数据分布是否是线性关系或者似线性是进行下一步操作的关键。

2、线性回归

2.1、基于自变量与因变量的线性回归

2.1.1、最小二乘法

为了简单起见,这里我们一元线性回归为例:
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
变量Y为因变量,也就是我们要预测的值; X 1 . . . X d X_{1}...X_{d} X1...Xd为一系列因变量,也就是输入值。系数 a 1 . . . a d + 1 a_{1}...a_{d+1} a1...ad+1为要学习的参数。假设数据共包含 N N N个样本,第 j j j个样本包含的数据为 x j 1 . . . x j d x_{j1}...x_{jd} xj1...xjd y j y_{j} yj,带入式(1)如下式所示:

y j = ∑ i = 1 d a i ⋅ x j i + a d + 1 + ϵ j y_{j}=\sum_{i=1}^{d} a_{i} \cdot x_{j i}+a_{d+1}+\epsilon_{j} yj=i=1daixji+ad+1+ϵj

这里 ϵ j \epsilon_{j} ϵj为第 j j j个样本的误差。以 Y Y Y 代表 N × 1 N \times 1 N×1 的因变量矩阵 ( y 1 . . . y N ) T {(y_{1}...y_{N})}^{T} (y1...yN)T,即样本中的真实值;以 U U U代表 N × ( d + 1 ) N \times (d+1) N×(d+1)的自变量矩阵,其中第 j j j行为 ( x j 1 . . . x j d , 1 ) (x_{j1}...x_{jd}, 1) (xj1...xjd,1);以 A A A 代表 ( d + 1 ) × 1 (d+1) \times 1 (d+1)×1 的系数矩阵 ( a 1 . . . a d + 1 ) T (a_{1}...a_{d+1})^{T} (a1...ad+1)T。则模型可表示为: f ( U , A ) = U ⋅ A f(U, A) = U \cdot A f(U,A)=UA

定义目标函数为:

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

目标函数是关于 A A A的凸函数,其对 A A A求偏导为:

∂ 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)

∂ L ( A ) ∂ A = 0 \frac{{\partial L(A)}}{{\partial A}}=0 AL(A)=0,得到最优参数为:

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)

这种求解线性回归参数的方法也叫最小二乘法。

最小二乘法要求矩阵 U T ⋅ U U^{T} \cdot U UTU 可逆,即 U T ⋅ U U^{T} \cdot U UTU是满秩的。
  当 U T ⋅ U U^{T} \cdot U UTU不可逆时可以通过两种方法进行参数估计,一种先使用主成分分析等方法来预处理数据,消除不同特征之间的相关性,然后再使用最小二乘法。第二种方法是使用梯度下降法。

2.1.2、梯度下降法

梯度下降法是数值优化问题中最常见的求解方法。我们把线性回归(线性方程组)看作是一个优化问题,那么我们要优化的目标就是损失函数。损失函数是用来衡量样本误差的函数,我们的优化目标是要求得在误差最小的情况下模型参数的值。这里强调一下损失函数和代价函数的区别:

注意: **Loss Function(损失函数):**the error for single training example; **Cost Function(代价函数):**the average of the loss functions of the entire training set;

线性回归常用的损失函数是均方误差,表达式为:

l ( i ) ( w , b ) = 1 2 ( y ^ ( i ) − y ( i ) ) 2 l^{(i)}(\mathbf{w}, b)=\frac{1}{2}\left(\hat{y}^{(i)}-y^{(i)}\right)^{2} l(i)(w,b)=21(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 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} L(w,b)=n1i=1nl(i)(w,b)=n1i=1n21(wx(i)+by(i))2   其中 y ^ \hat{y} y^ 为预测值, y y y 为真实值。 优化算法 - 随机梯度下降

当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。

在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失和有关模型参数的导数(梯度),最后用此结果与预先设定的学习率的乘积作为模型参数在本次迭代的减小量。如下式所示:

( w , b ) ← ( w , b ) − η ∣ B ∣ ∑ i ∈ B ∂ ( w , b ) l ( i ) ( w , b ) (\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) (w,b)(w,b)BηiB(w,b)l(i)(w,b)

学习率( η \eta η): 代表在每次优化中,能够学习的步长的大小 批量大小( B B B): 是小批量计算中的批量大小batch size

2.2、基于异常检测的线性回归

前一节讨论了这样一种情况:即一个特定的变量被认为是特殊的,最优平面是通过最小化该特殊变量的均方误差而确定的。而我们通常所说的异常检测中并不会对任何变量给与特殊对待,异常值的定义是基于基础数据点的整体分布,因此需要采用一种更一般的回归建模:即以相似的方式对待所有变量,通过最小化数据对该平面的投影误差确定最佳回归平面。在这种情况下,假设我们有一组变量 X 1 … X d X_{1}… X_{d} X1Xd, 对应的回归平面如下:

a 1 ⋅ X 1 + … + a d ⋅ X d + a d + 1 = 0 a_{1} \cdot X_{1}+\ldots+a_{d} \cdot X_{d}+a_{d+1}=0 a1X1++adXd+ad+1=0

为了后续计算的方便,对参数进行如下约束: ∑ i = 1 d a i 2 = 1 \sum\limits_{i = 1}^d {a_i^2 = 1} i=1dai2=1   以 L 2 L_{2} L2范数作为目标函数: L = ∣ U ⋅ A ∣ 2 L = {\left| {U \cdot A} \right|_2} L=UA2

这样的一个问题可以通过主成分分析方法得到有效解决,我们会单独用一个部分进行讨论。

3、主成分分析

上一节的最小二乘法试图找到一个与数据具有最佳匹配 ( d − 1 ) (d−1) (d1) 维超平面。主成分分析方法可用于解决这一问题的广义版本。具体来说,它可以找到任意 k ( k < d ) k( k<d ) k(k<d) 维的最优表示超平面,从而使平方投影误差最小化。

3.1、原理推导

对于 d d d 维,包含 N N N 个样本的数据,用 R i R_{i} Ri 表示其中第 i i i 行为: [ x i 1 . . . x i d ] [x_{i1}... x_{id}] [xi1...xid]。由此可以得到 d × d d \times d d×d 的协方差矩阵(标准的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 D D 为对角矩阵,对角元素为特征值; P P P 为标准正交矩阵,每一行为对应的特征向量;这些标准正交向量提供了数据应该投影的轴线方向。与异常检测相关的主成分分析的主要性质如下:

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

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

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

需要注意的是,相比2.2节的内容,这里提供了一个更加普遍的解决方法。2.2中的内容可以归为主成分分析中只保留最大特征值对应的特征向量的情况。

在得到这些特征值和特征向量之后,可以将数据转换到新的坐标系中。以 Y 1 . . . Y N Y_{1}...Y_{N} Y1...YN 表示新坐标系中的数据,这些数据可以通过原始向量 R i R_{i} Ri 与包含新轴系的标准正交特征向量矩阵 P P P 的乘积来实现。 Y i = R i ⋅ P {Y_i} = {R_i} \cdot P Yi=RiP

在许多涉及高维数据集的真实场景中,很大一部分特征值往往非常接近于零。这意味着大多数数据都沿着一个低维的子空间排列。从异常检测的角度来看,这是非常方便的,因为离这些投影方向非常远的观测值可以被假定为离群值。例如,对于特征值较小(方差较小)的特征向量 j j j,第 i i i 条记录的 y i j y_{ij} yij y k j y_{kj} ykj 的其他值的偏差较大,说明有离群行为。这是因为当 j j j固定而 k k k变化时, y k j y_{kj} ykj 的值应当变化不大。因此, y i j y_{ij} yij 值是不常见的。

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

S core ⁡ ( X ˉ ) = ∑ j = 1 d ∣ ( X ˉ − μ ˉ ) ⋅ e ˉ j ∣ 2 λ j S \operatorname{core}(\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

值得注意的是,对异常得分的大部分贡献是由 λ j λ_{j} λj 值较小的主成分的偏差提供的,这一点上文中有提及过。主成分分析比因变量回归能更稳定地处理少数异常值的存在。这是因为主成分分析是根据最优超平面来计算误差的,而不是一个特定的变量。当数据中加入更多的离群点时,最优超平面的变化通常不会大到影响离群点的选择。因此,这种方法更有可能选择正确的异常值,因为回归模型一开始就更准确。

3.2 归一化操作

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

4、回归分析的局限性

回归分析作为检测离群值的工具有一些局限性。这些缺点中最重要的是在本章的一开始就讨论了,其中探讨了回归分析的数据特定性质。特别是,为了使回归分析技术有效,数据需要高度相关,并沿着低维子空间对齐。当数据不相关,但在某些区域高度聚集时,这种方法可能不会有效。

另一个相关的问题是,数据中的相关性在本质上可能不是全局性的。最近的一些分析观察**[1]**表明,子空间相关性是特定于数据的特定位置的。在这种情况下,由主成分分析发现的全局子空间对于异常检测是次优的。因此,为了创建更一般的局部子空间模型,有时将线性模型与邻近模型(在后续章节中讨论)结合起来是有用的。这将是高维和子空间异常检测的主题,将在后续章节详细讨论。

5、总结

真实数据中,数据不同属性之间往往具有显著的相关性。在这种情况下,线性建模可以提供一种有效的工具来从底层数据中移除异常值或者进行异常检测。对于其他基于因变量回归的应用,线性建模是一种工具,去除异常值对于提高此类应用的性能是非常重要的。在大多数情况下,主成分分析提供了去除异常值和进行异常检测最有效的方法,因为它对存在少数异常值的数据更有鲁棒性。

6、习题

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib.font_manager

from pyod.models.abod import ABOD
from pyod.models.knn import KNN
from pyod.models.pca import PCA
from pyod.models.hbos import HBOS
from pyod.utils.data import generate_data, get_outliers_inliers,evaluate_print

#generate random data with two features
# by default the outlier fraction is 0.1 in generate data function 
outlier_fraction = 0.1
X_train, Y_train,X_test,Y_test = generate_data(n_train=200,n_test=50,train_only=False, n_features=2)



# store outliers and inliers in different numpy arrays
x_outliers, x_inliers = get_outliers_inliers(X_train,Y_train)
n_inliers = len(x_inliers)
n_outliers = len(x_outliers)  
print("train",n_inliers,n_outliers)
x_outliers, x_inliers = get_outliers_inliers(X_test,Y_test)
n_inliers = len(x_inliers)
n_outliers = len(x_outliers)  
print("test",n_inliers,n_outliers)
#separate the two features and use it to plot the data 
F1 = X_train[:,[0]].reshape(-1,1)
F2 = X_train[:,[1]].reshape(-1,1)

# create a meshgrid 
xx , yy = np.meshgrid(np.linspace(-10, 10, 200), np.linspace(-10, 10, 200))

# scatter plot 
plt.scatter(F1,F2)
plt.xlabel('F1')
plt.ylabel('F2') 

clf = PCA()
clf.fit(X_train)
train_scores = clf.decision_scores_
# predict raw anomaly score
scores_pred = clf.decision_function(X_train)*-1
# prediction of a datapoint category outlier or inlier
y_pred = clf.predict(X_train)  # 预测异常值
test_pred = clf.predict(X_test)
# no of errors in prediction
n_errors = (y_pred != Y_train).sum()  
print('No of Errors : ', n_errors)
a = evaluate_print("PCA",Y_train,train_scores)

from pyod.utils.example import visualize
visualize("PCA",X_train,Y_train,X_test,Y_test,y_pred,test_pred)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值