新闻  |   论坛  |   博客  |   在线研讨会
XGBoost超参数调优指南(1)
数据派THU | 2023-06-23 16:07:27    阅读:166   发布文章

对于XGBoost来说,默认的超参数是可以正常运行的,但是如果你想获得最佳的效果,那么就需要自行调整一些超参数来匹配你的数据,以下参数对于XGBoost非常重要:

  • eta

  • num_boost_round

  • max_depth

  • subsample

  • colsample_bytree

  • gamma

  • min_child_weight

  • lambda

  • alpha

XGBoost的API有2种调用方法,一种是我们常见的原生API,一种是兼容Scikit-learn API的API,Scikit-learn API与Sklearn生态系统无缝集成。我们这里只关注原生API(也就是我们最常见的),但是这里提供一个列表,这样可以帮助你对比2个API参数,万一以后用到了呢:


图片


如果想使用Optuna以外的超参数调优工具,可以参考该表。下图是这些参数对之间的相互作用:


图片


这些关系不是固定的,但是大概情况是上图的样子,因为有一些其他参数可能会对我们的者10个参数有额外的影响。


1、objective


这是我们模型的训练目标


图片


最简单的解释是,这个参数指定我们模型要做的工作,也就是影响决策树的种类和损失函数。


2、num_boost_round - n_estimators


num_boost_round指定训练期间确定要生成的决策树(在XGBoost中通常称为基础学习器)的数量。默认值是100,但对于今天的大型数据集来说,这还远远不够。


增加参数可以生成更多的树,但随着模型变得更复杂,过度拟合的机会也会显著增加。


从Kaggle中学到的一个技巧是为num_boost_round设置一个高数值,比如100,000,并利用早停获得最佳版本。


在每个提升回合中,XGBoost会生成更多的决策树来提高前一个决策树的总体得分。这就是为什么它被称为boost。这个过程一直持续到num_boost_round轮询为止,不管是否比上一轮有所改进。


但是通过使用早停技术,我们可以在验证指标没有提高时停止训练,不仅节省时间,还能防止过拟合。


有了这个技巧,我们甚至不需要调优num_boost_round。下面是它在代码中的样子:


 # Define the rest of the params params = {...}
# Build the train/validation sets dtrain_final = xgb.DMatrix(X_train, label=y_train) dvalid_final = xgb.DMatrix(X_valid, label=y_valid)
bst_final = xgb.train(    params,    dtrain_final,    num_boost_round=100000 # Set a high number    evals=[(dvalid_final, "validation")],    early_stopping_rounds=50, # Enable early stopping    verbose_eval=False, )


上面的代码使XGBoost生成100k决策树,但是由于使用了早停,当验证分数在最后50轮中没有提高时,它将停止。一般情况下树的数量范围在5000-10000即可。控制num_boost_round也是影响训练过程运行时间的最大因素之一,因为更多的树需要更多的资源。


3、eta - learning_rate


在每一轮中,所有现有的树都会对给定的输入返回一个预测。例如,五棵树可能会返回以下对样本N的预测:



 Tree 1: 0.57   Tree 2: 0.9   Tree 3: 4.25   Tree 4: 6.4   Tree 5: 2.1


为了返回最终的预测,需要对这些输出进行汇总,但在此之前XGBoost使用一个称为eta或学习率的参数缩小或缩放它们。缩放后最终输出为:



 output = eta * (0.57 + 0.9 + 4.25 + 6.4 + 2.1)


大的学习率给集合中每棵树的贡献赋予了更大的权重,但这可能会导致过拟合/不稳定,会加快训练时间。而较低的学习率抑制了每棵树的贡献,使学习过程更慢但更健壮。这种学习率参数的正则化效应对复杂和有噪声的数据集特别有用。


学习率与num_boost_round、max_depth、subsample和colsample_bytree等其他参数呈反比关系。较低的学习率需要较高的这些参数值,反之亦然。但是一般情况下不必担心这些参数之间的相互作用,因为我们将使用自动调优找到最佳组合。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客