sklearn調包俠之KNN演算法

2021-09-11 16:48:26 字數 2934 閱讀 6928

天下武功,唯快不破。今天就正式講解如何通過《sklearn小抄》武林秘籍,成為一代宗師調包俠。欲練此功,必先自宮;就算自宮,未必成功;若不自宮,也能成功。傳說江湖(機器學習領域)有兩大派別:一是學術派,該派資歷高,家境好,多為名門世家(學歷高,數學好),重基礎(數學推導和理論知識);一是實踐派,以找人切磋為主(實踐為主),多在切磋中提公升能力。《機器學習實戰》系列為學術派,《sklearn調包俠》系列為實踐派,該系列會簡單講解原理,多引用於《機器學習實戰》系列的演算法講解(必要的內力),然後在實操中完成各機器學習演算法。

tips:在本篇中會按小抄詳細過一遍,之後就可能會隨意一些。

計算測試樣本與每個訓練樣本的距離,取前k個距離最小的訓練樣本,最後選擇這k個樣本**現最多的分類,作為測試樣本的分類。

如圖所示,綠色的為測試樣本,當k取3時,該樣本就屬於紅色類;當k取5時,就屬於藍色類了。所以k值的選擇很大程度影響著該演算法的結果,通常k的取值不大於20。

knn演算法原理

資料匯入

我們簡單看下各字段的意思:

我們把資料劃分為特徵和label,前8列為特徵,最後一列為label。

x = data.iloc[:, 0:8]

y = data.iloc[:, 8]

切分資料集

在模型訓練前,需要將資料集切分為訓練集和測試集(73開或者其它),這裡選擇82開,使用sklearn中model_selection模組中的train_test_split方法。

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22)

這裡的test_size為測試集的比例,random_state為隨機種子,這裡可設定任意數字,保證下次執行同樣可以選擇出對應的訓練集和測試集。

資料預處理

這裡沒有對資料進行預處理。

模型訓練與評估

knn演算法使用sklearn.neighbors模組中的kneighborsclassifier方法。常用的引數如下:

在sklearn.neighbors還有乙個變種knn演算法,為radiusneighborsclassifier演算法,可以使用一定半徑的點來取代距離最近的k個點。

接下來,我們通過設定weight和radiusneighborsclassifier,對演算法進行比較。

from sklearn.neighbors import kneighborsclassifier,radiusneighborsclassifier

model1 = kneighborsclassifier(n_neighbors=2)

model1.fit(x_train, y_train)

score1 = model1.score(x_test, y_test)

model2 = kneighborsclassifier(n_neighbors=2, weights='distance')

model2.fit(x_train, y_train)

score2 = model2.score(x_test, y_test)

model3 = radiusneighborsclassifier(n_neighbors=2, radius=500.0)

model3.fit(x_train, y_train)

score3 = model3.score(x_test, y_test)

print(score1, score2, score3)

#result

#0.714285714286 0.701298701299 0.649350649351

可以看出缺省情況的knn演算法結果最好。

交叉驗證

通過上述結果可以看出:預設情況的knn演算法結果最好。這個判斷準確麼?答案是不準確,因為我們只是隨機分配了一次訓練和測試樣本,可能下次隨機選擇訓練和測試樣本,結果就不一樣了。這裡的方法為:交叉驗證。我們把資料集劃分為10折,每次用9折訓練,1折測試,就會有10次結果,求十次的平均即可。當然,可以設定cv的值,選擇不同的折數。

from sklearn.model_selection import cross_val_score

result1 = cross_val_score(model1, x, y, cv=10)

result2 = cross_val_score(model2, x, y, cv=10)

result3 = cross_val_score(model3, x, y, cv=10)

print(result1.mean(), result2.mean(), result3.mean())

# result

# 0.712235133288 0.67966507177 0.64976076555

可以看出,還是預設情況的knn演算法結果最好。

模型調優

無模型調優。

sklearn調包俠之KNN演算法

天下武功,唯快不破。今天就正式講解如何通過 sklearn小抄 武林秘籍,成為一代宗師調包俠。欲練此功,必先自宮 就算自宮,未必成功 若不自宮,也能成功。傳說江湖 機器學習領域 有兩大派別 一是學術派,該派資歷高,家境好,多為名門世家 學歷高,數學好 重基礎 數學推導和理論知識 一是實踐派,以找人切...

sklearn調包俠之邏輯回歸

傳送門 機器學習實戰之logistic回歸 正則化這裡補充下正則化的知識。當乙個模型太複雜時,就容易過擬合,解決的辦法是減少輸入特徵的個數,或者獲取更多的訓練樣本。正則化也是用來解決模型過擬合的一種方法。常用的有l1和l2範數做為正則化項。資料匯入 本次實戰依舊是使用sklearn中的資料集,如圖所...

sklearn調包俠之無敵小抄

scikit learn 以下簡稱為sklearn 是用python開發的機器學習庫,其中包含大量機器學習演算法 資料集,是資料探勘方便的工具。本教程參考 python機器學習及實戰 scikit learn機器學習 和sklearn的官方文件,詳細講解如何使用sklearn實現機器學習演算法。首先...