感悟:

线性回归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)]

机器学习异常数据检测 异常检测模型_python_02

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

机器学习异常数据检测 异常检测模型_人工智能_03

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

机器学习异常数据检测 异常检测模型_python_04

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

机器学习异常数据检测 异常检测模型_机器学习_05

#使用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()
#颜色越浅,说明相关性越高

机器学习异常数据检测 异常检测模型_python_06

#???将每个特征进行分布可视化
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)

机器学习异常数据检测 异常检测模型_数据_07

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

机器学习异常数据检测 异常检测模型_人工智能_08

#数据降维可视化
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')

机器学习异常数据检测 异常检测模型_机器学习异常数据检测_09

总结

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

各算法推导过程参考资料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