万壑松风知客来,摇扇抚琴待留声
1. 文起
本篇文章记录通过 Python 调用第三方库,从而调用使用了贝叶斯优化原理的 Hyperopt 方法来进行超参数的优化选择。具体贝叶斯优化原理与相关介绍将在下一次文章中做较为详细的描述,可以参考这里。
Hyperopt 是 Python 的几个贝叶斯优化库中的一个。它使用 Tree Parzen Estimator(TPE),其它 Python 库还包括了 Spearmint(高斯过程代理)和 SMAC(随机森林回归)。贝叶斯优化问题有四个部分:目标函数:使用的机器学习模型调用该组超参数在验证集上的损失。
域空间:类似于网格搜索,传入超参数的搜索范围。
参数搜索:构造替代函数并选择下一个超参数值进行评估的方法。
存储结果:最小化函数在评估每组测试后的最优超参数存储结果。
2. Hyperopt 简单样例说明:最简单的流程,实现以 XGBoost 作为调参模型,通过 hyperopt 完成上述贝叶斯优化的四个部分。
一:定义目标函数1
2
3
4
5
6
7
8
9
10train_X, test_X, train_y, test_y = train_test_split(df_scaler, df_y, test_size=0.3, random_state=999)
data_train =xgb.DMatrix(train_X, train_y, silent=False)
# 定义目标函数
def (params, n_folds=10):
cv_results =xgb.cv(params, data_train, num_boost_round=1000, nfold=n_folds, stratified=False, shuffle=True, metrics='mae', early_stopping_rounds=10)
mae = max(cv_results['test-mae-mean'])
loss = mae
return loss
objective() 是目标函数(黑盒函数),作用是返回一个损失值,Hyperopt 也是根据这个损失值来逐步选择超参数的。后续的 fmin() 函数会最小化这个损失,所以你可以根据是最大化还是最小化问题来改变这个返回值。此处的目标函数十分基础并没有做过多的调整,可根据实际情况来做修改目标函数。
二:设置域空间1
2
3
4
5
6
7
8
9from hyperopt import hp
space = {
'learning_rate': hp.loguniform('learning_rate',np.log(0.01),np.log(0.4)),
'max_depth': hp.choice('max_depth',range(1,8,1)),
'min_child_weight': hp.choice('min_child_weight',range(1,5,1)),
'reg_alpha': hp.uniform('reg_alpha',0.0,1.0),
'subsample': hp.uniform('subsample',0.5,1.0),
'colsample_bytree': hp.uniform('colsample_bytree',0.6,1.0)
}
域空间,也就是给定