一份关于“自动调参”的秘籍

一份关于“自动调参”的秘籍

在机器学习中,模型的参数调整是非常重要的一件事,如果能找到合适的参数,那么模型的泛化能力就会得到很大的提升。

但现实是,模型有很多参数,而且这些参数的取值范围也都很大。如果用人工手动去调整,既费时又费力。

好在,scikit-learn给我们提供了一个自动调参的解决方案——网格搜索

GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。

数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力,巨大的优势面前,还是试一试吧,后续可以再拿bagging再优化。

参数说明

class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise’, return_train_score=’warn’) 接下来介绍三个重要参数,其他参数默认即可:
(1) estimator
选择使用的分类器,并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法:estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features=‘sqrt’,random_state=10)
(2) param_grid
需要最优化的参数的取值,值为字典或者列表,例如:
a = {“C”:[0.1, 1, 10], “gamma”: [0.1, 0.2, 0.3]},这样我们就会有9种超参数的组合来进行网格搜索,选择一个拟合分数最好的超平面系数。
(3) cv=None
交叉验证参数,即将训练集分成多少份来进行交叉验证。默认是3,。如果样本较多的话,可以适度增大cv的值。

属性

(1)best_score_ : float best_estimator的分数
(2)best_params_ : dict 在保存数据上给出最佳结果的参数设置
(3)grid_scores_:给出不同参数情况下的评价结果
(4)best_estimator_ :查看最佳参数对应的模型

划分验证集的必要性

在介绍网格搜索之前,我们先来回顾下模型调参的简单流程。
首先,我们建立一个模型,将数据集分成训练集和测试集;然后,我们用模型拟合训练集,用测试集来评价模型的精度;接着,我们更换模型的参数,再次拟合并测试精度;最后,我们选出精度最高时所对应的那个模型参数。
上面的过程看上去好像一气呵成,没什么问题。但实际上,我们在调整参数,反复用测试集测试精度时,测试集已经被“污染”了。换句话说,测试集中的数据在你不断调整参数的过程中已经泄露给了模型。这样模型面对的就不再是全新的数据集,我们也无法真正判断出模型的泛化能力到底如何。

那怎么解决这个问题呢?

我们只需要再额外划分出一块数据集,称之为“验证集”。我们在训练集上拟合模型,在验证集上对模型进行调参,最后在测试集上对模型进行泛化能力的评估。
在这里插入图片描述

带交叉验证的网格搜索

虽然我们上面介绍过,可以将数据分成训练集、验证集和测试集。但我们也可以通过交叉验证的方法来找到模型泛化能力最强时所对应的参数。

在scikit-learn中,我们可以用GridSearchCV(网格搜索)模块来实现:

首先,加载我们的工具

from sklearn.model_selection import GridSearchCV

我们还是使用之前的鸢尾花数据集,用SVC来对其分类

from sklearn.svm import SVC

接下来,我们把SVC中需要调节的参数储存到一个字典中

a = {'C': [0.001, 0.01, 0.1, 1, 10, 100],'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}

SVM最重要的参数有2个:C 和 gamma(高斯核的带宽平方的倒数)

C是惩罚系数,即对误差的宽容度。c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差。当C比较大时,我们的损失函数也会越大,这意味着我们不愿意放弃比较远的离群点。这样我们会有更加多的支持向量,也就是说支持向量和超平面的模型也会变得越复杂,也容易过拟合。反之,当C比较小时,意味我们不想理那些离群点,会选择较少的样本来做支持向量,最终的支持向量和超平面的模型也会简单。scikit-learn中默认值是1。

gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多支持向量的个数影响训练与预测的速度

RBF公式里面的sigma和gamma的关系如下:
在这里插入图片描述
如果gamma设的太大,sigma会很小,sigma很小的高斯分布(正态分布)长得又高又瘦, 会造成只会作用于支持向量样本附近,对于未知样本分类效果很差,存在训练准确率可以很高,(如果让sigma无穷小,则理论上,高斯核的SVM可以拟合任何非线性数据,但容易过拟合)而测试准确率不高的可能,就是通常说的过训练;而如果设的过小,则会造成平滑效应太大,无法在训练集上得到特别高的准确率,也会影响测试集的准确率。

γ主要定义了单个样本对整个分类超平面的影响,当γ比较小时,单个样本对整个分类超平面的影响比较小,不容易被选择为支持向量,反之,当γ比较大时,单个样本对整个分类超平面的影响比较大,更容易被选择为支持向量,或者说整个模型的支持向量也会多。

σ的大小对核函数形状的影响关系见下图
σ越大,f越平滑
σ越大,f越平滑,非线性效能越小,对噪声越不敏感

如果把惩罚系数C和RBF核函数的系数γ一起看,当C比较大, γ比较大时,我们会有更多的支持向量,我们的模型会比较复杂,容易过拟合一些。如果C比较小 , γ比较小时,模型会变得简单,支持向量的个数会少。

注意

使用SVM时,有两个点要注意:

若使用核函数,一定要对Feature做Feature Scaling(Normalization)

若训练集m太小,但Feature数量n很大,则训练数据不足以拟合复杂的非线性模型,这种情况下只能用linear-kernel不能用高斯核

然后,构建我们的分类器:

search = GridSearchCV(SVC(),a,cv=10)

接下来,将鸢尾花数据集分成训练集和测试集

from sklearn.datasets import load_iris
iris = load_iris()
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target)

然后,对训练集进行拟合并进行交叉验证

search.fit(X_train,y_train)

GridSearchCV会自动生成一个新模型,该模型具有最佳的参数,我们看下模型的精度

search.score(X_test,y_test)
0.9736842105263158

同时,我们也可以查看模型选择的参数

search.best_params_
{'C': 1, 'gamma': 1}

而交叉验证的最佳精度保存在best_score_中

search.best_score_
0.9821428571428571

此外,我们还能查看最佳参数对应的模型

search.best_estimator_
SVC(C=1, cache_size=200, class_weight=None, coef0=0.0,
 decision_function_shape='ovr', degree=3, gamma=1, kernel='rbf',
 max_iter=-1, probability=False, random_state=None, shrinking=True,
 tol=0.001, verbose=False)

SVC模型对应的参数就详细的列出来了。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值