贝叶斯优化原理及应用[附XGBoost、LightGBM超参数调优代码][scikit-optimize]

近年来机器学习和深度学习算法被越来越广泛的应用于解决对未知数据的预测问题。由于超参数的选择对模型最终的效果可能有极大的影响,为了使模型达到更好的效果,通常会面临超参数调优问题。但如何选择合适的超参数并没有一个明确的指导,并且同一模型面对随时间变化的数据,其超参数的选择都可能需要随着数据变化进行调节,更何况是原本就分布不同的两份数据。因此,人工指定超参数通常是根据经验或随机的方法进行尝试,深度学习里的“调参工程师”,“炼丹”等说法因此而得名。

既然调参是一个复杂并且耗费时间的工作(由于运行一次模型可能需要耗费一天甚至更长时间),有没有什么自动调参算法可以解放人力并且达到比经验调参更好的效果呢?已经有许多学者在自动化机器学习方向上进行研究,不仅包括超参数自动优化,还有自动化特征工程、自动化算法(模型)选择、自动化的神经体系结构搜索等。目前较常用的自动调参算法有Grid Search(网格调参)和Bayesian Optimization(贝叶斯优化)。网格调参的思路很简单,给要调节的超参数一些选择,如果超参数调节范围为一个连续值则需要将其离散化(如使用等间距采样)。之后遍历所有的超参数组合找到这些组合中最优的方案。然而实际上这些组合中可能不包含全局最优解,并且当要调节的超参数比较多时,产生的组合数也会特别多,为每个组合跑一遍模型验证需要花费大量的时间。对于XGBoost这种可调节超参数很多的模型,为了平衡时间开销和优化结果,通常会进行分组调参,即采用控制变量的方式,先调整部分超参数,将调出的最优超参固定,继续调节还没有调节的超参。在我的上篇博客竞赛常用集成学习框架Boosting算法总结(XGBoost、LightGBM)(附代码)中给出了这种超参调节的代码。这种局部优化的方式可能距离全局最优解更远,但为了平衡时间我们不得不这样做。

我们发现,Grid Search对每种超参数组合都是独立计算的,当次计算不会利用之间计算得到的信息,这就造成了计算的浪费。而贝叶斯优化算法则利用了之间轮计算的信息对之后的超参选择给出指导,基于过去的结果搜索未知参数范围,走向可能是全局最优的方向。贝叶斯优化可以基于不同的代理模型,分为以下三类,并给出基于这三类算法实现的python库:

  • TPE(Tree Parzen Estimator, 树形 Parzen 评估器):Hyperopt, Optuna
  • SMAC(随机森林回归):SMAC3
  • GP(高斯过程):scikit-optimize, GPyOpt, Botorch, spearmint, fmfn/BayesianOptimization

以上总结是Jeff Dean在ICML 2019上关于AutoML的演讲上给出的,原文链接:An Overview of AutoML Libraries Used in Industry。综合考虑到质量和速度,在贝叶斯优化上他推荐使用的库是scikit-optimize。因此下文我们会给出基于高斯过程的贝叶斯优化算法的原理,并在最后给出使用scikit-optimize库对XGBoost和LightGBM的超参数进行贝叶斯优化的代码。

我们的优化目标是使机器学习模型的验证误差最小,也就是说,需要找到自变量为超参数和因变量为验证误差的函数最小值点。为了下文方便说明(其实是懒得画图),我们改为找函数的最大值点,其思想是一致的。贝叶斯优化根据前几轮超参数组合计算出的真实的验证误差,通过高斯过程,

  • 5
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值