超参数调优
- 对模型的超参数进行调优(调参):
我们前面4部分的优化都是基于模型本身的具体形式的优化,那本次5调整的内容是超参数,也就是取不同的超参数的值对于模型的性能有不同的影响。
4.1 参数和超参数
在刚刚的讨论中,我们似乎对模型的优化都是对模型算法本身的改进,比如:岭回归对线性回归的优化在于在线性回归的损失函数中加入L2正则化项从而牺牲无偏性降低方差。但是,大家是否想过这样的问题:在L2正则化中参数 λ 应该选择多少?是0.01、0.1、还是1?到目前为止,我们只能凭经验或者瞎猜,能不能找到一种方法找到最优的参数 λ ?我们很自然的问题就是岭回归中的参数 λ 和参数w之间有什么不一样?事实上,参数w是我们通过设定某一个具体的 λ 后使用类似于最小二乘法、梯度下降法等方式优化出来的,我们总是设定了 λ 是多少后才优化出来的参数w。
因此,类似于参数w一样,使用最小二乘法或者梯度下降法等最优化算法优化出来的数我们称为参数,类似于 λ 一样,我们无法使用最小二乘法或者梯度下降法等最优化算法优化出来的数我们称为超参数。
模型参数是模型内部的配置变量,其值可以根据数据进行估计:
- 参数通常不由编程者手动设置。
- 参数是机器学习算法的关键,它们通常由过去的训练数据中总结得出 。
模型超参数是模型外部的配置,其值无法从数据中估计:
- 超参数通常用于帮助估计模型参数。
- 超参数通常由人工指定。
4.2 优化超参数
- 网格搜索 GridSearchCV():
网格搜索的思想非常简单,比如你有2个超参数需要去选择,那你就把所有的超参数选择列出来分别做排列组合。举个例子: λ=0.01,0.1,1.0 和 α=0.01,0.1,1.0 ,你可以做一个排列组合,即:{[0.01,0.01],[0.01,0.1],[0.01,1],[0.1,0.01],[0.1,0.1],[0.1,1.0],[1,0.01],[1,0.1],[1,1]} ,然后针对每组超参数分别带入模型,然后选择测试误差最小的那组超参数。
网格搜索:class sklearn.model_selection.GridSearchCV(estimator, param_grid, , scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2n_jobs’, error_score=nan, return_train_score=False)- estimator:应用的模型。
- param_grid:字典或字典列表。
- 参数名(str)作为关键字,给参数设置的值放在一个列表或字典中作为值。这样可以探索到任何顺序的参数设置。
scoring:模型评价方法。 - n_jobs : int, 默认=1。并行运行的核数,-1的时候运行你所有的CPU核。
- pre_dispatch : int, or string。控制并行执行期间分派的作业数量。
- cv:交叉验证折数。
- refit :boolean, or string, 默认=True。在整个数据集上使用最佳找到的参数重新估计。对于多指标评价,这需要是一个字符串,来记录找到的最佳的参数,并在都找到后重新估计。
网格搜索结合管道:用Pipeline和GridSearchCV进行流程简化
- 随机搜索 RandomizedSearchCV() :
class sklearn.model_selection.RandomizedSearchCV(estimator, param_distributions, , n_iter=10, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2n_jobs’, random_state=None, error_score=nan, return_train_score=False)
实例:
下面我们使用SVR的例子,结合管道来进行调优: