1. 程式人生 > >輕鬆玩轉 Scikit-Learn 系列 —— KNN 演算法

輕鬆玩轉 Scikit-Learn 系列 —— KNN 演算法

scikit-learn 是最受歡迎的機器學習庫之一,它提供了各種主流的機器學習演算法的API介面供使用者呼叫,讓使用者可以方便快捷的搭建一些機器學習模型,並且通過調參可以達到很高的準確率。

這次我們主要介紹scikit-learn中k近鄰演算法(以下簡稱為KNN)的使用。

KNN是一種非引數機器學習演算法(機器學習中通過模型訓練而學到的是模型引數,而要人工調整的是超引數,請注意避免混淆)。使用KNN首先要有一個已知的資料集D,資料集內對於任意一個未知標籤的樣本資料x,可以通過計算x與D中所有樣本點的距離,取出與x距離最近的前k個已知資料,用該k個已知資料的標籤對x進行投票,哪一類票數最多,x就是哪一類

,這是kNN的大概思想,以下舉個例子方便理解。

59145c471ca2ab493c62479ff97e0b852164c859

正方形該分到哪個類?

在上圖中有2個已知類別——紅色五角星和藍色三角形和一個未知樣本——綠色方格。現在我們要用KNN演算法對綠色方格進行分類,以判定其屬於這兩類中的哪一類,首先令k=5,通過計算距離我們可以知道距離綠色方格最近的5個樣本中(假設綠色方格位於圓心),有2個紅色五角星,3個藍色三角形。通過投票可知:藍色三角形得3票,紅色五角星得2票,因此綠色方格應該屬於藍色三角形。kNN就是這樣工作的。

上圖同時也引申出KNN演算法的一個重要的超引數——k。舉例來說,如果當k=10時,由圖可以看出:紅色五角星投了6票,藍色三角形投了4票,因此未知的樣本應該屬於紅色五角星一類。因此,我們可以看出超引數的選擇會影響最終kNN模型的預測結果。下面用程式碼具體展示如何呼叫scikit-learn使用kNN,並調整超引數。

336699a1c01e5b168fbe568220c813677f2831f3

以上是利用scikit-learn中預設的k近鄰模型來預測未知鳶尾花樣本的種類(假裝未知),我們在例項化模型的過程中並未傳入任何的超引數,則kNN模型會使用模型預設的超引數。

例如:

 ●  metric='minkowski' —— 計算樣本點之間距離的時候會採用明可夫斯基距離,與p=2等價
 ●  n_jobs=1 —— kNN演算法支援cpu多核並行運算;n_jobs=1,預設使用一個核,當n_jobs=-1時,使用所有的核
 ●  n_neighbors=5 —— 表示k=5,即抽取未知樣本附近最近的5個點進行投票

 ●  weights='uniform' —— 表示再利用最近的k個點投票時,他們的權重是等價的,當weights='distance'時,表示一個已知樣本點距離未知點的距離越小,其投票時所佔權重越大

還有一些其他的很重要的超引數,在這裡先暫不說明,以下用程式碼具體展示。

f1de85c33246ca2e24d013bbfa3f632decb08f90

以下用迴圈來搜尋下關於n_neighbors、和p這兩個超引數的最優值。

3e131ccd85ce4a8d5d64f0fd787a215d63280f35

因為我們為了便於視覺化,僅使用了鳶尾花資料集中的2個特徵,所以導致最終預測的準確率不太高,如果使用該資料集的全部特徵來訓練模型並預測未知樣本,傳入最佳超引數的kNN模型,親測準確度可達100%,當然這與鳶尾花資料集的高質量也有關係。執行以上程式碼並列印結果可得如上所示。


原文釋出時間為:2018-11-21

本文作者:蜉蝣扶幽

本文來自雲棲社群合作伙伴“小詹學Python”,瞭解相關資訊可以關注“小詹學Python”。