【导读】机器学习中,调参是一项繁琐但至关重要的任务,因为它很大程度上影响了算法的性能。手动调参十分耗时,网格和随机搜索不需要人力,但需要很长的运行时间。因此,诞生了许多自动调整超参数的方法。贝叶斯优化是一种用模型找到函数最小值方法,已经应用于机器学习问题中的超参数搜索,这种方法性能好,同时比随机搜索省时。此外,现在有许多Python库可以实现贝叶斯超参数调整。本文将使用Hyperopt库演示梯度提升机(Gradient Boosting Machine,GBM) 的贝叶斯超参数调整的完整示例。文章由贝叶斯优化方法、优化问题的四个部分、目标函数、域空间、优化过程、及结果展示几个部分组成。作者|William Koehrsen
编译|专知
整理|YIngying,李大囧贝叶斯优化方法贝叶斯优化通过基于目标函数的过去评估结果建立替代函数(概率模型),来找到最小化目标函数的值。贝叶斯方法与随机或网格搜索的不同之处在于,它在尝试下一组超参数时,会参考之前的评估结果,因此可以省去很多无用功。超参数的评估代价很大,因为它要求使用待评估的超参数训练一遍模型,而许多深度学习模型动则几个小时几天才能完成训练,并评估模型,因此耗费巨大。贝叶斯调参发使用不断更新的概率模型,通过推断过去的结果来“集中”有希望的超参数。Python中的选择Python中有几个贝叶斯优化库,它们目标函数的替代函数不一样。在本文中,我们将使用Hyperopt,它使用Tree Parzen Estimator(TPE)。其他Python库包括Spearmint(高斯过程代理)和SMAC(随机森林回归)。优化问题的四个部分贝叶斯优化问题有四个部分:目标函数:我们想要最小化的内容,在这里,目标函数是机器学习模型使用该组超参数在验证集上的损失。
域空间:要搜索的超参数的取值范围
优化算法:构造替代函数并选择下一个超参数值进行评估的方法。
结果历史记录:来自目标函数评估的存储结果,包括超参数和验证集上的损失。数据集在本例中,我们将使用Caravan Insurance数据集,其目标是预测客户是否购买保险单。 这是一个有监督分类问题,训练集和测试集的大小分别为5800和4000。评估性能的指标是AUC(曲线下面积)评估准则和ROC(receiver operating characteristic,以真阳率和假阳率为坐标轴的曲线图)曲线,ROC AUC越高表示模型越好。 数据集如下所示:因为Hyperopt最小化目标函数,我们的目标函数返回1-ROC AUC,从而提高ROC AUC。梯度提升模型梯度提升机(GBM)是一种基于使用弱学习器(如决策树)组合成强学习器的模型。 GBM中有许多超参数控制整个集合和单个决策树,如决策树数量,决策树深度等。简单了解了GBM,接下来我们介绍这个问题对应的优化模型的四个部分。目标函数目标函数是需要我们最小化的。 它的输入为一组超参数,输出需要最小化的值(交叉验证损失)。Hyperopt将目标函数视为黑盒,只考虑它的输入和输出。 在这里,目标函数定义为:defobjective(hyperparameters):
'''Returns validation score from hyperparameters'''model = Classifier(hyperparameters)
validation_loss = cross_validation(model,training_data)
returnvalidation_loss我们评估的是超参数在验证集上的表现,但我们不将数据集划分成固定的验证集和训练集,而是使用K折交叉验证。使用10倍交叉验证和提前停止的梯度提升机的完整目标函数如下所示。importlightgbm aslgb
fromhyperopt importSTATUS_OK
N_FOLDS = 10# Create the datasettrain_set = lgb.Dataset(train_features,train_labels)
defobjective(params,n_folds=N_FOLDS):
'''Objective function for Gradient Boosting Machine Hyperparameter Tuning'''# Perform n_fold cross validation with hyperparameters# Use early stopping and evalute based on ROC AUCcv_results = lgb.cv(params,train_set,nfold=n_folds,num_boost_round=10000,early_stopping_rounds