p这个超参数只有在weights = "distance"的时候才有意义

对于一些超参数之间是存在一定依赖关系


sl为我们封装了一个专门网格搜索的方式

Grid Search

首先我们要定义我们搜索的参数

对于我们要搜索的参数,我们定义成param_grid

网格索引算法 网格搜索算法_数组

这是一个数组, 对于数组中每一个元素相应是一个字典,每一个字典就是我们要进行的一组网格搜索,每一组网格搜索相应要列上这一组网格搜索每一个参数对应的取值范围。

创建一个我们要进行网格搜索对应的机器学习的算法

knn_clf = KNeighborsClassifier()

调用网格搜索方式

from sklearn.model_selection import GridSearchCV

grid_search = GridSearchCV(knn_clf,param_grid)

第一个参数是哪一个算法,第二个是网格搜索

%%time

grid_search.fit(X_train,y_train)

网格索引算法 网格搜索算法_数组_02

gird_search.best_estimator_

网格索引算法 网格搜索算法_搜索_03

返回了最佳的参数


和我们上一次做的不一样,因为用了更复杂的方式CV(交叉验证)

CV是更加准确的

知道最佳分类器的准确度到底多少?

grid_search.best_score_

得到0.98538622129436326

grid_search.best_params_

网格索引算法 网格搜索算法_搜索_04

多加了一个下划线,这是简单的代码原则,不是用户输入的参数

而是用户的算数计算出来的结果,这样的数据都用_结尾

拿到最佳参数对应的分类器

knn_clf = gird.search.best_estimator_这样的返回值就是KneighborsClassifier分类器

我们用

knn_clf.predict(X_test)

就得到此时我们kNN的预测结果


这就是完整使用sl来进行网格搜索寻找最佳超参数的方式


对于GridSearchCV我们还可以传入更多参数,来帮我们更好理解整个搜索过程包括性能上的提速

网格索引算法 网格搜索算法_搜索_05

n_jos

我们创建很多分类器是可以并行处理的

n_jobs就是决定了对你计算器分配几个核来进行并行处理的过程默认为1(单核),如果计算机多核可以设置为2,有4个核可以传4或者3或者2

传-1代表所有核都用于网格搜索

网格索引算法 网格搜索算法_并行处理_06

verbose:对搜索过程进行输出,如果我们能看到他每一步搜索每一个参数相应的一些讯息的话,可以帮我们更好理解搜索过程,对应一些大的数据,使用复杂的算法,一个搜索可能运行几个小时,这种情况下有一些输出帮我们了解现在的搜索状态是非常重要的,verbose传入整数越大,就相应信息越小,通常使用2

再用grid_search.fit(X_train,y_train)

网格索引算法 网格搜索算法_并行处理_07

60 candidates表示60组参数

网格索引算法 网格搜索算法_搜索_08

时间变快了,因为我们用的是双核

我们可以用更多的距离定义更多的超参数

网格索引算法 网格搜索算法_网格索引算法_09

metric参数:默认minkowskl 

我们可以修改这个参数

他被DistanceMetric定义