目錄
StandardScaler的使用
KNeighborsClassifier的使用
代碼實(shí)現(xiàn)
數(shù)據(jù)集介紹
數(shù)據(jù)集為一份紅酒數(shù)據(jù),總共有 178 個(gè)樣本,每個(gè)樣本有 13 個(gè)特征,這里不會(huì)為你提供紅酒的標(biāo)簽,你需要自己根據(jù)這 13 個(gè)特征對(duì)紅酒進(jìn)行分類。部分?jǐn)?shù)據(jù)如下圖:
StandardScaler的使用
由于數(shù)據(jù)中有些特征的標(biāo)準(zhǔn)差比較大,例如 Proline 的標(biāo)準(zhǔn)差大約為 314。如果現(xiàn)在用 kNN 算法來(lái)對(duì)這樣的數(shù)據(jù)進(jìn)行分類的話, kNN 算法會(huì)認(rèn)為最后一個(gè)特征比較重要。因?yàn)榧僭O(shè)有兩個(gè)樣本的最后一個(gè)特征值分別為 1 和 100,那么這兩個(gè)樣本之間的距離可能就被這最后一個(gè)特征決定了。這樣就很有可能會(huì)影響 kNN 算法的準(zhǔn)確度。為了解決這種問(wèn)題,我們可以對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。
標(biāo)準(zhǔn)化的手段有很多,而最為常用的就是 Z Score 標(biāo)準(zhǔn)化。Z Score 標(biāo)準(zhǔn)化通過(guò)刪除平均值和縮放到單位方差來(lái)標(biāo)準(zhǔn)化特征,并將標(biāo)準(zhǔn)化的結(jié)果的均值變成 0 ,標(biāo)準(zhǔn)差為 1。
sklearn 中已經(jīng)提供了 Z Score 標(biāo)準(zhǔn)化的接口 StandardScaler,使用代碼如下:
from sklearn.preprocessing import StandardScaler
data = [[0, 0], [0, 0], [1, 1], [1, 1]]
# 實(shí)例化StandardScaler對(duì)象
scaler = StandardScaler()
# 用data的均值和標(biāo)準(zhǔn)差來(lái)進(jìn)行標(biāo)準(zhǔn)化,并將結(jié)果保存到after_scaler
after_scaler = scaler.fit_transform(data)
# 用剛剛的StandardScaler對(duì)象來(lái)進(jìn)行歸一化
after_scaler2 = scaler.transform([[2, 2]])
print(after_scaler)
print(after_scaler2)
打印結(jié)果如下:
[[-1. -1.]
[-1. -1.]
[ 1. 1.]
[ 1. 1.]]
[[3. 3.]]
根據(jù)打印結(jié)果可以看出,經(jīng)過(guò)準(zhǔn)換后,數(shù)據(jù)已經(jīng)縮放成了均值為 0,標(biāo)準(zhǔn)差為1的分布。
KNeighborsClassifier的使用
想要使用 sklearn 中使用 kNN 算法進(jìn)行分類,只需要如下的代碼(其中 train_feature、train_label 和 test_feature 分別表示訓(xùn)練集數(shù)據(jù)、訓(xùn)練集標(biāo)簽和測(cè)試集數(shù)據(jù)):
from sklearn.neighbors import KNeighborsClassifier
#生成K近鄰分類器
clf=KNeighborsClassifier()
#訓(xùn)練分類器
clf.fit(train_feature, train_label)
#進(jìn)行預(yù)測(cè)
predict_result=clf.predict(test_feature)
但是當(dāng)我們需要調(diào)整 kNN 算法的參數(shù)時(shí),上面的代碼就不能滿足我的需求了。這里需要做的改變?cè)?code>clf=KNeighborsClassifier()這一行中。
KNeighborsClassifier() 的構(gòu)造函數(shù)包含一些參數(shù)的設(shè)定。比較常用的參數(shù)有以下幾個(gè):
- n_neighbors :即 kNN 算法中的 K 值,為一整數(shù),默認(rèn)為 5;
- metric :距離函數(shù)。參數(shù)可以為字符串(預(yù)設(shè)好的距離函數(shù))或者是callable對(duì)象。默認(rèn)值為閔可夫斯基距離;
- p :當(dāng) metric 為閔可夫斯基距離公式時(shí)可用,為一整數(shù),默認(rèn)值為 2,也就是歐式距離。
代碼實(shí)現(xiàn)
函數(shù)需要完成的功能是使用 KNeighborsClassifier 對(duì) test_feature 進(jìn)行分類。其中函數(shù)的參數(shù)如下:
-
train_feature : 訓(xùn)練集數(shù)據(jù),類型為 ndarray;
-
train_label : 訓(xùn)練集標(biāo)簽,類型為 ndarray;文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-501539.html
-
test_feature : 測(cè)試集數(shù)據(jù),類型為 ndarray。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-501539.html
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np
def classification(train_feature, train_label, test_feature):
'''
對(duì)test_feature進(jìn)行紅酒分類
:param train_feature: 訓(xùn)練集數(shù)據(jù),類型為ndarray
:param train_label: 訓(xùn)練集標(biāo)簽,類型為ndarray
:param test_feature: 測(cè)試集數(shù)據(jù),類型為ndarray
:return: 測(cè)試集數(shù)據(jù)的分類結(jié)果
'''
#********* Begin *********#
#實(shí)例化StandardScaler函數(shù)
scaler = StandardScaler()
train_feature = scaler.fit_transform(np.array(train_feature).reshape(133,13))
test_feature = scaler.transform(np.array(test_feature).reshape(45,13))
#生成K近鄰分類器
clf = KNeighborsClassifier()
#訓(xùn)練分類器
clf.fit(train_feature, train_label.astype('int'))
#進(jìn)行預(yù)測(cè)
predict_result = clf.predict(test_feature)
return predict_result
#********* End **********#
到了這里,關(guān)于機(jī)器學(xué)習(xí)——kNN算法之紅酒分類的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!