K近鄰(k-NN)

一、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模型的可解釋性不強

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末待讳,一起剝皮案震驚了整個濱河市芒澜,隨后出現的幾起案子,更是在濱河造成了極大的恐慌创淡,老刑警劉巖痴晦,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異琳彩,居然都是意外死亡誊酌,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門露乏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碧浊,“玉大人,你說我怎么就攤上這事瘟仿∠淙瘢” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵劳较,是天一觀的道長驹止。 經常有香客問我浩聋,道長,這世上最難降的妖魔是什么幢哨? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任赡勘,我火速辦了婚禮嫂便,結果婚禮上捞镰,老公的妹妹穿的比我還像新娘。我一直安慰自己毙替,他們只是感情好岸售,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厂画,像睡著了一般凸丸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袱院,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天屎慢,我揣著相機與錄音,去河邊找鬼忽洛。 笑死腻惠,一個胖子當著我的面吹牛,可吹牛的內容都是我干的欲虚。 我是一名探鬼主播集灌,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼复哆!你這毒婦竟也來了欣喧?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梯找,失蹤者是張志新(化名)和其女友劉穎唆阿,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體锈锤,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡驯鳖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了牙咏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臼隔。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妄壶,靈堂內的尸體忽然破棺而出摔握,到底是詐尸還是另有隱情,我是刑警寧澤丁寄,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布氨淌,位于F島的核電站泊愧,受9級特大地震影響,放射性物質發(fā)生泄漏盛正。R本人自食惡果不足惜删咱,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豪筝。 院中可真熱鬧痰滋,春花似錦、人聲如沸续崖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽严望。三九已至多艇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間像吻,已是汗流浹背峻黍。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拨匆,地道東北人姆涩。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像涮雷,于是被迫代替她去往敵國和親阵面。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容