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(Scikit-Learn)风格类。它们基本上是 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 次。