超参数是不能直接在模型中学习的参数。包括 SVM中的 C, kernel and gamma,Lasso中的 alpha 等。
搜索超参数空间,来得到最佳的交叉验证结果。
搜索由以下部分组成:
- 模型(分类或回归,例如 sklearn.svm.SVC())
- 参数空间
- 候选参数搜索或取样方法
- 交叉验证结构
- 得分函数
一些模型有专业、高效的参数搜索策略,概述如下:scikit-learn提供了两种通用抽样搜索方法:GridSearchCV 穷尽参数的所有组合,RandomizedSearchCV 从指定分布的参数空间中取样。
应该注意到,超参数中的一小部分可能对结果产生较大的影响,而另一些只要保持默认值就可以了,因此应该认真的阅读模型论文来理解模型。
Exhaustive Grid Search
GridSearchCV穷举 param_grid 中的值组成的全部候选项。用所有可能的参数组合去拟合数据,然后留下结果最好的组合。
Randomized Parameter Optimization
RandomizedSearchCV 随机搜索参数,在参数分布中取样,比穷举搜索有两个主要好处:
1 能得到独立于参数数量和参数值的组合;
2 增加参数不影响结果不降低效率。
{'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1),
'kernel': ['rbf'], 'class_weight':['balanced', None]}
这个例子使用了 scipy.stats 模块,包含了很多用于参数抽样的分布,例如 expon、gamma、uniform或者 randint。
对于连续的参数,比如 C,指定一个连续分布以便于充分利用随机化是很重要的,增加迭代次数将得到更好的结果。
Tips
指定一个客观的评价标准
参数搜索使用模型的 score函数来评价参数设置, sklearn.metrics.accuracy_score 用于分类,sklearn.metrics.r2_score用于回归。在一些应用中,其他得分函数更合适(例如非平衡分类中,准确度得分是不合适的)。
合成模型参数空间
模型选择
通过评估各种参数设置的模型选择可以看作是使用标记数据来训练网格参数的一种方法。
最好把数据分位开发集(用来训练GridSearchCV)和评估集(计算效果评估),可以使用 train_test_split 函数。
并行化
GridSearchCV 和 RandomizedSearchCV 在评估参数设置时是独立进行的,因此可以并行进行,使用 n-jobs=-1。
鲁棒性的失败
某些参数设置可能在一折或多折数据上不能拟合。默认情况下,这将导致整个搜索失败,即使一些参数是可以评估的。设置 error_score=0 可以完成整个搜索过程。