机器学习入门 4-6 网格搜索与k近邻算法中更多超参数

  • 2019 年 11 月 13 日
  • 筆記

本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍使用sklearn网格搜索寻找最好的超参数以及kNN计算两个数据点距离的其他距离定义。

sklearn网格搜索

使用网格搜索的方式来找最好的超参数。在前面一个小节中,我们通过自己写的for循环来寻找最好的超参数。但是超参数之间并不都是相互独立的,有些超参数之间是存在相互依赖的关系的。比如在前一小节中超参数p,只有在weights参数为"distance"的时候才有意义。

为了更方便的让我们通过网格搜索的方式来寻找最好的超参数,sklearn为我们封装了一个专门进行网格搜索的方式叫:“Grid Search”。

在使用Grid Search之前,我们要定义需要进行搜索的参数。将搜索的参数定义在一个param_grid列表中:

  1. 列表中每一个元素是一个字典;
  2. 字典中定义的是一组网格搜索,字典中键名称为参数名,键对应的值是一个列表,列表中元素是键所对应的参数中所有可能的范围。

超参数之间的依赖关系,通过定义在相同字典中来表示的。只有在weights = "distance"的时候超参数p才有意义。

通过grid_search获取最优分类精度以及分类参数:

获取网格搜索后最好的模型,其实看第9个cell已经看出,grid_search.best_estimater_返回的是拥有通过网格搜索得到最好超参数的kNN对象,因此可以将其直接赋值,通过赋值后的对象进行一些列kNN操作。

sklearn的Grid Search其他参数

Sklearn中Grid Search中其他重要参数:

  1. n_jobs:其实grid Search简单来说就是创建很多个分类器,然后通过交叉验证的方式,看看那个超参数对应的分类器更好,创建很多分类器的这个过程是可以并行处理的。n_jobs就决定了为你的计算机分配几个核来进行这种并行处理的过程,n_jobs参数默认为1,也就是使用单核的方式进行处理,如果你的计算机有多个核可以传入相应的使用核的数量,同时可以传入-1,此时计算机中的所有核全都应用网格搜索的过程。
  2. verbose:在搜索的过程中进行一些输出,整数值,对应的整数值越大,输出的信息也就越详细。

kNN更多距离定义

定义训练集中的数据点与新的数据点之间的距离,默认使用的是明科夫斯基距离,对应的p = 2,也就是欧拉距离的定义,当然kNN中还有其他距离可以使用:

在定义kNN对象的时候,有一个metric的参数,默认使用的是明科夫斯基距离,我们可以传入其他的值来定义其他的距离。传入的参数是一个字符串,此时在sklearn中被DistanceMetric这个类定义。