KNN描述
- KNN鄰近算法是簡(jiǎn)單的分類與回歸方法,屬于監(jiān)督學(xué)習(xí),也屬于懶散學(xué)習(xí)法。給定一個(gè)訓(xùn)練集(包括訓(xùn)練數(shù)據(jù)和訓(xùn)練標(biāo)簽)和一個(gè)測(cè)試對(duì)象(只有測(cè)試數(shù)據(jù),需要預(yù)測(cè)測(cè)試標(biāo)簽)該算法計(jì)算測(cè)試對(duì)象和每個(gè)訓(xùn)練對(duì)象之間的距離或相似度,這個(gè)測(cè)試對(duì)象在空間K個(gè)最近樣本中大多數(shù)屬于某個(gè)類別,那么這個(gè)測(cè)試對(duì)象的標(biāo)簽就屬于這個(gè)類別。
2.KNN工作原理:存在一個(gè)樣本數(shù)據(jù)集合,也稱為訓(xùn)練樣本集,并且樣本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽,即我們知道樣本集中每個(gè)數(shù)據(jù)所屬的類別。輸入沒有標(biāo)簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個(gè)特征與樣本集中數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較,算法提取樣本最相似(最鄰近)數(shù)據(jù)的分類標(biāo)簽。一般來(lái)說(shuō),只選取樣本集中前k個(gè)最相似的數(shù)據(jù),這就是KNN鄰近算法中k的出處,通常k不大于20的整數(shù)。最后選擇k個(gè)最相似數(shù)據(jù)中出現(xiàn)最多的分類,作為新數(shù)據(jù)的分類
注釋:
k值較小,模型復(fù)雜度較高,容易發(fā)生過(guò)擬合,學(xué)習(xí)的誤差會(huì)增大,預(yù)測(cè)結(jié)果對(duì)鄰近實(shí)例點(diǎn)特別敏感;k值較大可以減少學(xué)習(xí)的誤差,但是學(xué)習(xí)的近似誤差會(huì)增大,與輸入實(shí)例較遠(yuǎn)的訓(xùn)練實(shí)例也會(huì)對(duì)預(yù)測(cè)取到左右;因此,一般選擇k值較小且奇數(shù),也會(huì)用交叉驗(yàn)證法選取最優(yōu)的k值。
下面開始python sklearn的KNN算法
#讀取數(shù)據(jù)
import numpy as np
import pandas as pd
import os
os.chdir('/Users/xy/Desktop/機(jī)器學(xué)習(xí)/Digit Recognizer/digit-recognizer')
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
print(train.head(5),type(train),train.shape)#42000,785
print(test.head(5),type(test),test.shape)#28000,744
數(shù)據(jù)量很大
#提取訓(xùn)練數(shù)據(jù)特征
data = train.iloc[:,1:]
#提取訓(xùn)練標(biāo)簽
label = train.iloc[:,0]
#建立KNN模型
from sklearn import neighbors
model = neighbors.KNeighborsClassifier(n_neighbors=1)
model.fit(data,label)
pre = model.predict(test)
print(pre)
等著跑數(shù)兒中~~~~
經(jīng)過(guò)多次實(shí)驗(yàn),k=1測(cè)試結(jié)果最接近