一、K近鄰算法的基本概念
K近鄰算法逗噩,即是給定一個訓練數據集炉旷,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的K個實例地熄,這K個實例的多數屬于某個類华临,就把該輸入實例分類到這個類中。(這就類似于現實生活中少數服從多數的思想)根據這個說法端考,咱們來看下引自維基百科上的一幅圖:
如上圖所示银舱,有兩類不同的樣本數據,分別用藍色的小正方形和紅色的小三角形表示跛梗,而圖正中間的那個綠色的圓所標示的數據則是待分類的數據寻馏。這也就是我們的目的,來了一個新的數據點核偿,我要得到它的類別是什么诚欠?好的,下面我們根據k近鄰的思想來給綠色圓點進行分類漾岳。
- 如果K=3轰绵,綠色圓點的最鄰近的3個點是2個紅色小三角形和1個藍色小正方形,少數從屬于多數尼荆,基于統計的方法左腔,判定綠色的這個待分類點屬于紅色的三角形一類。
- 如果K=5捅儒,綠色圓點的最鄰近的5個鄰居是2個紅色三角形和3個藍色的正方形液样,還是少數從屬于多數振亮,基于統計的方法,判定綠色的這個待分類點屬于藍色的正方形一類鞭莽。
二坊秸、使用scikit-learn實現k-NN
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
### 加載數據
digits = datasets.load_digits()
X = digits.data
y = digits.target
### 拆分訓練集、測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)
### KNN模型訓練
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train, y_train)
### 測試集結果評估
y_predict = knn_clf.predict(X_test)
accuracy_score(y_test, y_predict)
三澎怒、超參數
k-NN算法有三個常用的超參數
- 尋找最好的k
- 是否考慮距離
- 搜索明可夫斯基距離響應的P
使用網格搜索確定超參數
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
digits = datasets.load_digits()
X = digits.data
y = digits.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)
param_grid = [
{
'weights': ['uniform'],
'n_neighbors': [i for i in range(1, 11)]
},
{
'weights': ['distance'],
'n_neighbors': [i for i in range(1, 11)],
'p': [i for i in range(1, 6)]
}
]
knn_clf = KNeighborsClassifier()
grid_search = GridSearchCV(knn_clf, param_grid)
grid_search.fit(X_train, y_train)
grid_search.best_estimator_
###Output: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',metric_params=None, n_jobs=1, n_neighbors=3, p=3,weights='distance')
grid_search.best_score_
四褒搔、歸一化
均值方差歸一化
### 08 Scikit-learn中的Scaler
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=666)
### scikit-learn中的StandardScaler
standardScalar = StandardScaler()
X_train = standardScalar.transform(X_train)
X_test_standard = standardScalar.transform(X_test)
### 使用歸一化后的數據進行knn分類
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train, y_train)
knn_clf.score(X_test_standard, y_test)
五、k-NN優(yōu)缺點
KNN的主要優(yōu)點有:
1.理論成熟喷面,思想簡單星瘾,既可以用來做分類又可以做回歸
2.可以用于非線性分類
3.訓練時間復雜度比支持向量機之類的算法低
3.和樸素貝葉斯之類的算法比,對數據沒有假設惧辈,準確度高琳状,對異常點不敏感
4.由于KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬的類別咬像,因此對于類域的交叉或重疊較多的待分類樣本集來說算撮,KNN方法較其他方法更為適合
5.該算法比較適用于樣本容量比較大的類域的自動分類,而那些樣本容量比較小的類域采用這種算法比較容易產生誤分類情況
KNN的主要缺點:
1.計算量大县昂,尤其是特征數非常多的時候
2.樣本不平衡的時候肮柜,對稀有類別的預測準確率低
3.KD樹,球樹之類的模型建立需要大量的內存
4.是慵懶散學習方法倒彰,基本上不學習审洞,導致預測時速度比起邏輯回歸之類的算法慢
5.相比決策樹模型,KNN模型的可解釋性不強