前言
因?yàn)槭怯胹klearn來(lái)實(shí)現(xiàn)KNN算法,所以基本上只需要調(diào)用API就可以了溯乒,但是可以理解一個(gè)算法的基本流程编丘。
基本內(nèi)容
- 加載sklearn庫(kù)中的數(shù)據(jù)
- 切分?jǐn)?shù)據(jù)集
- 訓(xùn)練并評(píng)估
- 網(wǎng)格搜索
- 數(shù)據(jù)標(biāo)準(zhǔn)化
準(zhǔn)備數(shù)據(jù)
sklearn中自帶了一些數(shù)據(jù)集买窟,可以使用這些數(shù)據(jù)集來(lái)進(jìn)行練習(xí)胚迫,下面導(dǎo)入手寫(xiě)數(shù)字識(shí)別的數(shù)據(jù)集
from sklearn import datasets
digits = datasets.load_digits()
print(digits.keys())
#output:dict_keys(['data', 'DESCR', 'images', 'target', 'target_names'])
導(dǎo)入數(shù)據(jù)集后,數(shù)據(jù)集類(lèi)似于字典汇恤,可以通過(guò)“點(diǎn)”操作符獲得它相應(yīng)的值棘伴,一般用到的也就是“data”和“target”兩個(gè)鍵來(lái)獲得數(shù)據(jù)的特征矩陣和標(biāo)簽向量:
X = digits.data
y = digits.target
切分
一般為了更好的泛化能力,都將數(shù)據(jù)集切分為訓(xùn)練集和測(cè)試集屁置,訓(xùn)練集用來(lái)訓(xùn)練得到模型焊夸,然后用測(cè)試集來(lái)測(cè)試這個(gè)模型的性能
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
不成文規(guī)定,矩陣大寫(xiě)蓝角,向量小寫(xiě)
訓(xùn)練并評(píng)估
在sklearn中這一部分十分簡(jiǎn)單阱穗,只需要將對(duì)應(yīng)的模型實(shí)例化,然后fit訓(xùn)練集上的數(shù)據(jù)使鹅,再在測(cè)試集上調(diào)用score方法就可以進(jìn)行評(píng)估了
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_train)
knn_clf.score(X_test, y_test) #得分0.975
網(wǎng)格搜索超參數(shù)
在實(shí)例化模型的時(shí)候揪阶,不指定參數(shù)的話,使用的是默認(rèn)的值患朱,其實(shí)K近鄰模型中有幾個(gè)參數(shù)值得注意:
- n_neighbors:整數(shù)鲁僚,默認(rèn)為5,決定考慮幾個(gè)點(diǎn)來(lái)投票
- weights:投票時(shí)是否考慮距離的遠(yuǎn)近,越近的權(quán)重越大
- p:整數(shù)冰沙,考慮使用哪種距離考量侨艾,默認(rèn)值為2,即歐式距離
其實(shí)不只是這些參數(shù)拓挥,具體有哪些參數(shù)可以到官網(wǎng)去查看api唠梨,這些參數(shù)的值為多少時(shí)模型的表現(xiàn)最好呢?我們可以用網(wǎng)格搜索來(lái)查找參數(shù)最好的值
param_grid = [
{
'n_neighbors':[i for i in range(1, 10)],
'weights':['uniform', 'distance'],
'p':[i for i in range(1, 6)]
}
]
knn = KNeighborsClassifier()
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(knn, param_grid)
grid_search.fit(X_train, y_train)
搜索的時(shí)間比較長(zhǎng)侥啤,自己的垃圾電腦用了差不多7分鐘==
fit完之后当叭,可以通過(guò)下面兩個(gè)屬性查看結(jié)果和分?jǐn)?shù):
grid.best_estimator_
# output:
'''
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=7, p=3,
weights='uniform')
'''
grid.best_score_ #會(huì)輸出最好的分?jǐn)?shù)是多少
使用網(wǎng)格搜索的到參數(shù)的值,更新模型后評(píng)估得到果然提高了一點(diǎn)
數(shù)據(jù)標(biāo)準(zhǔn)化
stand = StandardScaler()
stand.fit(X_train)
X_train = stand.transform(X_train)
X_test_stand = stand.transform(X_test)
不知道為何標(biāo)準(zhǔn)化之后的數(shù)據(jù)的評(píng)分還降低了……