提升和装袋树(XGBoost,LightGBM)

机器算法验证 大车 助推 装袋
2022-02-08 00:03:38

有许多博客文章、YouTube 视频等关于装袋 提升树木的想法。我的一般理解是每个的伪代码是:

装袋:

  1. 取 x% 的样本和 y% 的特征的 N 个随机样本
  2. 在 N 中的每一个上拟合您的模型(例如,决策树)
  3. 预测每个 N
  4. 平均预测以获得最终预测

提升:

  1. 使您的模型(例如,决策树)适合您的数据
  2. 获取残差
  3. 使您的模型适合残差
  4. 转到 2 进行 N 次增强轮次
  5. 最终预测是顺序预测变量的加权和。

我将对上面的理解进行任何澄清,但我的预期问题如下:

XGBoost 和 LightGBM 都有允许装袋的参数。该应用程序不是 Bagging OR Boosting(每篇博文都在谈论),而是 Bagging AND Boosting。什么是组合 bagging 和 boosting 发生的地点和时间的伪代码?

我希望它是“Bagged Boosted Trees”,但它似乎是“Boosted Bagged Trees”。差异似乎很大。

袋装增强树:

  1. 取 x% 的样本和 y% 的特征的 N 个随机样本
  2. 在 N 个样本中的每一个上拟合 Boosted 树
  3. 预测每个 N
  4. 平均预测以获得最终预测

这似乎是最好的方法。毕竟,boosting 的风险是过拟合,而 bagging 的主要好处是减少过拟合;打包一堆增强模型似乎是个好主意。

然而,通过查看,例如,scikit-learn gradient_boosting.py(它进行样本装袋,但不是随机特征选择),并在有关 LightGBM 和 XGBoost 的帖子中拼凑一些小块,看起来 XGBoost 和 LightGBM 的工作方式如下:

提升袋装树:

  1. 使决策树适合您的数据
  2. 对于 N 个增强轮中的 i:
    • 获取残差
    • 如果我 mod bag_frequency == 0(即,每 5 轮装袋):
      • 取 x% 的样本和 y% 的特征的单个随机样本;继续使用这个随机样本
    • 将树拟合到残差
  3. 最终预测是顺序预测变量的加权和。

请在此处更正我的理解并填写详细信息。Boosted Bagged Tree(每个 bag_frequency 只有 1 个随机树)似乎没有 Bagged Boosted Tree 强大。

1个回答

Bagging:随机抽取 N 个样本,其中 x% 的样本和 y% 的特征

在Bagging中重复对实例进行二次抽样,但对特征不进行二次抽样。RandomForestsXGBoostCatBoost两者都做):

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    Train model on D_i (and then predict)
Combine predictions with equal weight 

在Boosting伪代码中包含一个初始化步骤以消除冗余:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted data (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Bagged Boosted Trees(如您所说)当然是一种合理的方法,但与XGBoostCatBoost不同:

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    (Insert Boosting pseudo code here (on D_i))
Combine predictions with equal weight 

XGBoostCatBoost都是基于Boosting并使用整个训练数据。他们还通过在每次提升迭代中进行一次二次抽样来实现装袋:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted bootstrap sample (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

如果您想坚持“将模型拟合到残差”,那么这将等同于“将模型拟合到引导样本中的数据残差”。


进一步说明

正如您所建议的那样,没有“最好的方法”(没有免费的午餐定理)。“Bagged Boosted Trees”在某些数据集上的表现可能优于 XGBoost。

抽取 x% 样本的单个随机样本

这条线令人困惑。你从哪里得到这个?

如果我 mod bag_frequency == 0(即,每 5 轮装袋):

这不应该在您的伪代码中提及。尤其是当还有其他更重要的参数被遗漏时(例如提升中的学习率)。