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

加星標 ,不迷路 !?

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

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

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

? 正方形該分到哪個類?

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

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

? 取鳶尾花數據集兩個特徵可視化

以上是利用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'時,表示一個已知樣本點距離未知點的距離越小,其投票時所佔權重越大

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

以下用循環來搜索下關於n_neighbors、和p這兩個超參數的最優值。

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

今天的分享就到這裏了,關於kNN還有很多更復雜的超參數的調整,就不一一展示了,請小夥伴們自己在下面親手操作下,會收穫更多哦。kNN思想和實現簡單,目前還在機器學習算法的領域持續的發光發熱,如果你們中有大神路過,還請高擡貴腳,勿踩勿噴!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章