機器學習演算法-K近鄰(KNN)演算法(三):馬絞痛資料--kNN資料預處理+kNN分類pipeline(程式碼附詳細註釋)
step 1:載入所需要的資料集和匯入庫函式
# 下載需要用到的資料集
!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/3K/horse-colic.csv
# 下載資料集介紹
!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/3K/horse-colic.names
# 匯入庫函式
import numpy as np
import pandas as pd
# kNN分類器
from sklearn.neighbors import KNeighborsClassifier
# kNN資料空值填充
from sklearn.impute import KNNImputer
# 計算帶有空值的歐式距離
from sklearn.metrics.pairwise import nan_euclidean_distances
# 交叉驗證
from sklearn.model_selection import cross_val_score
# KFlod的函式
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.pipeline import Pipeline
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
step 2:資料匯入&分析
匯入後資料如下:
資料集介紹:horse-colic.names
資料中的’?‘表示空值,如果我們使用KNN分類器,’?'不能數值,不能進行計算,因此我們需要進行資料預處理對空值進行填充。
這裡我們使用KNNImputer進行空值填充,KNNImputer填充的原來很簡單,計算每個樣本最近的k個樣本,進行空值填充。
我們先來看下KNNImputer的執行原理:
step 3:KNNImputer控制填充-使用和原理介紹
X = [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2, metric='nan_euclidean')
imputer.fit_transform(X)
比如:
帶有空值的歐式距離計算公式:
nan_euclidean_distances([[np.nan, 6, 5], [3, 4, 3]], [[3, 4, 3], [1, 2, np.nan], [8, 8, 7]])
輸出如下:
step 4:KNNImputer空值填充–歐式距離的計算
樣本[1, 2, np.nan] 最近的2個樣本是: [3, 4, 3] [np.nan, 6, 5], 計算距離的時候使用歐式距離,只關注非空樣本。 [1, 2, np.nan] 填充之後得到 [1, 2, (3 + 5) / 2] = [1, 2, 4]
正常的歐式距離:
帶有空值的歐式聚類:
只計算所有非空的值,對所有空加權到非空值的計算上,上例中,我們看到一個有3維,只有第二維全部非空, 將第一維和第三維的計算加到第二維上,所有需要乘以3。
表格中距離度量使用的是帶有空值歐式距離計算相似度,使用簡單的加權平均進行填充。
# load dataset, 將?變成空值
input_file = './horse-colic.csv'
df_data = pd.read_csv(input_file, header=None, na_values='?')
# 得到訓練資料和label, 第23列表示是否發生病變, 1: 表示Yes; 2: 表示No.
data = df_data.values
ix = [i for i in range(data.shape[1]) if i != 23]
X, y = data[:, ix], data[:, 23]
# 檢視所有特徵的缺失值個數和缺失率
for i in range(df_data.shape[1]):
n_miss = df_data[[i]].isnull().sum()
perc = n_miss / df_data.shape[0] * 100
if n_miss.values[0] > 0:
print('>Feat: %d, Missing: %d, Missing ratio: (%.2f%%)' % (i, n_miss, perc))
# 檢視總的空值個數
print('KNNImputer before Missing: %d' % sum(np.isnan(X).flatten()))
# 定義 knnimputer
imputer = KNNImputer()
# 填充資料集中的空值
imputer.fit(X)
# 轉換資料集
Xtrans = imputer.transform(X)
# 列印轉化後的資料集的空值
print('KNNImputer after Missing: %d' % sum(np.isnan(Xtrans).flatten()))
輸出如下:
step 5:基於pipeline模型訓練&視覺化
什麼是Pipeline, 我這裡直接翻譯成資料管道。任何有序的操作有可以看做pipeline,例如工廠流水線,對於機器學習模型來說,這就是資料流水線。 是指資料通過管道中的每一個節點,結果除了之後,繼續流向下游。對於我們這個例子,資料是有空值,我們會有一個KNNImputer節點用來填充空值, 之後繼續流向下一個kNN分類節點,最後輸出模型。
results = list()
strategies = [str(i) for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 18, 20, 21]]
for s in strategies:
# create the modeling pipeline
pipe = Pipeline(steps=[('imputer', KNNImputer(n_neighbors=int(s))), ('model', KNeighborsClassifier())])
# 資料多次隨機劃分取平均得分
scores = []
for k in range(20):
# 得到訓練集合和驗證集合, 8: 2
X_train, X_test, y_train, y_test = train_test_split(Xtrans, y, test_size=0.2)
pipe.fit(X_train, y_train)
# 驗證model
score = pipe.score(X_test, y_test)
scores.append(score)
# 儲存results
results.append(np.array(scores))
print('>k: %s, Acc Mean: %.3f, Std: %.3f' % (s, np.mean(scores), np.std(scores)))
# print(results)
# plot model performance for comparison
plt.boxplot(results, labels=strategies, showmeans=True)
plt.show()
輸出如下:
step 6:結果分析
我們的實驗是每個k值下,隨機切分20次資料, 從上述的圖片中, 根據k值的增加,我們的測試準確率會有先上升再下降再上升的過程。 [3, 5]之間是一個很好的取值,上文我們提到,k很小的時候會發生過擬合,k很大時候會發生欠擬合,當遇到第一下降節點,此時我們可以 簡單認為不在發生過擬合,取當前的k值即可。
相關文章
- 機器學習-K近鄰演算法-KNN機器學習演算法KNN
- 機器學習——KNN(K近鄰)機器學習KNN
- 機器學習——KNN近鄰演算法機器學習KNN演算法
- 機器學習演算法——kNN(k-近鄰演算法)機器學習演算法KNN
- 機器學習實戰2.1. 超詳細的k-近鄰演算法KNN(附Python程式碼)機器學習演算法KNNPython
- educoder 機器學習 --- kNN演算法機器學習KNN演算法
- KNN演算法——分類部分KNN演算法
- 資料探勘——KNN演算法(手寫數字分類)KNN演算法
- 機器學習筆記(KNN演算法)機器學習筆記KNN演算法
- python機器學習演算法——KNN演算法Python機器學習演算法KNN
- 機器學習經典演算法之KNN機器學習演算法KNN
- 【機器學習演算法】KNN鳶尾花種類預測案例和特徵預處理。全md文件筆記(已分享,附程式碼)機器學習演算法KNN特徵筆記
- 機器學習經典分類演算法 —— k-近鄰演算法(附python實現程式碼及資料集)機器學習演算法Python
- 什麼是機器學習分類演算法?【K-近鄰演算法(KNN)、交叉驗證、樸素貝葉斯演算法、決策樹、隨機森林】機器學習演算法KNN隨機森林
- 手勢識別演算法: 資料濾波演算法、資料分演算法——KNN演算法KNN
- 什麼是機器學習的分類演算法?【K-近鄰演算法(KNN)、交叉驗證、樸素貝葉斯演算法、決策樹、隨機森林】機器學習演算法KNN隨機森林
- 最基礎的分類演算法(KNN)演算法KNN
- 機器學習分享——KNN演算法及numpy實現機器學習KNN演算法
- K-最近鄰法(KNN)簡介KNN
- KNN演算法的資料歸一化--Feature ScalingKNN演算法
- 演算法實踐:KNN分類(day08)演算法KNN
- KNN演算法實驗KNN演算法
- scikit-learn中KNN演算法資料歸一化的分裝KNN演算法
- KNN 演算法-理論篇-如何給電影進行分類KNN演算法
- 機器學習實踐篇第二篇-KNN演算法學習機器學習KNN演算法
- 資料結構與演算法-kd二叉樹(kNN)資料結構演算法二叉樹KNN
- 機器學習——K近鄰演算法機器學習演算法
- sklearn學習 第一篇:knn分類KNN
- 演算法金 | 再見!!!KNN演算法KNN
- 機器學習 第5篇:knn迴歸機器學習KNN
- 【機器學習】機器學習建立演算法第2篇:K-近鄰演算法【附程式碼文件】機器學習演算法
- 機器學習_K近鄰Python程式碼詳解機器學習Python
- 演算法(八):圖解KNN演算法演算法圖解KNN
- KNN演算法推理與實現KNN演算法
- 機器學習演算法之K近鄰演算法機器學習演算法
- 機器學習演算法(三):K近鄰(k-nearest neighbors)初探機器學習演算法REST
- 分類演算法-k 鄰近演算法演算法
- 機器學習-11-k近鄰演算法機器學習演算法