机器学习之数据分离与混淆矩阵(实战)

文章目录

    • 一.任务
    • 二.实战
    • 三.总结

一.任务

好坏质检分类实战task:
1、基于data_class_raw.csv数据,根据高斯分布概率密度函数,寻找异常点并剔除
2、基于data_class_processed.csv数据,进行PCA处理,确定重要数据维度及成分
3、完成数据分离,数据分离参数:random_state=4,test_size=0.4
4、建立KNN模型完成分类,n_neighbors取10,计算分类准确率,可视化分类边界
5、计算测试数据集对应的混淆矩阵,计算准确率、召回率、特异度、精确率、F1分数
6、尝试不同的n_neighbors(1-20),计算其在训练数据集、测试数据集上的准确率并作图

二.实战

#加载数据
import pandas as pd
import numpy as np
data = pd.read_csv('data_class_raw.csv')
data.head()

机器学习之数据分离与混淆矩阵(实战)_第1张图片

#define X and y
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']
#可视化数据
%matplotlib inline
from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(10,10))
bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.legend((good,bad),('good','bad'))
plt.title('raw data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

机器学习之数据分离与混淆矩阵(实战)_第2张图片

#异常检测
from sklearn.covariance import EllipticEnvelope
ad_model = EllipticEnvelope(contamination=0.02)#可以自己试着改变此处的值看看有什么变化
ad_model.fit(X[y==0])
y_predict_bad = ad_model.predict(X[y==0])
print(y_predict_bad)  

在这里插入图片描述
这里并不把X全给到模型进行训练,这是因为好的数据点和坏的数据点实际上距离是很短的,如果全给就很难找到异常点,所以要将好的数据点和坏的数据点分开来给到模型进而来寻找异常点。(这里的-1就是异常点)

#可视化异常点
fig2 = plt.figure(figsize=(5,5))
bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.scatter(X.loc[:,'x1'][y==0][y_predict_bad==-1],X.loc[:,'x2'][y==0][y_predict_bad==-1],marker='x',s=150)
plt.legend((good,bad),('good','bad'))
plt.title('raw data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

机器学习之数据分离与混淆矩阵(实战)_第3张图片
如图,绿叉处就是寻找出的异常点. 至此,任务第一步完成,下面进行第二步。

data = pd.read_csv('data_class_processed.csv')
data.head()
#define X and y
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']
#pca 
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X_norm = StandardScaler().fit_transform(X)
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X_norm)
var_ratio = pca.explained_variance_ratio_
print(var_ratio)
fig4 = plt.figure(figsize=(5,5))
plt.bar([1,2],var_ratio)
plt.show()

机器学习之数据分离与混淆矩阵(实战)_第4张图片
至此第二步完成,下面进行第三步——数据分离

#数据分离
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=4,test_size=0.4) 
print(X_train.shape,X_test.shape,X.shape)

在这里插入图片描述
数据分离完成后,进行第四步,建立knn模型

#knn 模型
from sklearn.neighbors import KNeighborsClassifier
knn_10=KNeighborsClassifier(n_neighbors=10)
knn_10.fit(X_train,y_train)
y_train_predict=knn_10.predict(X_train)
y_test_predict=knn_10.predict(X_test)

#计算准确率
from sklearn.metrics import accuracy_score
accuracy_train=accuracy_score(y_train,y_train_predict)
accuracy_test=accuracy_score(y_test,y_test_predict)
print("training accuracy:",accuracy_train)
print("testing accuracy:",accuracy_test)

在这里插入图片描述
然后可视化分类边界

xx,yy=np.meshgrid(np.arange(0,10,0.05),np.arange(0,10,0.05)) #生成对应的数据组合
print(yy.shape)

在这里插入图片描述

x_range = np.c_[xx.ravel(),yy.ravel()] #转换成两列
print(x_range.shape)

在这里插入图片描述

y_range_predict=knn_10.predict(x_range)
fig4 = plt.figure(figsize=(10,10))
knn_bad = plt.scatter(x_range[:,0][y_range_predict==0],x_range[:,1][y_range_predict==0])
knn_good = plt.scatter(x_range[:,0][y_range_predict==1],x_range[:,1][y_range_predict==1])


bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.legend((good,bad,knn_good,knn_bad),('good','bad','knn_good','knn_bad'))
plt.title('prediction result')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

机器学习之数据分离与混淆矩阵(实战)_第5张图片
接下来进行第五步,计算混淆矩阵

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_test_predict)
print(cm)

在这里插入图片描述
机器学习之数据分离与混淆矩阵(实战)_第6张图片
这四个指标的取值参考上图

TP = cm[1,1]
TN = cm[0,0]
FP = cm[0,1]
FN = cm[1,0]
print(TP,TN,FP,FN)

在这里插入图片描述
根据求得的数值计算相应指标

在这里插入图片描述

accuracy = (TP + TN)/(TP + TN + FP + FN)
print(accuracy)

可以看到通过混淆矩阵计算出来的准确率和我们之前建立knn模型计算出的准确率是一样的
在这里插入图片描述

在这里插入图片描述

recall = TP/(TP + FN)
print(recall)

在这里插入图片描述

在这里插入图片描述

specificity = TN/(TN + FP)
print(specificity)

在这里插入图片描述
在这里插入图片描述

precision = TP/(TP + FP)
print(precision)

在这里插入图片描述
在这里插入图片描述

F1 = 2*precision*recall/(precision+recall)
print(F1)

在这里插入图片描述
下面进行任务最后一步:

#尝试不同的n_neighbors(1-20,计算其在训练数据集、测试数据集上的准确率并作图
n = [i for i in range(1,21)]
accuracy_train = []
accuracy_test = []
for i in n:
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train,y_train)
    y_train_predict = knn.predict(X_train)
    y_test_predict = knn.predict(X_test)
    accuracy_train_i = accuracy_score(y_train,y_train_predict)
    accuracy_test_i = accuracy_score(y_test,y_test_predict)
    accuracy_train.append(accuracy_train_i)
    accuracy_test.append(accuracy_test_i)
print(accuracy_train,accuracy_test)

在这里插入图片描述

fig5 = plt.figure(figsize=(12,5))
plt.subplot(121)
plt.plot(n,accuracy_train,marker='o')
plt.title('training accuracy vs n_neighbors')
plt.xlabel('n_neighbors')
plt.ylabel('accuracy')
plt.subplot(122)
plt.plot(n,accuracy_test,marker='o')
plt.title('testing accuracy vs n_neighbors')
plt.xlabel('n_neighbors')
plt.ylabel('accuracy')
plt.show()

机器学习之数据分离与混淆矩阵(实战)_第7张图片
至此,本次的实战任务就完成了

三.总结

好坏质检分类实战summary:
1、通过进行异常检测,帮助找到了潜在的异常数据点;
2、通过PCA分析,发现需要保留2维数据集;
3、实现了训练数据与测试数据的分离,并计算模型对于测试数据的预测准确率
4、计算得到混淆矩阵,实现模型更全面的评估
5、通过新的方法,可视化分类的决策边界
6、通过调整核心参数n_neighbors值,在计算对应的准确率,可以帮助我们更好的确定使用哪个模型
7、核心算法参考链接:https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier

data_class_raw.
提取码:rrk8

data_class_processed.
提取码:ozhx

你可能感兴趣的:(机器学习之数据分离与混淆矩阵(实战))