Datawhale组队学习【数据挖掘-异常检测-TASK3】

Datawhale组队学习【数据挖掘-异常检测-TASK3】


前言

异常检测TASK3主要内容:
1 理解线性回归
2 掌握主成分分析的异常检测方法


真实数据集中不同维度的数据通常具有高度的相关性,这是因为不同的属性往往是由相同的基础过程以密切相关的方式产生的。在古典统计学中,这被称为——回归建模,一种参数化的相关性分析。   

一类相关性分析试图通过其他变量预测单独的属性值,另一类方法用一些潜在变量来代表整个数据。前者的代表是 线性回归,后者一个典型的例子是 主成分分析

本文将会用这两种典型的线性相关分析方法进行异常检测。

一、线性回归

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

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

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

广义的回归建模只是一种工具,这种工具既可以用来进行数据降噪也可以进行异常点检测。
参考:https://blog.csdn.net/ice_night/article/details/109675564
用线性回归去拟合曲线,案例展示:

导入一些数据点

import numpy as np
import sklearn.linear_model as linear_model
#第一步,得到训练集exam_data1和测试集exam_data2
exam_data1 = np.array([[1, 2, 3, 4, 5],
                    [57, 70, 76, 84, 91]]).T
# One anomaly replaces a normal point
exam_data2 = np.array([[1, 2, 3, 4, 5],
                      [57, 70, 99, 84, 91]]).T

df = pd.DataFrame()
df['x'] = [1, 2, 3, 4, 5]
df['y1'] = exam_data1[:,1]
df['y2'] = exam_data2[:,1]

可视化

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.figure()
plt.rcParams['font.sans-serif'] = ['Kaiti']  # 指定默认字体
plt.title(u"线性回归发现异常")
plt.xlabel(u"x")
plt.ylabel(u"y")
plt.scatter(df['x'],df['y1'],marker="o",color="b", s=50)
plt.figure()
plt.scatter(df['x'],df['y2'],marker="o",color="b", s=50)

如图:
数据1
数据2
线性模型训练、拟合结果


ftrs, tgt = exam_data1[:,0:1], exam_data1[:,1]
#第二步,利用训练集拟合线性回归模型
lr_train = linear_model.LinearRegression().fit(ftrs, tgt)
print(f'Slope: {lr_train.coef_}')#系数项
print(f'Intercept: {lr_train.intercept_:.{3}}')#截距项
train_scores = (tgt - lr_train.predict(ftrs))**2 
margin = 0.01
threshold = max(train_scores) + margin
print(f'Threshold: {threshold:.{3}}')
#第三步,计算测试集的异常分数
anom_score = (exam_data2[:,1] - lr_train.predict(exam_data2[:,0:1]))**2
print("测试集的异常分数:",anom_score)
print("超过阈值的异常分数:",anom_score[(anom_score>threshold)])
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.figure()
plt.rcParams['font.sans-serif'] = ['Kaiti']  # 指定默认字体
plt.title(u"线性回归发现异常")
plt.xlabel(u"x")
plt.ylabel(u"y")
plt.scatter(df['x'],df['y1'],marker="o",color="b", s=50)
plt.plot(df['x'], lr_train.predict(ftrs), linewidth=3, color="r")

plt.figure()
plt.scatter(df['x'],df['y2'],marker="o",color="b", s=50)
plt.plot(df['x'], lr_train.predict(ftrs), linewidth=3, color="r")

# plt.plot(x_n, y, linewidth=3, color="r")

在这里插入图片描述
在这里插入图片描述
通过拟合曲线,发现异常点。

二、主成分分析

主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。

在实际课题中,为了全面分析问题,往往提出很多与此有关的变量(或因素),因为每个变量都在不同程度上反映这个课题的某些信息。除了做异常检测,PCA还可以用来做数据姜维。

用PCA进行异常检测的原理是:PCA在做特征值分解之后得到的特征向量反应了原始数据方差变化程度的不同方向,特征值为数据在对应方向上的方差大小。所以,最大特征值对应的特征向量为数据方差最大的方向,最小特征值对应的特征向量为数据方差最小的方向。原始数据在不同方向上的方差变化反应了其内在特点。如果单个数据样本跟整体数据样本表现出的特点不太一致,比如在某些方向上跟其它数据样本偏离较大,可能就表示该数据样本是一个异常点。

df_test = df
# 线性回归代码用到的df
from sklearn.decomposition import PCA
pca=PCA(n_components=2) #压缩到二维空间中
x_pca=pca.fit_transform(df_test)
x_pca.shape
plt.scatter(x_pca[:,0],x_pca[:,1],alpha=0.8,edgecolors='none')
plt.show()
pca.explained_variance_ratio_.sum()

在这里插入图片描述

在这里插入图片描述


l=[]
for i,item in enumerate(x_pca):
    if item[0]>-25 or item[1]>0:
        l.append(i)
        print(i)

# 算出异常值,输出了12345

三、回归分析的局限性

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

另一个相关的问题是,数据中的相关性在本质上可能不是全局性的。子空间相关性可能是特定于数据的特定位置的。在这种情况下,由主成分分析发现的全局子空间对于异常检测是次优的。因此,为了创建更一般的局部子空间模型,有时将线性模型与邻近模型结合起来是有用的。

四、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值