机器学习中调参通常调的就是超参数,如何找到一个最好的超参数,除了通过经验,也可以通过网格搜索的方式进行选择
首先我们来看下如何寻找KNN中最好的k
(这里的k即相近节点数)
best_score=0.0
best_k=-1
for k in range(1,11):
knn_clf=KNeighborsClassifier(n_neighbors=k)
knn_clf.fit(x_train,y_trian)
score=knn_clf.score(x_test,y_test)
if score>best_score:
best_score=score
best_k=k
print("best_score=",score)
print("best_k=",k)
我们在KNN算法中考虑距离,有时距离近的点所占投票的权重大更为合适,"distance"考虑权重,"uniform"不考虑权重
best_score=0.0
best_k=-1
best_method=""
for method in ["uniform","distance"]:
for k in range(1,11):
knn_clf=KNeighborsClassifier(n_neighbors=k,weights=method)
knn_clf.fit(x_train,y_trian)
score=knn_clf.score(x_test,y_test)
if score>best_score:
best_score=score
best_k=k
best_method=method
print("best_method=",method)
print("best_score=",score)
print("best_k=",k)
在两点之间的距离上,我们默认使用的是欧拉距离,同时数学中还有曼哈顿距离,结合两者进而提出了 明可夫斯基距离,并获得了一个新的超参数p
明可夫斯基距离采用"distance“方式
best_score=0.0
best_k=-1
best_p=-1
for p in range(1,6):
for k in range(1,11):
knn_clf=KNeighborsClassifier(n_neighbors=k,weights="distance",p=p)
knn_clf.fit(x_train,y_trian)
score=knn_clf.score(x_test,y_test)
if score>best_score:
best_score=score
best_k=k
best_p=p
print("best_p=",p)
print("best_score=",score)
print("best_k=",k)
由于参数和参数之间可能会存在着依赖关系,我们可以采用网格搜索的方式来寻找最优
param_grid=[
{
'weights':['uniform'],
'n_neighbors':[i for i in range(1,11)]
},
{
'weights':['distance'],
'n_neighbors':[i for i in range(1,11)],
'p':[i for i in range(1,6)]
}
]
from sklearn.neighbors import KNeighborsClassifier
knn_clf=KNeighborsClassifier()
from model_selection import GridSearchCV
grid_search=GridSearchCV(knn_clf,param_grid)
grid_search.fit(x_train,y_train)
//找到最好的分类器
grid_search.best_estimator_
grid_search.best_score_
grid_search.best_params_
knn_clf=grid_search.best_estimator_
knn_clf.score(x_test,y_test)
在GridSearchCV中还有一些参数
n_jobs 表示计算机使用几个核来处理运算,-1表示全部使用
verbose 在搜索过程中进行输出
以上是自己观看慕课视频课的笔记,如有错误欢迎批评指正,如有侵权删。