XGBoost 中的随机森林(TM)
XGBoost 通常用于训练梯度提升决策树和其他梯度提升模型。随机森林使用与梯度提升决策树相同的模型表示和推理,但采用不同的训练算法。可以使用 XGBoost 训练独立的随机森林,或者将随机森林用作梯度提升的基础模型。这里我们专注于训练独立的随机森林。
我们从早期开始就拥有用于训练随机森林的原生API,并且在0.82版本之后(不包括0.82版本)有一个新的Scikit-Learn包装器。请注意,新的Scikit-Learn包装器仍然是**实验性的**,这意味着我们可能会在需要时随时更改接口。
使用XGBoost API的独立随机森林
以下参数必须设置以启用随机森林训练。
booster应设置为gbtree,因为我们正在训练森林。请注意,由于这是默认设置,因此无需显式设置此参数。subsample必须设置为小于1的值,以启用训练案例(行)的随机选择。必须将
colsample_by*参数之一设置为小于 1 的值以启用列的随机选择。通常,colsample_bynode会被设置为小于 1 的值,以便在每次树分割时随机采样列。num_parallel_tree应设置为正在训练的森林的大小。num_boost_round应设置为1,以防止XGBoost提升多个随机森林。请注意,这是``train()``的关键字参数,而不是参数字典的一部分。eta(别名:learning_rate) 在训练随机森林回归时必须设置为1。random_state可以用来为随机数生成器设定种子。
其他参数应类似地设置为梯度提升的设置方式。例如,objective 通常在回归中为 reg:squarederror,在分类中为 binary:logistic,lambda 应根据所需的正则化权重进行设置等。
如果 num_parallel_tree 和 num_boost_round 都大于1,训练将使用随机森林和梯度提升策略的组合。它将执行 num_boost_round 轮,每轮提升一个包含 num_parallel_tree 棵树的随机森林。如果未启用早停,最终模型将包含 num_parallel_tree * num_boost_round 棵树。
以下是使用 xgboost 在 GPU 上训练随机森林的示例参数字典:
params = {
  "colsample_bynode": 0.8,
  "learning_rate": 1,
  "max_depth": 5,
  "num_parallel_tree": 100,
  "objective": "binary:logistic",
  "subsample": 0.8,
  "tree_method": "hist",
  "device": "cuda",
}
然后可以按如下方式训练随机森林模型:
bst = train(params, dmatrix, num_boost_round=1)
独立随机森林与类似Scikit-Learn的API
XGBRFClassifier 和 XGBRFRegressor 是提供随机森林功能的类,类似于SKL。它们基本上是 XGBClassifier 和 XGBRegressor 的版本,训练的是随机森林而不是梯度提升,并且对某些参数的默认值和含义进行了相应的调整。特别是:
n_estimators指定要训练的森林的大小;它被转换为num_parallel_tree,而不是提升轮数。learning_rate默认设置为 1colsample_bynode和subsample默认设置为 0.8booster始终是gbtree
作为一个简单的例子,你可以用以下方式训练一个随机森林回归器:
from sklearn.model_selection import KFold
# Your code ...
kf = KFold(n_splits=2)
for train_index, test_index in kf.split(X, y):
    xgb_model = xgb.XGBRFRegressor(random_state=42).fit(
    X[train_index], y[train_index])
请注意,与使用 train() 相比,这些类别的参数选择较少。特别是,使用此API无法将随机森林与梯度提升结合使用。
注意事项
XGBoost 使用目标函数的二阶近似。这可能导致结果与使用目标函数精确值的随机森林实现不同。
XGBoost 在进行训练案例子采样时不执行替换。每个训练案例在子采样集中可以出现0次或1次。