XGBoost 中的 Random Forests(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:logisticlambda 应根据所需的正则化权重设置,等等。

如果 num_parallel_treenum_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 的独立随机森林

XGBRFClassifierXGBRFRegressor 是提供随机森林功能的类似 SKL 的类。它们基本上是 XGBClassifierXGBRegressor 的版本,它们训练随机森林而不是梯度提升,并且相应地调整了一些参数的默认值和含义。特别是

  • n_estimators 指定要训练的森林的大小;它被转换为 num_parallel_tree,而不是提升轮次。

  • learning_rate 默认设置为 1

  • colsample_bynodesubsample 默认设置为 0.8

  • booster 始终是 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 次。