本文将具体解释 XGBoost 中十个最罕用超参数的介绍,性能和值范畴,及如何应用 Optuna 进行超参数调优。
对于 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 等其余参数呈正比关系。较低的学习率须要较高的这些参数值,反之亦然。然而个别状况下不用放心这些参数之间的相互作用,因为咱们将应用主动调优找到最佳组合。
4、subsample 和 colsample_bytree
子抽样 subsample 它将更多的随机性引入到训练中,从而有助于反抗过拟合。
Subsample =0.7 意味着汇合中的每个决策树将在随机抉择的 70% 可用数据上进行训练。值 1.0 示意将应用所有行(不进行子抽样)。
与 subsample 相似,也有 colsample_bytree。顾名思义,colsample_bytree 管制每个决策树将应用的特色的比例。Colsample_bytree =0.8 使每个树应用每个树中随机 80% 的可用特色(列)。
调整这两个参数能够管制偏差和方差之间的衡量。应用较小的值升高了树之间的相关性,减少了汇合中的多样性,有助于进步泛化和缩小过拟合。
然而它们可能会引入更多的噪声,减少模型的偏差。而应用较大的值会减少树之间的相关性,升高多样性并可能导致过拟合。
5、max_depth
最大深度 max_depth 管制决策树在训练过程中可能达到的最大档次数。
更深的树能够捕捉特色之间更简单的相互作用。然而更深的树也有更高的过拟合危险,因为它们能够记住训练数据中的噪声或不相干的模式。为了管制这种复杂性,能够限度 max_depth,从而生成更浅、更简略的树,并捕捉更通用的模式。
Max_depth 数值能够很好地均衡了复杂性和泛化。
6、7、alpha,lambda
这两个参数一起说是因为 alpha (L1)和 lambda (L2)是两个帮忙过拟合的正则化参数。
与其余正则化参数的区别在于,它们能够将不重要或不重要的特色的权重放大到 0(特地是 alpha),从而取得具备更少特色的模型,从而升高复杂性。
alpha 和 lambda 的成果可能受到 max_depth、subsample 和 colsample_bytree 等其余参数的影响。更高的 alpha 或 lambda 值可能须要调整其余参数来弥补减少的正则化。例如,较高的 alpha 值可能受害于较大的 subsample 值,因为这样能够放弃模型多样性并避免欠拟合。
8、gamma
如果你读过 XGBoost 文档,它说 gamma 是:
在树的叶节点上进行进一步分区所需的最小损失缩小。
英文原文:the minimum loss reduction required to make a further partition on a leaf node of the tree.
我感觉除了写这句话的人,其他人都看不懂。让咱们看看它到底是什么,上面是一个两层决策树:
为了证实通过拆分叶节点向树中增加更多层是正当的,XGBoost 应该计算出该操作可能显著升高损失函数。
但“显著是多少呢?”这就是 gamma——它作为一个阈值来决定一个叶节点是否应该进一步宰割。
如果损失函数的缩小 (通常称为增益) 在潜在决裂后小于抉择的伽马,则不执行决裂。这意味着叶节点将放弃不变,并且树不会从该点开始成长。
所以调优的指标是找到导致损失函数最大缩小的最佳宰割,这意味着改良的模型性能。
9、min_child_weight
XGBoost 从具备单个根节点的单个决策树开始初始训练过程。该节点蕴含所有训练实例(行)。而后随着 XGBoost 抉择潜在的特色和宰割规范最大水平地缩小损失,更深的节点将蕴含越来越少的实例。
如果让 XGBoost 任意运行,树可能会长到最初节点中只有几个无关紧要的实例。这种状况是十分不可取的,因为这正是适度拟合的定义。
所以 XGBoost 为每个节点中持续宰割的最小实例数设置一个阈值。通过对节点中的所有实例进行加权,并找到权重的总和,如果这个最终权重小于 min_child_weight,则决裂进行,节点成为叶节点。
下面解释是对整个过程的最简化的版本,因为咱们次要介绍他的概念。
总结
以上就是咱们对这 10 个重要的超参数的解释,如果你想更深刻的理解仍有很多货色须要学习。所以倡议给 ChatGPT 以下两个提醒:
1) Explain the {parameter_name} XGBoost parameter in detail and how to choose values for it wisely.
2) Describe how {parameter_name} fits into the step-by-step tree-building process of XGBoost.
它必定比我讲的明确,对吧。
最初如果你也用 optuna 进行调优,请参考以下的 GIST:
https://avoid.overfit.cn/post/a432cd97278c4daabae268e53dc40db5
作者:Bex T.