本單元,我們以大家熟悉的鳶尾花分類案例,看到在Python裡如何實作KNN。除了整個建模流程外,內容亦包含之前理論篇中提到的不同距離的選擇、距離的計算方式(平均或加權)、演算法的選擇及合適K值的找尋等等。
(一) 引入模組
在這裡,我們今天主要用的模型在sklearn.neighbors裡面的KNeighborsClassifier。
其他就是一些我們常用到的計算、繪圖模組,以及sklearn裡面所提供的資料集。
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import metrics
(二) 資料準備
這部分,我們會分兩個重點。第一部分為原始資料的準備,即我們要預測的目標(y值),以及用來預測的特徵(X值)。比方說我們要預測房價的高低,那麼房價就是目標(y值),而我們手邊有的資料為一些房子的坪數、地區、屋齡、樓高等等的資訊,這些就是所謂的特徵(X值)。本單元,我們採用sklearn裡面所提供的鳶尾花資料集,以花萼及花瓣的長度及寬度當作特徵(X值),來預測鳶尾花的種類(y值)。
iris=datasets.load_iris()
X=iris.data
y=iris.target
接下來,我們會將資料區分為訓練集與測試集。值得一提的是,在KNN中,我們可以透過不斷重複不特定隨機種子來交叉測試我們所選的K值是否夠好。而模型建好後,未來在做預測時,我們可以將所有的樣本都拿下去建模,而不必再進行拆分,因為KNN本身概念很簡單,就只是把一個待預測樣本丟進所有已知答案的樣本去進行相似值的找尋而已。
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.3,random_state=1)
(三)模型建立
clf=KNeighborsClassifier(n_neighbors=3,p=2,weights='distance',algorithm='brute')
clf.fit(X_train,y_train)
主要模型: KNeighborsClassifier
n_neighbors: 要取幾個鄰居
p: 選擇距離的計算方式
weights: 投票方式為距離等權重或加權
algorithm:演算法的選擇 (計算效率的考慮)
(四)預測
我們可以透過predict來對測試集的資料進行預測。
clf.predict(X_test)
(五)準確度評估
我們可以透過score來評估模型的準確程度。
clf.score(X_test,y_test)
(六)如何找尋適合的K值
在這邊,我們可以透過最原始的方式,把前述的所有步驟針對不同的K值都進行一次,透過繪圖的方式看到合適K值的範圍。並回到步驟二的部分透過不斷的隨機切割樣本,測試K值得穩定度。
accuracy = []
for k in range(1, 100):
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy.append(metrics.accuracy_score(y_test, y_pred))
k_range = range(1,100)
plt.plot(k_range, accuracy)
plt.show()
今天,我們學會了如何在Python裡實作KNN模型,大家不妨用自己的資料試試看,看看這個模型的效果唷!
程式檔案,歡迎於此下載。