简介
真实数据集中不同维度的数据通常具有⾼度的相关性,这是因为不同的属性往往是由相同的基础过程以密切相关的⽅式产⽣的。在古典统计学中,这被称为——回归建模,⼀种参数化的相关性分析。
⼀类相关性分析试图通过其他变量预测单独的属性值,另⼀类⽅法⽤⼀些潜在变量来代表整个数据。前者的代表是 线性回归,后者⼀个典型的例⼦是 主成分分析。本⽂将会⽤这两种典型的线性相关分析⽅法进⾏异常检测。
需要明确的是,这⾥有两个重要的假设:
假设⼀:近似线性相关假设。线性相关假设是使⽤两种模型进⾏异常检测的重要理论基础。
假设⼆:⼦空间假设。⼦空间假设认为数据是镶嵌在低维⼦空间中的,线性⽅法的⽬的是找到合适的低维⼦空间使得异常点(o)在其中区别于正常点(n)。
基于这两点假设,在异常检测的第⼀阶段,为了确定特定的模型是否适合特定的数据集,对数据进⾏探索性和可视化分析是⾮常关键的。
可视化
对breast-cancer-unsupervised-ad.csv数据集进行可视化展示,代码如下:
载入数据及初步可视化
#coding:utf-8
#导⼊warnings包,利⽤过滤器来实现忽略警告语句。
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.switch_backend('agg')
import pdb
import seaborn as sns
#import missingno as msno
columns = ['f'+str(i) for i in range(30)]
columns.append('label')
## 1) 载⼊训练集和测试集;
path = 'data/dataverse_files/'
f=open(path+'breast-cancer-unsupervised-ad.csv')
#Train_data = pd.read_csv(f)
Train_data = pd.read_csv(path+'breast-cancer-unsupervised-ad.csv',names=columns)
#pdb.set_trace()
## 2) 简略观察数据(head()+shape)
Train_data.head()
## 2) 简略观察数据(tail()+shape)
Train_data.tail()
## 1) 通过describe()来熟悉数据的相关统计量
Train_data.describe()
## 2) 通过info()来熟悉数据类型
Train_data.info()
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 Features with Price',y=1,size=16)
plt.savefig('Correlation of Numeric Features with Price'+'.png',format='png',bbox_inches='tight')
#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)
#变量两两之间的相关性
sns.set() #画图的风格
sns.pairplot(Train_data[numeric_features],size = 2 ,kind='scatter',diag_kind='kde')
plt.savefig('correlation.png',format='png',bbox_inches='tight')
#plt.show()
相关图
各属性相关图
可视化:
重点方法讲解
DataFrame.corr(method=‘pearson’, min_periods=1)
参数说明:
method:可选值为{‘pearson’, ‘kendall’, ‘spearman’}
pearson:Pearson相关系数来衡量两个数据集合是否在一条线上面,即针对线性数据的相关系数计算,针对非线性 数据便会有误差。
kendall:用于反映分类变量相关性的指标,即针对无序序列的相关系数,非正太分布的数据
spearman:非线性的,非正太分析的数据的相关系数
min_periods:样本最少的数据量
返回值:各类型之间的相关系数DataFrame表格。
df.melt()
是 df.pivot() 逆转操作函数。简单说就是将指定的列铺开放到行上名为variable(可指定)列,值在value(可指定)列。
https://pandas.pydata.org/pandas-docs/version/0.23/generated/pandas.melt.html
FacetGrid
FacetGrid是seaborn库中的一个类,我们在初始化这个类时只需要给它传一个DataFrame的数据集即可。实例化这个类以后,我么就可以直接使用这个对象的方法绘制需要的图形。
对于数据存在离散特征分别绘制,而不是共用同一坐标轴,就可以用到FacetGrid。
中文seaborn文档
FaceGrid简介
pairplot
pair是成对的意思,即是说这个用来展现变量两两之间的关系,线性、非线性、相关等等
sns.pairplot(data,kind=“reg”,diag_kind=“kde”)
kind:用于控制非对角线上的图的类型,可选"scatter"与"reg"
diag_kind:控制对角线上的图的类型,可选"hist"与"kde"
将 kind 参数设置为 “reg” 会为非对角线上的散点图拟合出一条回归直线,更直观地显示变量之间的关系。
数据降维可视化
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, init='pca', 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.savefig('Visualization of data dimension reduction.png',format='png',bbox_inches='tight')
练习
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
# 生成样本数据
contamination = 0.1 # percentage of outliers
n_train = 200 # number of training points
n_test = 100 # number of testing points
X_train, y_train, X_test, y_test = generate_data(
n_train=n_train, n_test=n_test, contamination=contamination)
# train PCA detector
clf_name = 'PCA'
clf = PCA()
clf.fit(X_train)
# get the prediction labels and outlier scores of the training data
y_train_pred = clf.labels_ # binary labels (0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_ # raw outlier scores
# get the prediction on the test data
y_test_pred = clf.predict(X_test) # outlier labels (0 or 1)
y_test_scores = clf.decision_function(X_test) # outlier scores
# 使用ROC和Precision @ Rank n评估预测pyod.utils.data.evaluate_print()。
from pyod.utils.data import evaluate_print
# evaluate and print the results
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)
# 在培训和测试数据上查看示例输出。
# 通过可视化所有示例中包含的功能来生成可视化。
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
y_test_pred, show_figure=True, save_figure=True)
PCA与KNN做对比:
剩下的待补充~