一、算法簡介
K 近鄰 (KNN享怀,K Nearest Neighbours) 是一種分類算法羽峰。
算法的思想為:要判斷一個(gè)東西屬于哪一類,看看跟它特征最近似的 K 個(gè)東西都屬于什么添瓷,如果這 K 個(gè)東西屬于 A 類的最多梅屉,那我們就認(rèn)為未知的那個(gè)東西也是 A 類的。
舉個(gè)栗子鳞贷,小明拿到一個(gè)水果坯汤,皮是黃色的,可以剝開搀愧,甜甜的軟軟的惰聂,這時(shí)候麻麻買回來了一串香蕉一袋橘子疆偿,小明發(fā)現(xiàn)香蕉跟你拿的這個(gè)東西好像哦,于是他認(rèn)定自己拿的這個(gè)水果也是香蕉搓幌。這是不是有點(diǎn)像小朋友認(rèn)識(shí)東西的過程呢杆故?
與之前學(xué)習(xí)的算法不同的是,KNN 屬于“非參數(shù)方法”溉愁。也就是說处铛,我們沒有假設(shè)樣本符合什么樣的分布情況,沒有把分類問題轉(zhuǎn)換為求解參數(shù)的過程拐揭。
如圖撤蟆,假設(shè)輸入特征是二元的,我們把樣本數(shù)據(jù)的特征 作為二維平面的點(diǎn)坐標(biāo)投队,并用不同形狀表示樣本的類。那么想要判斷點(diǎn)屬于哪一類爵川,只要把它也放在平面中敷鸦,觀察離它最近的 K(圖中 K = 5)個(gè)點(diǎn),發(fā)現(xiàn)三角形最多寝贡,于是需要預(yù)測(cè)的點(diǎn)就可以被認(rèn)為屬于三角形所代表的類扒披。
我們通常使用“歐氏距離”來表示兩數(shù)據(jù)點(diǎn)的相近程度。當(dāng)輸入特征為多元時(shí)圃泡,假設(shè)平面中有兩點(diǎn) 和
碟案,其距離為
注意:
使用歐氏距離存在一個(gè)問題,如果不同特征的值不在一個(gè)數(shù)量級(jí)上颇蜡,那么數(shù)量級(jí)大的特征將會(huì)對(duì)距離產(chǎn)生決定性影響价说,所以,我們需要先進(jìn)行「數(shù)據(jù)預(yù)處理」风秤,對(duì)特征進(jìn)行縮放鳖目。
二、Python 代碼實(shí)現(xiàn)
示例數(shù)據(jù)地址:GitHub - Avik-Jain/100-Days-Of-ML-Code/datasets
1 數(shù)據(jù)預(yù)處理
# 導(dǎo)入庫
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 導(dǎo)入數(shù)據(jù)
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values
# 分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
# 特征縮放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
2 使用訓(xùn)練集擬合算法
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
classifier.fit(X_train, y_train)
3 預(yù)測(cè)與評(píng)價(jià)
# 使用測(cè)試集預(yù)測(cè)
y_pred = classifier.predict(X_test)
# 生成混淆矩陣
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
歡迎關(guān)注 Evan 的博客