Python3入门机器学习

2.6 网格搜索与k近邻算法中更多超参数

1.网格搜索过程:
为了让我们更加方便地来使用网格搜索的方式寻找最佳的超参数,sklearn为我们封装了一个专门的网格搜索的方式,叫做“Grid Search”。以下是网格搜索的过程:
(1).准备数据,依然是手写数字数据集。如下:
在这里插入图片描述
(2).在使用Grid Search之前我们要定义搜索的参数,如下:

param_grid = [
     {
         'weights': ['uniform'],
         'n_neighbors': [i for i in range (3, 11)]
     },
    {
        'weights': ['distance'],
        'n_neighbors': [i for i in range (3, 11)],
        'p': [i for i in range (1, 6)]
    }
]

这是一个数组,对于数组中每一个元素是一个字典;每一个字典对应的就是我们要进行的一组网格搜索;每一组网格搜索相应的要列上一组网格搜索中要遍历的每一个参数对应的取值范围。字典的键对应的是参数名称,值是一个列表,在列表中存储键对应的参数的所有的可能的范围。
(3).创建对应的算法:

knn_clf = KNeighborsClassifier()

创建一个我们要进行网格搜索对应的机器学习的算法,这里是对kNN算法进行网格搜索。
(4).引入网格搜索的类,并创建GridSearchCV对应的实例对象:

from sklearn.model_selection import GridSearchCV 
grid_search = GridSearchCV(knn_clf, param_grid)

第一个参数是对哪一个分类器进行网格搜索,第二个参数就是网格搜索相应的参数。
(5).拟合:

grid_search.fit(X_train, y_train)

让grid_search来fit我们的X_train和y_train,这个过程就是基于X_train、y_train我们的训练数据集针对我们定义的所有参数来尝试寻找最佳的那个模型。
得到以下的结果:
在这里插入图片描述
(6).查看一些关键的数值:

grid_search.best_estimator_ 
grid_search.best_score_
grid_search.best_params_ 

以上分别返回的是:
网格搜索搜索到的最佳的分类器对应的参数、准确度、最佳参数。
(7).到最佳的参数对应的分类器,并且得到相应的准确度:

knn_clf = grid_search.best_estimator_ 
knn_clf.score(X_test, y_test)

2.关于参数n_jobs和verbose:
GridSearchCV就是根据我们定义的参数数组来创建很多分类器,从而比较这些分类器谁更好。创建分类器的过程显然是可以并行处理的,n_jobs就决定了为你的计算机分配几个核来进行并行处理的过程。
verbose就是在搜索的过程中进行一些输出。
如下代码:

grid_search = GridSearchCV(knn_clf, param_grid, n_jobs=1, verbose=3)  #verbose就是在搜索的过程中进行一些输出
grid_search.fit(X_train, y_train)

这里设置n_jobs=1,就是单核运行,输出以下的结果:
在这里插入图片描述
以上就是对每一个参数的取值进行搜索的过程。

3.k近邻算法中更多的超参数:
网格搜索就是对不同的超参数进行搜索,事实上kNN算法还有更多的超参数。比如我们还可以使用除了明可夫斯基距离的其他距离,如下:
在这里插入图片描述
在相应的文档中,有一个“metric”这样一个参数,默认的值是明科夫斯基距离,我们可以修改这个参数,以使用其他的距离进行kNN的过程。
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐