機器學習——KNN近鄰演算法

herry_liang發表於2020-11-04

一、KNN演算法概述

  • KNN可以說是最簡單的分類演算法之一,同時,它也是最常用的分類演算法之一,注意KNN演算法是有監督學習中的分類演算法,它看起來和另一個機器學習演算法Kmeans有點像(Kmeans是無監督學習演算法),但卻是有本質區別的。

二、KNN演算法介紹

  • KNN的全稱是K Nearest Neighbors,意思是K個最近的鄰居,從這個名字我們就能看出一些KNN演算法的蛛絲馬跡了。K個最近鄰居,毫無疑問,K的取值肯定是至關重要的。那麼最近的鄰居又是怎麼回事呢?其實啊,KNN的原理就是當預測一個新的值x的時候,根據它距離最近的K個點是什麼類別來判斷x屬於哪個類別。

在這裡插入圖片描述

  • 上圖中綠色的點就是我們要預測的那個點,假設K=3。那麼KNN演算法就會找到與它距離最近的三個點(這裡用圓圈把它圈起來了),看看哪種類別多一些,比如這個例子中是藍色三角形多一些,新來的綠色點就歸類到藍三角了。

在這裡插入圖片描述

  • 但是,當K=5的時候,判定就變成不一樣了。這次變成紅圓多一些,所以新來的綠點被歸類成紅圓。從這個例子中,我們就能看得出K的取值是很重要的。明白了大概原理後,我們就來說一說細節的東西吧,主要有兩個,K值的選取點距離的計算

三、距離計算

  • 要度量空間中點距離的話,有好幾種度量方式,比如常見的曼哈頓距離計算,歐式距離計算等等。不過通常KNN演算法中使用的是歐式距離,這裡只是簡單說一下,拿二維平面為例,二維空間兩個點的歐式距離計算公式如下:
    在這裡插入圖片描述
  • 其實就是計算(x1,y1)和(x2,y2)的距離。擴充到多維空間,則公式變成這樣:

在這裡插入圖片描述

四、K值的選擇

  • 通過上面那張圖我們知道K的取值比較重要,那麼該如何確定K取多少值好呢?答案是通過交叉驗證(將樣本資料按照一定比例,拆分出訓練用的資料和驗證用的資料,比如8:2拆分出部分訓練資料和驗證資料),從選取一個較小的K值開始,不斷增加K的值,然後計算驗證集合的方差,最終找到一個比較合適的K值。

五、程式碼案例

5.1、案例介紹

  • 現有十部電影根據電影中kiss和action的數量,判定該電影的型別。取8部電影為訓練資料,2部電影為驗證資料,最終判定兩部電影的型別是否與真實型別相同,k取多少時模型評估的準確性最高。

5.2、資料準備

  • 在本地磁碟中含有一個movie.csv資料檔案,內容為:
    在這裡插入圖片描述

5.3、程式碼講解

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import LabelEncoder

if __name__=='__main__':
    #讀取本地磁碟中的csv檔案的電影資訊資料
    df = pd.read_csv('D:/BigDataStudy/Python/data/movie.csv',encoding='gbk')
    #knn演算法要求target資料集為數字型別,所以先將目標字串列轉為數字    
    label = LabelEncoder().fit_transform(df['type'])

    #將所有的電影進行82分組,
    #取前8個電影的kiss和action列為特徵列作為訓練資料
    #取後2個電影的kiss和action列為特徵列作為驗證資料
    train,test = df.iloc[:8,1:3],df.iloc[8:,1:3]
    #設定前8個電影為訓練目標資料,後2個電影為真實值
    train_target, test_real_target = label[:8],label[8:]
    #開啟knn模型進行模型訓練,假設近鄰k=5
    knn = KNeighborsClassifier(n_neighbors=5)
    knn.fit(train,train_target)
    #利用留下的兩個電影進行測試驗證
    pred = knn.predict(test)
    print(pred) #預測值
    print('-----------')
    print(test_real_target) #真實值
    print('-----------')
    print(1-abs(pred-test_real_target).sum()/len(pred)) #精確讀
  • 結果:
[0 1]  #預測值
-----------
[0 1]  #真實值
-----------
1.0    #精確讀
  • 結論:結果發現我們建立的模型預測的結果和真實值完全相同,準確性100%,說明k值選擇很合理,在該案例中,由於外部資料較少,所以對於k的選擇較為簡單,不需要進行交叉驗證。在之後會為大家介紹鳶尾花資料集,進行交叉驗證,選擇合適的k值,建立評估模型。

相關文章