XGBoost 10 个常用参数调优指南
在 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 参数,以防将来需要它们:
如果您想使用超参数调整非 Optuna Optimal 工具请查看此表。下图显示了这些参数对的相互影响:
这些关系不是固定的,但这就是上图的样子,因为还有一些其他参数可以额外影响我们的 10 个参数。
1。 goal
这是我们模型的训练目标
最简单的解释是,这个参数定义了我们模型需要做的工作,即影响决策树类型和损失函数。
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_深度控制决策树在训练过程中可以达到的最大层数。
更深的树可以捕获对象之间更复杂的交互。然而,更深的树也有更高的过度拟合风险,因为它们记住了训练数据中的噪声或不相关的模式。为了控制这种复杂性,可以限制 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 应该计算出此操作显着降低了损失函数。
但是“有多重要?”这就是伽玛——它充当决定叶节点是否应该进一步分割的阈值。
如果潜在分裂后损失函数(通常称为增益)的衰减小于选定的伽玛,则不会发生分裂。这意味着叶节点保持不变,并且树不会从该点开始生长。
因此,调优的目标是找到导致损失函数最大程度降低的最佳分布,这意味着模型的性能更好。
9,min_lapse_weight
XGBoost 从具有单个根节点的单个决策树开始初始训练过程。该节点包含所有训练实例(行)。然后,随着 XGBoost 选择隐藏特征和最小化损失的分割标准,更深的节点包含越来越少的情况。
如果让 XGBoost 任意运行,树可以一直增长,直到最后一个节点只有几个简单的实例。这种情况是非常不可取的,因为它正是过度部署的定义。
因此,XGBoost 为每个节点中继续共享的最小实例数量设置了阈值。通过对节点的所有实例进行权重并求出权重之和,如果最终权重小于 min_child_weight,则分裂停止并且该节点成为叶节点。
以上的解释是整个过程最简化的版本,我们主要介绍它的概念。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。