我使用的版本如下:
Python 3.10 sklearn 1.2.1 |
本文使用python機器學習套件scikit-learn開發k近鄰演算法(K nearest neighbors),並進行訓練、驗證與預測,以下分成四大步驟:
- 建立資料
- 進行訓練
- 進行驗證
- 進行預測
最後提供完整程式碼
k近鄰演算法,k代表訓練資料有幾類,然後會把每個訓練類別建置代表向量,後續進來的資料則會與這些代表向量計算距離,來判斷新進的資料屬於哪一個類別,程式碼如下:
步驟一: 建立資料
#建立資料
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
x = iris.data
y = iris.target
#將資料切割為訓練與測試,test_size = 0.2 代表測試集大小為20%,random_state = 0代表每次都用相同的案例
xTrain, xTest, yTrain, yTest = train_test_split(x,y,test_size=0.2,random_state=0)
我使用sklearn內建的鳶尾花資料集,train_test_split函式主要是將資料集拆分成訓練與測試,test_size=0.2 就是測試資料比例為20%,random_state=0代表每次都用同一筆資料,不會隨機選
步驟二: 進行訓練
#訓練模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(xTrain,yTrain)
K近鄰演算法放在 sklearn.neighbors中,名稱則為 KNeighborsClassifier,fit函式就是訓練。
步驟三:進行驗證
#驗證模型
validation = knn.score(xTest,yTest)
print("20%的測試資料結果為: ",validation)
結果如下:
步驟四:進行預測
#建立假資料進行預測
import numpy as np
fakeData = np.linspace(1,5,20) #先建立1~5裡面隨機取20個值
print("隨機建立的值: ",fakeData)
#鳶尾花一筆資料是4個值,所以我們要把它改成5x4
norFakeData = np.array(fakeData).reshape(5,4);
print("使用reshape變換資料形狀: ",norFakeData)
#預測
predicted = knn.predict(norFakeData);
print("預測結果:", predicted)
我使用numpy的linspace函式,建立20筆介於1~5的資料,如下:
然後我用numpy的reshape功能,把資料轉成knn可以吃的型態,每筆就是四個維度,20筆就是轉成5筆,得到的結果如下:
最後用predict函式進行預測:
以上就是使用scikit-learn開發knn的步驟,完整程式碼如下:
#建立資料
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
x = iris.data
y = iris.target
#將資料切割為訓練與測試,test_size = 0.2 代表測試集大小為20%,random_state = 0代表每次都用相同的案例
xTrain, xTest, yTrain, yTest = train_test_split(x,y,test_size=0.2,random_state=0)
#訓練模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(xTrain,yTrain)
#驗證模型
validation = knn.score(xTest,yTest)
print("20%的測試資料結果為: ",validation)
#建立假資料進行預測
import numpy as np
fakeData = np.linspace(1,5,20) #先建立1~5裡面隨機取20個值
print("隨機建立的值: ",fakeData)
#鳶尾花一筆資料是4個值,所以我們要把它改成5x4
norFakeData = np.array(fakeData).reshape(5,4);
print("使用reshape變換資料形狀: ",norFakeData)
#預測
predicted = knn.predict(norFakeData);
print("預測結果:", predicted)
打完收工,歡迎留言討論交流。
留言列表