Code前端首页关于Code前端联系我们

XGBoost 10 个常用参数调优指南

terry 2年前 (2023-09-23) 阅读数 101 #AI人工智能

在 XGBoost 中,默认的超参数可以正常工作,但为了获得最佳结果,您需要调整一些超参数以匹配您的数据。 ,以下参数对于 XGBoost 来说非常重要:

  • eta
  • num_boost_round
  • max_depth
  • subsample
  • kolsample_bytree❝
  • lambda
  • alpha

XGBoost API 有两个调用方法,一个是我们的标准原生 API,另一个 API 与 Scikit-learn API 兼容。 Scikit-learn API 与 Sklearn 生态系统无缝集成。我们在这里只关注本机 API(这是我们最常见的),但这里有一个列表可以帮助您比较这两个 API 参数,以防将来需要它们:XGBoost中10个常用参数调优指南

如果您想使用超参数调整非 Optuna Optimal 工具请查看此表。下图显示了这些参数对的相互影响: XGBoost中10个常用参数调优指南

这些关系不是固定的,但这就是上图的样子,因为还有一些其他参数可以额外影响我们的 10 个参数。

1。 goal

这是我们模型的训练目标XGBoost中10个常用参数调优指南

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

2。 num_boost_round - n_estimators

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

增加参数可以创建更多的树,但随着模型变得更加复杂,过度拟合的可能性显着增加。

我从 Kaggle 学到的一个技巧是将 num_boost_round 设置为像 100,000 这样的高值,并使用提前停止来获得最佳版本。

在每一轮Boosting中,XGBoost都会生成更多的决策树,以提高前一决策树的总体得分。这就是为什么它被称为放大。无论上一轮是否取得进展,此过程都会持续到轮询 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 生成 100,000 个决策树,但由于使用了提前停止,如果验证分数在过去 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等其他参数成反比关系。较低的学习率需要较高的这些参数值,反之亦然。但一般来说,无需担心这些参数的相互作用,因为我们使用自动调整来找到最佳组合。

4、子采样和 colsample_bytree

子采样为训练带来更多随机性,从而有助于对抗过度拟合。

子采样 =0.7 表示每组中的决策树都根据随机选择的 70% 的可用数据进行训练。值 1.0 表示使用所有行(无子选择)。

和subsample一样,有colsample_bytree。顾名思义,colsample_bytree 控制每个决策树使用的特征的比例。 Colsample_bytree = 0.8 使每棵树随机使用每棵树中 80% 的可用特征(列)。

调整这两个参数可以控制偏差和方差之间的权衡。使用较小的值可以减少树之间的相关性并增加集合的多样性,有助于提高通用性并减少过度拟合。

但它们会引入更多噪声并增加模型偏差。使用较大的值会增加树之间的相关性,降低多样性并可能导致过度拟合。

5。 max_深度

最大深度 max_深度控制决策树在训练过程中可以达到的最大层数。 XGBoost中10个常用参数调优指南

更深的树可以捕获对象之间更复杂的交互。然而,更深的树也有更高的过度拟合风险,因为它们记住了训练数据中的噪声或不相关的模式。为了控制这种复杂性,可以限制 max_深度,从而产生更浅、更简单的树,从而反映更一般的模式。

Max_深度值很好地平衡了复杂性和通用性。

6,7,alpha,lambda

这两个参数放在一起说是因为alpha(L1)和lambda(L2)是两个帮助位移的控制参数。

与其他正则化参数的区别在于,它们可以将不重要或不相关的特征的权重降低到0(尤其是alpha),从而导致模型具有较少的特征,从而降低了复杂性。

Alpha 和 lambda 可能会受到其他参数的影响,例如 max_depth、subsample 和 colsample_bytree。较高的 alpha 或 lambda 值可能需要调整其他参数以补偿增加的规律性。例如,较大的 alpha 值可能受益于较大的子样本值,因为这可以保留模型多样性并防止欠拟合。

8。 gamma

如果您阅读 XGBoost 文档,它会说 gamma 是:

进一步分布树叶节点所需的最小损失减少。

英文原文:在树的叶子节点上执行附加分区所需的最小损失减少。

我认为除了这句话的作者之外没有其他人理解这一点。让我们看看它到底是什么,下面是一个两层决策树: XGBoost中10个常用参数调优指南

为了证明通过分割叶节点向树添加层的合理性,XGBoost 应该计算出此操作显着降低了损失函数。

但是“有多重要?”这就是伽玛——它充当决定叶节点是否应该进一步分割的阈值。

如果潜在分裂后损失函数(通常称为增益)的衰减小于选定的伽玛,则不会发生分裂。这意味着叶节点保持不变,并且树不会从该点开始生长。

因此,调优的目标是找到导致损失函数最大程度降低的最佳分布,这意味着模型的性能更好。

9,min_lapse_weight

XGBoost 从具有单个根节点的单个决策树开始初始训练过程。该节点包含所有训练实例(行)。然后,随着 XGBoost 选择隐藏特征和最小化损失的分割标准,更深的节点包含越来越少的情况。 XGBoost中10个常用参数调优指南

如果让 XGBoost 任意运行,树可以一直增长,直到最后一个节点只有几个简单的实例。这种情况是非常不可取的,因为它正是过度部署的定义。

因此,XGBoost 为每个节点中继续共享的最小实例数量设置了阈值。通过对节点的所有实例进行权重并求出权重之和,如果最终权重小于 min_child_weight,则分裂停止并且该节点成为叶节点。

以上的解释是整个过程最简化的版本,我们主要介绍它的概念。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门