【Sklearn系列】KNN算法


最近鄰分類

概念講解

我們使用的是scikit-learn 庫中的neighbors.KNeighborsClassifier 來實行KNN.

from sklearn import neighbors
neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30,p=2, metric=’minkowski’, metric_params=None, n_jobs=1)

n_neighbors 是用來確定多數投票規則里的K值,也就是在點的周圍選取K個值最為總體范圍

weights : 這個參數很有意思,它的作用是在進行分類判斷的時候給最近鄰的點加上權重,它的默認值是'uniform',也就是等權重,所以在這種情況下我們就可以使用多數投票規則來判斷輸入實例的類別預測。還有一個選擇是'distance',是按照距離的倒數給定權重。在這種情況下,距離輸入實例最近點的類別情況比其他點類別情況更具有說服力。舉個例子假如距離詢問點最近的三個數據點中,有 1 個 A 類和 2 個 B 類,並且假設 A 類離詢問點非常近,而兩個 B 類距離則稍遠。在等權加權中,K(3)NN 會判斷問題點為 B 類;而如果使用距離加權,那么 A 類有更高的權重(因為更近),如果它的權重高於兩個 B 類的權重的總和(類別於多數投票規則使用個數,這里只需要大於B類權重的和就可以了),那么算法會判斷問題點為 A 類。權重功能的選項應該視應用的場景而定。還有最后一種情況就是用戶自己設定權重的設置方法。

algorithm 是分類時采取的算法,有 {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’},一般情況下選擇auto就可以,它會自動進行選擇最合適的算法。

p: 在機器學習系列中,我們知道p=1時,距離方法定義為曼哈頓距離,在p=2的時候我們定為歐幾里得距離。默認值為2。

接下來,我們就要進行fit() 擬合功能,生成一個knn模型。

knn=KNeighborsClassifier()
knn.fit(X,y)

其中X是數組形式(下面的例子中會有注釋講解),在X中的每一組數據可以是 tuple 也可以是 list 或者一維 array,但要注意所有數據的長度必須一樣(等同於特征的數量)。這一點非常的重要。我們可以把X看成是一個矩陣形式,每一行代表的是一個輸入實例的特征數據。

y 是一個和 X 長度相同的 list 或一個一維 array,其中每個元素是 X 中相對應的數據的分類標簽。

接下來就是進行預測:

knn.predict(X)

這里輸入X一個數組,形式類似於(如果是一個二維特征的話):[ [0,1 ] ,[2,1]...]

概略預測

knn.predict_proba(X)

輸出來的是一個數組形式,每一個元素代表了輸入實例屬於這一類的概率。而數組對應的類別的順序是根據y中的大小比較順序參考這里。當然你的輸入實例要是不僅僅是一個而是多個的話,那么輸出也就相應的變成了[[p1,p2],[p3,p4]...]

正確率打分

neighbors.KNeighborsClassifier.score(X, y, sample_weight=None)

我們一般會把我們的訓練數據集分成兩類,一個用作學習並訓練模型,一列用作測試,這個動能就是學習之后進行測試的功能來看一下准確度。

實際例子

首先我們先拿我們在機器學習系列中的KNN算法中的電影分裂舉例。我們在那個系列中自己實現了一個KNN分類器,采取的是歐幾里得的距離,這里我們直接使用sklearn庫中的函數來實現KNN算法,大家可以參考兩者來看。

import numpy as np
import sklearn
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
X_train = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])  #這里是數組形式哦,要注意哦,如果輸入的dataframe(因為一般我們導入文件的話都是使用csv模式,導入進來一般是形成dataframe模式,我們需要在fit()函數中使用 X_train.values,y_train.values)

y_train=['A','A','B','B']
knn=KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
knn.predict([[5,0],[4,0]])#要注意哦,預測的時候也要上使用數組形式的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM