XGBoost 和随机森林:ntrees vs. 增强轮数 vs. n_estimators

数据挖掘 Python 随机森林 决策树 xgboost 超参数
2021-10-05 14:01:14

所以我了解随机森林和 GB 方法之间的主要区别。随机森林生成平行树,GB 方法为每次迭代生成一棵树。但是,我对 scikit 的 RF 回归器和 xgboost 的回归器使用的词汇感到困惑。特别是关于调整树/迭代/增强轮数的部分。据我了解,这些术语中的每一个都是相同的。他们根据算法确定决策树应该计算多少次。但是,我应该将它们称为 ntrees 还是 n_estimators?或者我应该简单地为我的 xgboost 使用早期停止回合并仅为我的 rf 调整树的数量?

我的随机森林:

rf = RandomForestRegressor(random_state = 13)
param_grid = dict(model__n_estimators = [250,500,750,1000,1500,2000],
                  model__max_depth = [5,7,10,12,15,20,25],
                  model__min_samples_split= [2,5,10],
                  model__min_samples_leaf= [1,3,5]
                  )
gs = GridSearchCV(rf
                  ,param_grid = param_grid
                  ,scoring = 'neg_mean_squared_error'
                  ,n_jobs = -1
                  ,cv = 5
                  ,refit = 'neg_mean_squared_error'
                  )

我的 xgboost

model = XGBRegressor(random_state = 13)
param_grid = dict(model__ntrees = [500,750,1000,1500,2000],
                  model__max_depth = [1,3,5,7,10],
                  model__learning_rate= [0.01,0.025,0.05,0.1,0.15,0.2],
                  model__min_child_weight= [1,3,5,7,10],
                  model__colsample_bytree=[0.80,1]
                  )
gs = GridSearchCV(model
                  ,param_grid = param_grid
                  ,scoring = 'neg_mean_squared_error'
                  ,n_jobs = -1
                  ,cv = 5
                  ,refit = 'neg_mean_squared_error'
                  )
2个回答

据我了解,迭代相当于提升轮次

然而,的数量并不一定与上述相同,因为xgboost有一个名为的参数num_parallel_tree,它允许用户在每次迭代中创建多个树(即,将其视为增强随机森林)。

例如,如果用户设置num_parallel_tree= 3 进行 500 次迭代,那么树的数量 = 1500 (=3*500) 而不是 500。

根据您的评论...

为什么我要每次迭代创建多个树?

每次迭代多棵树可能意味着模型的预测能力比使用单棵树提高得更快——例如,想想深度为 10 的单个树的预测能力与由 5 棵深度为 10 的树组成的随机森林的预测能力(显然一般来说,而不是在存在过度拟合的边缘情况下)。

这可能意味着在模型变得“最佳”之前需要更少的提升轮次,尽管通过使用更少的提升轮节省的时间/资源可能会被构建许多随机森林所需的时间/资源消耗。

制作树,纠正错误并重复的目的不是吗?

不,关键是要进行估算,纠正错误并重复。每轮使用的估计器不一定是一棵树;xgboost允许用户创建线性模型、决策树或随机森林。

对于每次迭代,我要制作 3 棵树?

是的。每次迭代都将产生一个带有num_parallel_tree树的随机森林。