KNN演算法實驗

零食7788發表於2024-03-31

1.knn演算法概述
KNN演算法是機器學習演算法中最基礎,最簡單的演算法之一。它既能用於分類,也能用於迴歸。KNN透過測量不同特徵值之間的距離來進行分類。
KNN演算法的思想就是對輸入的特徵向量對應特徵空間的一個點,輸出為該特徵向量所對應的類別標籤或者預測值。
KNN演算法是一種特別的機器學習演算法,沒有一般意義上的學習的過程。工作原理是利用訓練資料對特徵向量空間進行劃分,並將劃分結果作為最終演算法模型,存在一個樣本資料集合,稱作訓練樣本集,並且訓練集的每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。
一般我們只取樣本資料集中前K個最相似的資料,就是KNN演算法中K的含義。通常K是不大於20的整數。
2.KNN演算法介紹
KNN演算法,是有監督學習的分類演算法,可以用於解決分類問題或者回歸問題,但是通常用作分類演算法。
3.KNN的核心思想
KNN 的全稱是 K Nearest Neighbors,意思是 K 個最近的鄰居。KNN 的原理是:當預測一個新樣本的類別時,根據它距離最近的 K 個樣本點是什麼類別來判斷該新樣本屬於哪個類別(多數投票)。
圖中綠色的點就是我們要預測的那個點,假設K=3。那麼KNN演算法就會找到與它距離最近的三個點(這裡用圓圈把它圈起來了),看看哪種類別多一些,比如這個例子中是藍色三角形多一些,新來的綠色點就歸類到藍三角了。
4.k值的選擇
我們可以使用交叉驗證的方式進行K值的選擇,從選取一個較小的K值開始不斷增加K的值,然後計算驗證集合的方差,最終找到一個比較合適的K值。
5.KNN演算法的優劣介紹
優點:
1.簡單易用
2.模型訓練時間快
3.預測效果好
4.對異常值不敏感
缺點:
1.對記憶體要求高,需要儲存所有訓練資料
2.預測階段可能較慢
6.KNN迴歸演算法
上面講到的KNN主要用於分類演算法,事實上KNN也可以用於迴歸預測。
KNN演算法用於迴歸預測的時候尋找K個近鄰,將K個樣本對的目標值取均值即可作為新樣本的預測值。
7.KNN演算法中的距離指標公式
曼哈頓距離L1(xi,xj)=∑nl=1|x(l)i−x(l)j|
歐式距離L2(xi,xj)=(∑nl=1|x(l)i−x(l)j|2)12
8.總結KNN⼯作流程
1.計算待分類物體與其他物體之間的距離;
2.統計距離最近的 K 個鄰居;
3.對於 K 個最近的鄰居,它們屬於哪個分類最多,待分類物體就屬於哪⼀類。
9.基於K鄰近演算法的實驗實現
我寫的是一個鳶尾花分類案例,資料集內建於sklearn庫中,可以直接匯入使用。
`from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.neighbors import KNeighborsClassifier

1.獲取資料集

iris = load_iris()

資料集特徵名稱

print(iris.feature_names)
['sepal length (cm)',
'sepal width (cm)',
'petal length (cm)',
'petal width (cm)']

2.資料預處理

2.1 資料分割

x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.3,random_state=2)

2.2 標準化

transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

3.模型訓練

3.1 例項化分類器

estimator = KNeighborsClassifier(n_neighbors=9)

3.2 使用交叉驗證網格搜尋

estimator-->分類器

param_grid-->指定的資料

cv=5-->5折交叉驗證

params_grid = {"n_neighbors":[1,3,5,7,9,11]}
estimator = GridSearchCV(estimator,param_grid=params_grid,cv=5)

3.3 模型訓練

estimator.fit(x_train,y_train)

4.模型評估

4.1 傳入測試集資料 預測出來的結果跟實際的測試集結果和真實結果

y_pre = estimator.predict(x_test)
print(y_pre)
print(y_test)

4.2 輸出準確率 注意:X-->測試集特徵 y-->測試集真實結果

ret = estimator.score(x_test,y_test)
print("準確率:",ret)
print('最好的模型:',estimator.best_estimator_)
print('最好的得分:',estimator.best_score_)
print('最好的結果:',estimator.cv_results_)
`

相關文章