异常检测3:线性模型

1. 引言

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

2. EDA 与 数据可视化

在统计学中,探索性数据分析(EDA)是一种分析数据集以概括其主要特征的方法,通常使用可视化方法。统计模型可用可不用,但主要的是,EDA是为了观察到数据在正式建模或假设检验任务之外的内容。探索性数据分析是John Tukey提出的,鼓励统计学家去研究数据,并尽可能地提出假设,以引领新的数据收集和实验。EDA不同于初始数据分析(Initial Data Analysis,IDA),IDA更集中于检查模型拟合和假设检验所需的假设,并根据需要处理缺失值,以及进行变量转换。EDA包含IDA。
以 breast-cancer-unsupervised-ad 数据集为例做一些简单的数据可视化。

import warnings
warnings.filterwarnings("ignore")

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt 
import seaborn as sns #Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图。
import missingno as msno #当我们拿到数据的时候,数据不一定是完整的,有时候一些特征有缺失值,我们可以通过可视化缺失值来决定我们下一步要进行的操作

# Train_data=pd.read_csv(r"D:\breast-cancer-unsupervised-ad.csv",header=None)
# Train_data.columns = [ 'f'+str(i) if i!=30 else 'label' for i in range(31) ]
columns=['f'+str(i)for i  in range(30)]
columns.append('label')

Train_data = pd.read_csv(r"D:\breast-cancer-unsupervised-ad.csv",names=columns)
Train_data.describe()
# data.describe() #基本统计量
# count   195.000000  #数量
# mean   2744.595385 #均值
# std     424.739407 #标准差
# min     865.000000 #最小值
# 25%    2460.600000 #下四分位
# 50%    2655.900000 #中位数
# 75%    3023.200000 #上四分位
# max    4065.200000 #最大值
# range  3200.200000 #极差max-min
# var       0.154755 #变异系数 std/mean
# dis     562.600000 #四分位间距 75%-25%

Train_data.tail()#与head()函数类似,默认是取dataframe中的最后五行。

numeric_features=['f'+str(i) for i in range(30)]

#相关性分析
numeric=Train_data[numeric_features]
correlation=numeric.corr()

f,ax=plt.subplots(figsize=(14,14))

sns.heatmap(correlation,square=True)
plt.title('Correlation of Numeric with Price',y=1,size=16)
plt.show()

在这里插入图片描述

#每个数值特征的分布可视化
f = pd.melt(Train_data, value_vars=numeric_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=6, sharex=False, sharey=False)
g = g.map(sns.distplot, "value", hist=False, rug=True)
plt.savefig('variable.jpg', dpi=300)  # 保存到本地。当图片比较大时,保存到本地再打开会比较清晰。

在这里插入图片描述

sns.set()
# 因为30个特征生成两两之间的相关性图有30x30 共900个子图,子图看起来很密,也比较吃配置。
# 所以这里只展示前10个特征两两之间的相关性。
sns.pairplot(Train_data[numeric_features[:10]],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’,‘pca’或者一个numpy数组
            random_state=0)
result = tsne.fit_transform(numeric)
x_min, x_max = np.min(result, 0), np.max(result, 0)
result = (result - x_min) / (x_max - x_min)
label = Train_data['label']
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')
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值