2021-05-17

DataWhale 异常检测 Task03  基于线性相关的异常检测   学习记录

本文为DataWhale 5月组队学习 异常检测内容学习记录,尚有不足之处,感谢批评指正。


学习目标:

掌握基于线性回归的异常检测基本概念与原理

掌握主成分分析方法和代码实现

一、引言

一个数据集中不同维度的数据通常具有高度的相关性,因为不同的属性往往是由相同的基础过程以密切相关的方式产生的。

回归建模——一种参数化的相关性分析。

相关性分析可以分为两种:一是线性相关,通过其他变量预测单独的属性值(目标变量);二是主成分分析(在机器学习中属于无监督学习的一种——降维)用一些潜在变量来代表整个数据。

基于上述两种方法的异常检测有两个重要的假设:

假设一:近似线性相关假设。线性相关假设是使用两种模型进行异常检测的重要理论基础

假设二:子空间假设。子空间假设认为数据是镶嵌在低维子空间中的,线性方法的目的是找到合适的低维子空间使得异常点(o)在其中区别于正常点(n)。

有鉴于此,在异常检测的第一阶段,为了确定特定的模型是否适合特定的数据集,可以对数据进行探索性和可视化分析。

二、线性回归

在线性回归中,我们假设不同维度的变量具有一定的相关性,并可以通过一个相关系数矩阵进行衡量。因此对于特定的观测值,可以通过线性方程组来建模。在实际应用中,观测值的数量往往远大于数据的维度,导致线性方程组是一个超定方程,不能直接求解。因此需要通过优化的方法,最小化模型预测值与真实数据点的误差。

线性回归是统计学中一个重要的应用,这个重要的应用往往是指通过一系列自变量去预测一个特殊因变量的值。在这种情况下,异常值是根据其他自变量对因变量的影响来定义的,而自变量之间相互关系中的异常则不那么重要。这里的异常点检测主要用于数据降噪,避免异常点的出现对模型性能的影响,因而这里关注的兴趣点主要是正常值(n)

而我们通常所说的异常检测中并不会对任何变量给与特殊对待,异常值的定义是基于基础数据点的整体分布,这里我们关注的兴趣点主要是异常值(o)。

广义的回归建模只是一种工具,这种工具既可以用来进行数据降噪也可以用来进行异常点检测

1.基于自变量与因变量的线性回归

1.1最小二乘法

最小二乘原理(OLS)

最小二乘原理是统计回归中最为基础的理论,具有三个特性——线性性、无偏性和有效性

基于此求解线性回归参数的方法也叫最小二乘法。

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

1.2 梯度下降法

如果把线性回归看作是一个优化问题,优化的目标就是损失函数,即求得在误差最小的情况下的模型参数的值。

(1)损失函数

损失函数是用来衡量样本误差的函数。损失函数与代价函数的区别:

损失函数(Loss Function):单个训练样本的错误;

代价函数(Cost Function):整个训练集的损失函数的平均值;

 

线性回归常用的损失函数是均方误差,一般地,在样本量一定时,评价一个点估计的好坏标准使用的指标总是点估计\large \hat{\theta }与参数真值\large \theta的距离的函数,最常用的函数是距离的平方,由于估计量\large \hat{\theta }具有随机性,可以对该函数求期望,公式表示如下:

(2)优化算法——随机梯度下降

当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来,这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。

然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。

在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)被广泛使用。算法步骤如下:

Step1:先选取一组模型参数的初始值,如随机选取;

Step2:接下来对参数进行多次迭代, 使每次迭代都尽可能降低损失函数的值。

在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失和有关模型参数的导数(梯度), 最后用此结果与预先设定的学习率的乘积作为模型参数在本次迭代的减小量。公式如下所示:

学习率( \large \eta): 代表在每次优化中,能够学习的步长的大小

批量大小( B): 是小批量计算中的训练数据样本的大小

# 小批量梯度下降代码
for i in range(nb_epochs):
    np.random.shuffle(data)
    for batch in get_batches(data,batch_size=60):
        params_grad=evaluate_gradient(loss_function,batch,params)
        params=params-learning_rate*params_grad

相对于随机梯度下降,Mini-batch梯度下降降低了收敛波动性,即降低了参数更新的方差,使得更新更加稳定。相对于全量梯度下降,其提高了每次学习的速度。并且其不用担心内存瓶颈从而可以利用矩阵运算进行高效计算。一般而言每次更新随机选择[50,256]个样本进行学习,但是也要根据具体问题而选择,实践中可以进行多次试验,选择一个更新速度与更次次数都较适合的样本数。mini-batch梯度下降可以保证收敛性,常用于神经网络中。

2.基于异常检测的线性回归

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

三、主成分分析

主成分分析法有别于上述的最小二乘法,它可以寻找到任意k(k<d)维的最优表示超平面从而使得平方投影误差最小化,而不是试图找到一个与数据具有最佳匹配的(d-1)维超平面。

1.PCA方法介绍

与异常检测相关的主成分分析的主要性质如下:

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

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

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

主成分分析比因变量回归能更稳定地处理少数异常值的存在。这是因为主成分分析是根据最优超平面来计算误差的,而不是一个特定的变量。当数据中加入更多的离群点时,最优超平面的变化通常不会大到影响离群点的选择。因此,这种方法更有可能选择正确的异常值,因为回归模型一开始就更准确。
2.归一化、标准化问题——针对数据量纲和取值范围的影响

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

3.案例代码实现

(1)导入相应的库与数据生成和划分

from pyod.models.pca import PCA
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize
from pyod.utils.data import evaluate_print # 指标评价
contamination = 0.1  # 异常值所占比例
n_train = 200  # 训练集数据量
n_test = 100  # 测试集数量量
# 训练集与测试集的生成
X_train, y_train, X_test, y_test = generate_data(
    n_train=n_train, n_test=n_test, contamination=contamination)

 (2) 模型搭建、拟合与 预测

# 模型搭建
clf_name = 'PCA'
clf = PCA() # 参数全为默认参数

clf.fit(X_train,y_train) # 拟合训练数据

# 获取训练集数据的标签和预测得分
y_train_pred = clf.labels_  # 训练集标签
y_train_scores = clf.decision_scores_  # 训练集预测结果得分

# 对测试集进行预测
y_test_pred = clf.predict(X_test)  # 测试集预测结果
y_test_scores = clf.decision_function(X_test)  # 预测异常值的得分

(3)指标评价 

使用ROC和Precision @ Rank n 对模型预测能力进行评估

# 评估并打印结果
print("\nPCA On Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nPCA On Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)

从评价指标来看,模型预测效果较为优秀,能够较好的识别出异常值。

(4)模型结果可视化

visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
              y_test_pred, show_figure=True, save_figure=True)

进一步地从可视化结果来看,模型有效的识别出了异常值。

 

四、回归分析的局限性

(1)为了使回归分析技术有效,数据需要高度相关,并沿着低维子空间对齐。当数据不相关,但在某些区域高度聚集时,这种方法可能不会有效。

(2)数据中的相关性在本质上可能不是全局性的。子空间相关性可能是特定于数据的特定位置的。在这种情况下,由主成分分析发现的全局子空间对于异常检测是次优的

因此,为了 创建更一般的局部子空间模型,有时将线性模型与邻近模型结合起来是有用的。


总结

真实数据中,数据不同属性之间往往具有显著的相关性。在这种情况下,线性建模可以提供一种有效的工具来从底层数据中移除异常值或者进行异常检测。

对于其他基于因变量回归的应用,线性建模是一种工具,去除异常值对于提高此类应用的性能是非常重要的。

在大多数情况下,主成分分析提供了去除异常值和进行异常检测最有效的方法,因为它对存在少数异常值的数据更有鲁棒性

参考文献:

[1] 《Outlier Analysis》——Charu C. Aggarwal

[2] Anomaly Detection: A Survey VARUN CHANDOLA, ARINDAM BANERJEE, and VIPIN KUMAR University of Minnesota

[3] Anomaly Detection: A Tutorial

[4] Data Mining Concepts and Techniques Third Edition

[5] DataWhale开源学习内容:https://github.com/datawhalechina/team-learning-data-mining/tree/master/AnomalyDetection

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值