异常检测(3)—线性模型

感悟:

线性回归PCA都是通过特征之间的相关性进行异常值检测的。

线性回归:相关性分析试图通过其他变量预测单独的属性值进行异常值检测。特征A(特征A中的数据都是正常的)和特征B是线性相关的,可以通过A预测B的数值,如果B的真实值和B的预测值相差较大,那么B特征在该条数据样本中的取值是异常的。
PCA:用一些潜在变量来代表整个数据。对所有的数据计算特征向量,异常样本距离特征向量的距离比较远。

两点假设:

  1. 近似线性相关假设。线性相关假设是使用两种模型进行异常检测的重要理论基础。
  2. 子空间假设。子空间假设认为数据是镶嵌在低维子空间中的,线性方法的目的是找到合适的低维子空间使得异常点(o)在其中区别于正常点(n)。

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

# import warnings
warnings.filterwarnings('ignore')#忽略警告
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno#用于数据分析前的数据检查
#导入数据
path='datasets/breast-cancer-unsupervised-ad.csv'
Train_data=pd.read_csv(path)
#数据显示
Train_data.head().append(Train_data.tail())#数据是没有列名的

在这里插入图片描述

#添加列名
Train_data.columns=['f'+str(i) for i in range(31)]

在这里插入图片描述

#通过info()熟悉数据类型
Train_data.info()

在这里插入图片描述

#describe计算相关统计量
Train_data.describe()

在这里插入图片描述

#相关性分析
correlation=Train_data.corr()
#得出相关性矩阵(不同维度间的变量都具有相关性)—值越小,越不相关
print(correlation)
#疑问1:当特征取值为连续型数据时可以用热力图,当存在离散型数据时怎么处理?

在这里插入图片描述

#使用seaborn进行可视化操作
f,ax=plt.subplots(figsize=(14,14))
sns.heatmap(correlation,square=True)#热力图
plt.title('Correlation of Train_data with price',y=1,size=16)
plt.show()
#颜色越浅,说明相关性越高

在这里插入图片描述

#???将每个特征进行分布可视化
feature_names=['f'+str(i) for i in range(30)]#0-29,f30为object类型
f=pd.melt(Train_data,value_vars=feature_names)#进行数据规整variable:f0 f0 ...f0 f1   value: 
g=sns.FacetGrid(f,col="variable",col_wrap=6,sharex=False,sharey=False)
g=g.map(sns.distplot,"value",hist=False,rug=True)

在这里插入图片描述

#???seaborn学习
#变量两两相关性研究
sns.set()
sns.pairplot(Train_data[feature_names],size=2,kind='scatter',diag_kind='kde')
plt.savefig('correlation.png')
plt.show()

在这里插入图片描述

#数据降维可视化
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, init='pca', random_state=0)
result = tsne.fit_transform(Train_data[feature_names])
x_min, x_max = np.min(result, 0), np.max(result, 0)
result = (result - x_min) / (x_max - x_min)
label = Train_data['f30']
fig = plt.figure(figsize = (7, 7))
#f , ax = plt.subplots()
color = {'o':0, 'n':7}
for i in range(result.shape[0]):
        plt.text(result[i, 0], result[i, 1], str(label[i]),
            color=plt.cm.Set1(color[label[i]] / 10.),
            fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.title('Visualization of data dimension reduction')

在这里插入图片描述

总结

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

各算法推导过程参考资料https://github.com/datawhalechina/team-learning-data-mining/blob/master/AnomalyDetection/%E4%B8%89%E3%80%81%E7%BA%BF%E6%80%A7%E6%A8%A1%E5%9E%8B.md

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrs.King_UP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值