一、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值,建立評估模型。