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)
gird_search.best_estimator_
返回了最佳的参数
和我们上一次做的不一样,因为用了更复杂的方式CV(交叉验证)
CV是更加准确的
知道最佳分类器的准确度到底多少?
grid_search.best_score_
得到0.98538622129436326
grid_search.best_params_
多加了一个下划线,这是简单的代码原则,不是用户输入的参数
而是用户的算数计算出来的结果,这样的数据都用_结尾
拿到最佳参数对应的分类器
knn_clf = gird.search.best_estimator_这样的返回值就是KneighborsClassifier分类器
我们用
knn_clf.predict(X_test)
就得到此时我们kNN的预测结果
这就是完整使用sl来进行网格搜索寻找最佳超参数的方式
对于GridSearchCV我们还可以传入更多参数,来帮我们更好理解整个搜索过程包括性能上的提速
n_jos
我们创建很多分类器是可以并行处理的
n_jobs就是决定了对你计算器分配几个核来进行并行处理的过程默认为1(单核),如果计算机多核可以设置为2,有4个核可以传4或者3或者2
传-1代表所有核都用于网格搜索
verbose:对搜索过程进行输出,如果我们能看到他每一步搜索每一个参数相应的一些讯息的话,可以帮我们更好理解搜索过程,对应一些大的数据,使用复杂的算法,一个搜索可能运行几个小时,这种情况下有一些输出帮我们了解现在的搜索状态是非常重要的,verbose传入整数越大,就相应信息越小,通常使用2
再用grid_search.fit(X_train,y_train)
60 candidates表示60组参数
时间变快了,因为我们用的是双核
我们可以用更多的距离定义更多的超参数
metric参数:默认minkowskl
我们可以修改这个参数
他被DistanceMetric定义