为什么我的 XGboosted 树看起来都一样?

机器算法验证 助推
2022-04-08 10:08:48

我正在运行一个 XGBRegressor,它应该预测与不同动作相关的特定奖励,这些动作是单热编码的。出于测试目的,我使用了一个小的 depth=2 并且只有 10 棵树:

XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1, colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=2, min_child_weight=1, missing=None, n_estimators=10, n_jobs= 1、nthread=None、objective='reg:linear'、random_state=0、reg_alpha=0、reg_lambda=1、scale_pos_weight=1、seed=None、silent=True、subsample=1)

R-SQR 没问题。然而,在可视化单个树之后,似乎几乎所有树都使用完全相同的特征(并且条件和阈值相同),但结果叶值略有不同。

那有什么意义呢?在这种情况下,树的线性添加就足够了,我们只有一个。不需要完全相同的树具有不同的叶子值,对吧?第一棵树的值也不是最大的,而其余的树具有无关紧要的值 - 它们都具有相似的外观值,右下角的值最大(见图)。

所以我的问题是:

  1. 为什么它会做多棵树,它们具有完全相同的特征和相等条件,但值略有不同
  2. 有没有办法说:“如果它们没有增加任何更重要的价值,就停止添加树木”?

在此处输入图像描述

1个回答

当梯度提升机器适合一棵树时f(x)到目标变量y,它计算误差(用于下一次迭代以适应下一棵树)为:

e=yϵf(x)

在这种情况下ϵ=0.1,学习率。现在想象有一个相当简单的树g(x)实际上很好地拟合了数据(对于一个简单的树,也就是说)。在我们的第一次迭代中,我们的模型发现g(x)并计算误差e为下一步。那一步,e可能很适合同一棵树,因为我们没有减去所有g(x)y, 我们只减去10%其中。写的比较松散,90%g(x)仍处于误差项中e. 因为ey,叶子值会有点不同,但树结构是一样的,所以在下一次迭代中,我们将拟合g(x)再次。

在我们完成足够的拟合之前,我们可能需要这样做很多次g(x)y让其他树结构变得足够明显,以便 GBM 优先找到更适合的g.

造成这种情况的根本原因是我们正在朝着g(x)固定长度 -ϵ- 不执行线搜索以找到最佳步长g(x)在每次迭代中,然后采取该长度的一个步骤。这是一个特点!它有助于防止过度拟合。如果您在 GBM 的每一步都拟合“最佳”树,那么您很快就会过拟合,即使是小树也是如此。(请注意,它们并不是真正的最优树,因为它们是通过贪婪搜索启发式找到的。)随机森林确实在每一步都适合“最优”树,也适合深度树,但通过对树进行平均来处理过度拟合问题。GBM 采用了一种不同的方法,这种方法在您的情况下可能会浪费迭代,但通常在广泛的问题上效果很好。