KNN算法中的超参数--scikit-learn,python

若如初见. 提交于 2020-03-01 09:55:30

1.超参数:在机器学习中,超参数是指在机器学习之前,提前设置好的参数。而不是由数据训练出来的。
2.KNN算法通过测量观测点与相邻最近点之间的距离,判断观测点所属的类别,而测量距离的方法有很多种。有曼哈顿距离(又称“L1范数”),欧拉距离(又称“L2范数”)以及明科夫斯基距离等。
3.从上述的距离公式中,我们可以得到他们公式的共同点,有一个参数p,曼哈顿距离公式的参数p=1,欧拉距离公式的参数p=2。而在scikit-learn提供的KNN算法中提供了参数p。
4.scikit-learn在KNN算法中还提供了另一个权重的参数(weights),它有两个取值,一个是“uniform”,每个相邻点与观测点的距离的权重都是相同的。另一个取值为“distance”,权重点按其距离的倒数表示。在这种情况下,查询点的近邻比远处的近邻具有更大的影响力。
5.KNN算法中另一个重要的参数就是k,就是看观测点与近邻k个点的距离。

import numpy as np
from sklearn import datasets

digits = datasets.load_digits()
X = digits.data
y = digits.target

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y)

from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train,y_train)

y_predict = knn_clf.predict(X_test)

from sklearn.metrics import accuracy_score

accuracy_score(y_predict,y_test)

best_score = 0.0
best_p = 0.0
%%time

for n in range(1,10):
    for i in ["uniform","distance"]:
        for p in range(1,6):
            knn_clf = KNeighborsClassifier(n_neighbors=n,p=p,weights=i,n_jobs=-1)
            knn_clf.fit(X_train,y_train)
            y_predict = knn_clf.predict(X_test)
            score = accuracy_score(y_predict,y_test)
            if score > best_score:
                best_score = score
                best_p =p

print("best_accuracy_score : ",best_score)
print("best_p : ",best_p)

可以将数据集划分成训练集和测试集,将80%的划分为训练集,20%的划分为测试集。
通过for循环寻找最佳的参数,以此是正确率达到最大。
也可利用网格搜索。

param_grid = [
    {
        "weights":["uniform"],
        "p" : [ i for i in range(1,9)]
    },
    {
        "weights":["distance"],
        "p":[i for i in range(1,9)]
    }
]

from sklearn.model_selection import GridSearchCV

grid_search = GridSearchCV(knn_clf,param_grid)
grid_search.fit(X_train,y_train)
grid_search.best_params_
grid_search.best_score_
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!