K近鄰算法
K最近鄰(kNN,k-Nearest Neighbor):
工作原理:存在一個(gè)樣本數(shù)據(jù)集合,也稱(chēng)作為訓(xùn)練樣本集,并且樣 本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽,即每一個(gè)數(shù)據(jù)與所屬分類(lèi)的一一對(duì)應(yīng) 關(guān)系。輸入沒(méi)有標(biāo)簽的新數(shù)據(jù)后,將新的數(shù)據(jù)的每個(gè)特征與樣本集 中數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較,然后算法提取樣本最相似數(shù)據(jù)(最近鄰) 的分類(lèi)標(biāo)簽。
一般來(lái)說(shuō),只選擇樣本數(shù)據(jù)集中前k個(gè)最相似的數(shù)據(jù),這就是k-近鄰 算法中k的出處,通常k是不大于20的整數(shù)。最后,選擇k個(gè)最相似數(shù) 據(jù)中出現(xiàn)次數(shù)最多的分類(lèi),作為新數(shù)據(jù)的分類(lèi)。
距離度量:
歐氏距離(最常用),曼哈頓距離,馬氏距離,夾角余弦(越接近1,越相似)
k-近鄰算法步驟:
計(jì)算已知類(lèi)別數(shù)據(jù)集中的點(diǎn)與當(dāng)前點(diǎn)之間的距離;
按照距離遞增次序排序;
選取與當(dāng)前點(diǎn)距離最小的k個(gè)點(diǎn);
確定前k個(gè)點(diǎn)所在類(lèi)別的出現(xiàn)頻率;
返回前k個(gè)點(diǎn)所出現(xiàn)頻率最高的類(lèi)別作為當(dāng)前點(diǎn)的預(yù)測(cè)分類(lèi)
k-近鄰算法實(shí)戰(zhàn):數(shù)據(jù)歸一化
如果不同特征變量的量綱級(jí)別相差較大且在建模時(shí)相互影響,我們通常會(huì)對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,該手段稱(chēng)為數(shù)據(jù)標(biāo)準(zhǔn)化或數(shù)據(jù)歸一化。
常見(jiàn)方法有min—max標(biāo)準(zhǔn)化(也稱(chēng)離差標(biāo)準(zhǔn)化):newValue = (oldValue - min) / (max - min)
Z—score標(biāo)準(zhǔn)化(也稱(chēng)均值歸一化)
超參數(shù)優(yōu)化
KNN中的k是一個(gè)超參數(shù),需要人為輸入。從KNN原理中可知,k值對(duì)
算法有極大的影響。
如果選擇的k值較小,就相當(dāng)于較小的鄰域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測(cè), 這時(shí)候只有與輸入實(shí)例較近的(相似的)訓(xùn)練實(shí)例才會(huì)對(duì)預(yù)測(cè)結(jié)果 起作用,但缺點(diǎn)是預(yù)測(cè)結(jié)果會(huì)對(duì)近鄰的實(shí)例點(diǎn)非常敏感。如果鄰近 的實(shí)例點(diǎn)恰好是噪聲,預(yù)測(cè)就會(huì)出錯(cuò)。相反地,如果選擇的k值較大, 就相當(dāng)于較大的鄰域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測(cè)。這時(shí)與輸入實(shí)例較遠(yuǎn) 的(不相似的)訓(xùn)練實(shí)例也會(huì)對(duì)預(yù)測(cè)起作用,使預(yù)測(cè)發(fā)生錯(cuò)誤。
交叉驗(yàn)證優(yōu)化超參數(shù)
模型每次使用不同的訓(xùn)練集和測(cè)試集,有不同的測(cè)試結(jié)果
機(jī)器學(xué)習(xí)追求的是模型在未知數(shù)據(jù)集上的效果,通過(guò)交叉驗(yàn)證進(jìn)一 步提高模型的泛化能力
KNN總結(jié):
一種非參數(shù)、惰性學(xué)習(xí)方法,導(dǎo)致預(yù)測(cè)時(shí)速度慢
當(dāng)訓(xùn)練樣本集較大時(shí),會(huì)導(dǎo)致其計(jì)算開(kāi)銷(xiāo)高
樣本不平衡的時(shí)候,對(duì)稀有類(lèi)別的預(yù)測(cè)準(zhǔn)確率低
KNN模型的可解釋性不強(qiáng)
代碼實(shí)現(xiàn):
例子:鳶尾花分類(lèi)
import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
# 導(dǎo)入鳶尾花數(shù)據(jù)并查看數(shù)據(jù)特征
iris = datasets.load_iris()
print('數(shù)據(jù)量',iris.data.shape)
# 拆分屬性數(shù)據(jù)
iris_X = iris.data
# 拆分類(lèi)別數(shù)據(jù)
iris_y = iris.target
iris_train_X , iris_test_X, iris_train_y ,iris_test_y = train_test_split(iris_X, iris_y, test_size=0.2,random_state=0)
knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(iris_train_X, iris_train_y)
predict_result=knn.predict(iris_test_X)
print('預(yù)測(cè)結(jié)果',predict_result)
# 計(jì)算預(yù)測(cè)的準(zhǔn)確率
print('預(yù)測(cè)準(zhǔn)確率',knn.score(iris_test_X, iris_test_y)) #knn.score()涵義先做預(yù)測(cè),再比較
回歸
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsRegressor
neigh = KNeighborsRegressor(n_neighbors=2)
neigh.fit(X, y)
print(neigh.predict([[1.5]]))








暫無(wú)數(shù)據(jù)