KNN(K Nearest Neighbors):K近鄰分類算法
KNN算法從訓練集中找到和新數據最接近的K條記錄,而後根據他們的主要分類來決定新數據的類別。python
KNN分類算法是數據挖掘分類技術中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每一個樣本均可以用它最接近的k個鄰居來表明。
KNN算法的核心思想是若是一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具備這個類別上樣本的特性。
該方法在肯定分類決策上
只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法在類別決策時,只與極少許的相鄰樣本有關。
因爲KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來肯定所屬類別的,所以對於
類域的交叉或重疊較多的待分樣本集來講,KNN方法較其餘方法更爲適合。
優勢:
1.簡單,易於理解,易於實現,無需估計參數,無需訓練;
2. 適合對稀有事件進行分類;
3.特別適合於多分類問題(multi-modal,對象具備多個類別標籤), kNN比SVM的表現要好。
缺點:
1.KNN算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其餘類樣本容量很小時,有可能致使當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。 該算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。不管怎樣,數量並不能影響運行結果。
2.該方法的另外一個不足之處是
計算量較大,由於對每個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。
3.可理解性差,沒法給出像決策樹那樣的規則。
改進策略:算法
針對以上算法的不足,算法的改進方向主要分紅了
分類效率和
分類效果兩方面。
分類效率:事先對樣本屬性進行約簡,
刪除對分類結果影響較小的屬性,快速的得出待分類樣本的類別。該算法比較
適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種算法比較容易產生誤分。
分類效果:
採用權值的方法(和該樣本距離小的鄰居權值大)來改進,Han等人於2002年嘗試利用貪心法,針對文件分類實作可調整權重的k最近鄰居法WAKNN (weighted adjusted k nearest neighbor),以促進分類效果;而Li等人於2004年提出因爲不一樣分類的文件自己有數量上有差別,所以也應該依照訓練集合中各類分類的文件數量,選取不一樣數目的最近鄰居,來參與分類。
分類問題的驗證方法:交叉驗證(Cross Validation)
K折交叉驗證(K-fold Cross Validation):設置k=10,那麼咱們把原來的數據集隨機分爲10份,分別爲{D1,D2,D3...D10}
接着,使用D1做爲測試集,{D2,D3...D10}做爲訓練集,計算得分S1
使用D2做爲測試集,{D1,D3...D10}做爲訓練集,計算得分S2
.........
最後,使用D10做爲測試集,{D1,D2...D9}做爲訓練集,計算得分S10
計算{S1,S2,...,S10}的平均值,做爲模型的綜合評分
iris數據集:經常使用的分類實驗數據集,即鳶尾花卉數據集,是一個多重變量數據集,經過包含的4個屬性(花萼長度、花萼寬度、花瓣長度、花瓣寬度)來預測屬於三類鳶尾花中的哪一類。
python中對iris數據集使用KNN分類的簡單實現:
import numpy as np
from sklearn import datasets
#引入iris數據集
iris = datasets.load_iris()
#查看數據規模
iris.data.shape #150行,4列
#查看訓練目標的分類(標籤)
np.unique(iris.target) #共有 0,1,2 三個分類
#切分訓練集
from sklearn.model_selection import train_test_split
#將數據集按7:3切分爲訓練集和測試集(特徵變量和目標變量)
data_train, data_test, target_train, target_test = train_test_split(
iris.data, #特徵數據
iris.target, #目標數據
test_size=0.3) #測試集佔比
# KNN建模(1折交叉驗證)
from sklearn import neighbors
knnmodel = neighbors.KNeighborsClassifier(n_neighbors=3) #n_neighbors參數爲分類個數
knnmodel.fit(data_train,target_train)
knnmodel.score(data_train,target_train)
# 5折交叉驗證
from sklearn.model_selection import cross_val_score
#cross_val_score函數傳入模型、特徵數據、目標數據和 K值
cross_val_score(knnmodel,iris.data,iris.target,cv=5)
#模型預測,獲得分類結果
knnmodel.predict([[0.1,0.2,0.3,0.4]])