本筆記為參加阿里云“天池龍珠計(jì)劃 機(jī)器學(xué)習(xí)訓(xùn)練營”所做的學(xué)習(xí)記錄掐场,代碼及知識(shí)內(nèi)容均來源于訓(xùn)練營泣矛,本人稍作擴(kuò)充。
具體活動(dòng)內(nèi)容請(qǐng)移步阿里云天池龍珠計(jì)劃; 同時(shí)感謝公眾號(hào)“機(jī)器學(xué)習(xí)煉丹術(shù)”的介紹、推廣和組織。
2.4 算法實(shí)戰(zhàn)
2.4.1 Demo數(shù)據(jù)集--kNN分類
Step1: 庫函數(shù)導(dǎo)入
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
Step2: 數(shù)據(jù)導(dǎo)入
# 使用鶯尾花數(shù)據(jù)集的前兩維數(shù)據(jù),便于數(shù)據(jù)可視化
iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target
Step3: 模型訓(xùn)練&可視化
k_list = [1, 3, 5, 8, 10, 15]
h = .02
# 創(chuàng)建不同顏色的畫布
cmap_light = ListedColormap(['orange', 'cyan', 'cornflowerblue'])
cmap_bold = ListedColormap(['darkorange', 'c', 'darkblue'])
plt.figure(figsize=(15,14))
# 根據(jù)不同的k值進(jìn)行可視化
for ind,k in enumerate(k_list):
clf = KNeighborsClassifier(k)
clf.fit(X, y)
# 畫出決策邊界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
# 根據(jù)邊界填充顏色
Z = Z.reshape(xx.shape)
plt.subplot(321+ind)
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
# 數(shù)據(jù)點(diǎn)可視化到畫布
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold,
edgecolor='k', s=20)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("3-Class classification (k = %i)"% k)
plt.show()
Step4: 原理簡析
如果選擇較小的K值洞就,就相當(dāng)于用較小的領(lǐng)域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測盆繁,例如當(dāng)k=1的時(shí)候,在分界點(diǎn)位置的數(shù)據(jù)很容易受到局部的影響旬蟋,圖中藍(lán)色的部分中還有部分綠色塊油昂,主要是數(shù)據(jù)太局部敏感。當(dāng)k=15的時(shí)候倾贰,不同的數(shù)據(jù)基本根據(jù)顏色分開冕碟,當(dāng)時(shí)進(jìn)行預(yù)測的時(shí)候,會(huì)直接落到對(duì)應(yīng)的區(qū)域匆浙,模型相對(duì)更加魯棒安寺。
2.4.2 鶯尾花數(shù)據(jù)集--kNN分類
Step1: 庫函數(shù)導(dǎo)入
import numpy as np
# 加載鶯尾花數(shù)據(jù)集
from sklearn import datasets
# 導(dǎo)入KNN分類器
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
Step2: 數(shù)據(jù)導(dǎo)入&分析
# 導(dǎo)入鶯尾花數(shù)據(jù)集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 得到訓(xùn)練集合和驗(yàn)證集合, 8: 2
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
Step3: 模型訓(xùn)練
這里我們設(shè)置參數(shù)k(n_neighbors)=5, 使用歐式距離(metric=minkowski & p=2)
# 訓(xùn)練模型
clf = KNeighborsClassifier(n_neighbors=5, p=2, metric="minkowski")
clf.fit(X_train, y_train)
Step4:模型預(yù)測&可視化
# 預(yù)測
X_pred = clf.predict(X_test)
acc = sum(X_pred == y_test) / X_pred.shape[0]
print("預(yù)測的準(zhǔn)確率ACC: %.3f" % acc)
# Output:
# 預(yù)測的準(zhǔn)確率ACC: 0.967
我們用表格來看一下KNN的訓(xùn)練和預(yù)測過程。這里用表格進(jìn)行可視化:
-
訓(xùn)練數(shù)據(jù)[表格對(duì)應(yīng)list]KNNFig2.jpg
-
knn.fit(X, y)的過程可以簡單認(rèn)為是表格存儲(chǔ)KNNFig3.jpg
3.knn.predict(x)預(yù)測過程會(huì)計(jì)算x和所有訓(xùn)練數(shù)據(jù)的距離首尼。以 ??=[5.,3.6,1.4,0.2]挑庶, ??=0為例,這里我們使用歐式距離進(jìn)行計(jì)算, 預(yù)測過程如下:
3.1 計(jì)算x和所有訓(xùn)練數(shù)據(jù)的距離
KNNFig4.jpg
3.2 根據(jù)距離進(jìn)行編號(hào)排序KNNFig5.jpg
3.3 我們設(shè)置k=5,選擇距離最近的k個(gè)樣本進(jìn)行投票KNNFig6.jpg
3.4: k近鄰的label進(jìn)行投票
nn_labels = [0, 0, 0, 0, 1] --> 得到最后的結(jié)果0软能。
學(xué)習(xí)感想:
可視化那部分好難啊迎捺,死磕了兩天才能理解個(gè)大概。還是要加油學(xué)習(xí)安榕拧凳枝!
參考資料:
B站視頻: Python算法之knn