机器学习领域,在确定好算法之后,也需要确定这个算法需要哪些参数,比如像线性函数那样,y=ax+b 需要确定a和b的值,算法中很多参数也是需要不断摸索才能确定出一个最好的数值,这里就会有两个概念
- 超参数,算法运行之前需要确定的参数
- 模型参数,算法过程中需要确定的参数
这里先记录寻找超参数的方法,会以knn算法为例
为了找出一个机器学习算法中最合适的参数,我们大部分会使用三种方式
- 领域知识
- 经验数值
- 实验搜索
至于前两种,需要很多业务知识和行业经验,这里就不记录了,重点记录下实验搜索这一部分
仍然以knn为例,其实实验搜索的过程就是参数遍历的过程
sklearn中的KNeighborsClassifier()函数中有几个参数是可以设置的
weights : str or callable, optional (default = ‘uniform’)
weight function used in prediction. Possible values:
- ‘uniform’ : uniform weights. All points in each neighborhood are weighted equally.
- ‘distance’ : weight points by the inverse of their distance. in this case, closer neighbors of a query point will have a greater influence than neighbors which are further away.
- [callable] : a user-defined function which accepts an array of distances, and returns an array of the same shape containing the weights.
p : integer, optional (default = 2)
Power parameter for the Minkowski metric. When p = 1, this is equivalent to using manhattan_distance (l1), and euclidean_distance (l2) for p = 2. For arbitrary p, minkowski_distance (l_p) is used.
KNN是通过计算距离来确定需要预判的特征是属于哪一种类型,不过如果仅仅只是通过距离来判断必然是缺乏数学逻辑的,因为事实上将特征数值进行分类,就涉及到好几种分类方法,而sklearn中,KNN算法也加入了几种数学特征来精确最后所得出的预判结果的准确性
weights是权重,KNN中会将需要分类的特征跟其他有标签的特征进行比较,而其实,虽然对每一个特征都计算了距离,但是有些特征的权重会更大,这也会影响最后的结果
p就是要将我们的距离公式,也就是欧拉距离变形成其他距离公式,比如曼哈顿距离和尼可夫斯基距离,这里就不详细记录了
这两个参数是我们主要需要确定下来的
怎么确定呢,其实很简单,weights主要会用到uniform和distance两个参数,uniform就是不考虑权重,distance就是将权重和距离来挂钩,而p是1到正无穷的整数值
然后就开始循环遍历,通过循环权重 ["uniform", "distance"]和range(1,11),我们就可以遍历weights和p的某些数值以求出其中最好的结果
这里可以看到,p的值是range(1,11),为什么这么设置呢,理论上p可以是任意的正整数,不过我们是不可能遍历所有的数值,那么我们只能一点点的尝试,如果p最佳的数值是落在1-10中,那么基本可以说,p的最佳数值是在1-10中了,因为KNN是线性变换的,但是如果落在11,那么p就要尝试10-21的数值,这样一点点尝试,试出最佳数值,这也是实验搜索的一部分
那么在sklearn也有相应的函数可以调用,model_selection 中的GridSearchCV,也就是网格搜索,可以想象出,如果将weights和p分别作为表的横表头和竖表头,而我们需要做的就是尝试表格里面的所有数值,也就是网格搜索
其中GridSearchCV中的n_jobs参数,最好是跟自己电脑的cpu核数一致,多了只会排队,少了运算很慢