任務
好壞質檢分類實戰 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),計算其在訓練數據集、測試數據集上的準確率并作圖。
參考資料?
32.36 實戰(二)_嗶哩嗶哩_bilibili
33.37 實戰(三)_嗶哩嗶哩_bilibili
數據準備
數據集名稱:data_class_raw.csv、data_class_processed.csv
點我轉到百度網盤獲取數據集?提取碼: 8497?
1、異常數據檢測
加載數據
#load the data
import pandas as pd
import numpy as np
data = pd.read_csv('data_class_raw.csv')
data.head()
?
x1,x2?是芯片質量相關的兩個維度,y?代表芯片質量是否合格。
#define X and y
X = data.drop(['y'], axis = 1)
y = data.loc[:,'y']
原始數據可視化
#visualize the data
%matplotlib inline
from matplotlib import pyplot as plt
fig1 = 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.legend((good,bad),('good','bad'))
plt.title('raw data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()
根據高斯分布概率密度函數,尋找異常點并剔除
#根據高斯分布概率密度函數,尋找異常點并剔除
#anomay detection
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)[ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1]
找出異常點并畫出異常點
#找出異常點并畫出異常點
fig1 = 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()
2、基于剔除了異常點的數據進行PCA處理
加載數據
#任務二:基于剔除了異常點的數據進行PCA處理
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的預處理
#接下來進行PCA的預處理
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X_norm = StandardScaler().fit_transform(X) # 進行標準化處理
pca = PCA(n_components = 2) # 進行 2 維的PCA處理
X_reduced = pca.fit_transform(X_norm)#參數是標準化之后的數據
#下面計算各個維度上主成分標準差的比例是多少
var_ratio = pca.explained_variance_ratio_
print(var_ratio)#[0.5369408 0.4630592], 對應主成分的標準差的比例
fig4 = plt.figure(figsize = (5,5))
plt.bar([1,2], var_ratio)
plt.show()# 這兩個主成分上的標準差都挺高的,也就意味著這兩個維度的數據都需要進行保留
?3、數據分離
# train and test split: random_state=4, test_size=0.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)
4、KNN 模型進行分類
針對訓練數據集建立KNN模型、進行訓練和預測
#4、建立 KNN 模型完成分類,n_neighbors 取 10,計算分類準確率,可視化分類邊界、
#針對訓練數據集建立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)
計算準確率
#4、建立 KNN 模型完成分類,n_neighbors 取 10,計算分類準確率,可視化分類邊界、
#針對訓練數據集建立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)
?可視化分類邊界
流程:生成一些新的數據組,然后利用模型進行預測,最后畫出模型的預測結果。
生成一些新的數據組
# 可視化分類邊界(生成一些新的數據組,然后利用模型進行預測,最后畫出模型的預測結果)
xx,yy = np.meshgrid(np.arange(0,10,0.05), np.arange(0,10,0.05))#觀察到原來數據是0-10之間
print(xx)
print(yy.shape)# (200, 200), 200行, 200 列
x_range = np.c_[xx.ravel(),yy.ravel()]
#np.c_[xx.ravel(),yy.ravel()] 是 NumPy 中一種常用的數組拼接操作,
#通常與網格坐標生成(例如 np.meshgrid)結合使用,用于創建二維平面上所有可能的坐標點組合
print(x_range.shape) #(40000, 2) , 相當于200 行 200 列的組合
進行預測
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、計算測試數據集對應的混淆矩陣
#5、計算測試數據集對應的混淆矩陣,計算準確率、召回率、特異度、精確率、F1 分數
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_test_predict) #計算測試數據的混淆矩陣
print(cm)
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) 。
這里涉及機器學習等領域的評估指標概念 :
Accuracy(準確率):是一個衡量分類模型性能的指標 。
TP(True Positive,真正例 ):實際為正例且被模型正確預測為正例的樣本數量。
TN(True Negative,真負例 ):實際為負例且被模型正確預測為負例的樣本數量。
FP(False Positive,假正例 ):實際為負例但被模型錯誤預測為正例的樣本數量。
FN(False Negative,假負例 ):實際為正例但被模型錯誤預測為負例的樣本數量 。
accuracy = (TP + TN)/(TP + TN + FP + FN) #0.6428571428571429
print(accuracy#0.6428571428571429
?靈敏度(召回率):正樣本中,預測正確的比例
?Sensitivity = Recall = TP/(TP + FN)
recall = TP/(TP+FN)
print(recall)#0.625
特異度: 負樣本中,預測正確的比例
Specificity = TN/(TN + FP)
specificity = TN/(TN + FP)
print(specificity)#0.6666666666666666
?精確率:預測結果為正的樣本中,預測正確的比例
?Precision = TP/(TP + FP)
precision = TP/(TP + FP)
print(precision)#0.7142857142857143
?precision = TP/(TP + FP)
print(precision)#0.7142857142857143
f1 = 2*precision*recall/(precision + recall)
print(f1)#0.6666666666666666
6、KNN 嘗試不同的 n_neighbors(1-20)
#嘗試不同的 n_neighbors(1-20),計算其在訓練數據集、測試數據集上的準確率并作圖
# try different k and calculate the accuracy for each
n = [i for i in range(1,21)]
# print(n)#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
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') # 訓練數據的準確率, n 是 n_neighbors 參數
plt.title('training accuracy vs n_neighbors')
plt.xlabel('n_neighbors')
plt.ylabel('accuracy')plt.subplot(122)
plt.plot(n, accuracy_test,marker = 'o') # 測試數據的準確率, n 是 n_neighbors 參數
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?