Python 中的超参数调优
Alex Scriven
Data Scientist
目前为止,我们做的都是"非知情"搜索:
非知情搜索:每次超参数调优迭代都不会从前一次学习。
这使我们可以并行化。但效率并不高,对吗?
目前流程:

另一种方式:

基本的知情搜索方法:
先用粗粒度的随机搜索,再逐步细化。
流程:
在第 (3) 步前也可再做几轮随机搜索
由粗到细调优的优势:
无需在效果差的搜索空间浪费时间!
注意:这是对一批模型的知情,而非单个模型。
来看一个示例,这些是超参数范围:
max_depth_list 在 1 到 65 之间min_sample_list 在 3 到 17 之间learn_rate_list 在 0.01 到 150 之间的 150 个值我们有多少种模型组合?
combinations_list = [list(x) for x in product(max_depth_list, min_sample_list, learn_rate_list)]
print(len(combinations_list))
134400
先对 500 个随机组合做搜索。
我们来绘制准确率分布:

哪些模型表现较好?
最佳结果:
| max_depth | min_samples_leaf | learn_rate | accuracy |
|---|---|---|---|
| 10 | 7 | 0.01 | 96 |
| 19 | 7 | 0.023355705 | 96 |
| 30 | 6 | 1.038389262 | 93 |
| 27 | 7 | 1.11852349 | 91 |
| 16 | 7 | 0.597651007 | 91 |
将 max_depth 与准确率对比可视化:

min_samples_leaf 低于 8 表现更好

learn_rate 高于 1.3 表现更差

第一轮得到的信息:
max_depth 在 8 到 30 之间learn_rate 小于 1.3min_samples_leaf 或许小于 8下一步?用这些信息再做一次随机或网格搜索!
注意:这只是二元分析。你也可以在一张图上探索多个超参数(3、4 个或更多),但超出本课程范围。
Python 中的超参数调优