梯度提升决策树

与抽样和提升类似,梯度提升是一种在其他机器学习算法之上应用的方法。非正式地讲,梯度提升涉及两种类型的模型:

  • “弱”机器学习模型,通常是决策树。
  • 由多个弱模型组成的“强”机器学习模型。

在梯度提升中,每个步骤都会训练一个新的弱模型来预测当前强模型的“误差”(称为伪响应)。我们稍后会详细介绍“错误”状态。目前,假设“误差”是预测值与回归标签之间的差值。然后,将弱模型(即“误差”)添加到强模型中,并带有负号,以减少强模型的误差。

梯度提升是迭代过程。每个迭代都会调用以下公式:

\[ F_{i+1} = F_i - f_i \]

其中:

  • $F_i$ 是第 $i$ 步中的强模型。
  • $f_i$ 是第 $i$ 步的弱模型。

此操作会重复进行,直到满足停止条件(例如迭代次数上限),或者(强)模型开始过拟合(根据单独的验证数据集衡量)。

我们将通过一个简单的回归数据集来演示梯度提升,其中:

  • 目标是根据 $x$ 预测 $y$。
  • 强模型会初始化为零常量:$F_0(x) = 0$。
# Simplified example of regressive gradient boosting.

y = ... # the labels
x = ... # the features

strong_model = []
strong_predictions = np.zeros_like(y) # Initially, the strong model is empty.

for i in range(num_iters):

    # Error of the strong model
    error = strong_predictions - y

    # The weak model is a decision tree (see CART chapter)
    # without pruning and a maximum depth of 3.
    weak_model = tfdf.keras.CartModel(
        task=tfdf.keras.Task.REGRESSION,
        validation_ratio=0.0,
        max_depth=3)
    weak_model.fit(x=x, y=error)

    strong_model.append(weak_model)

    weak_predictions = weak_model.predict(x)[:,0]

    strong_predictions -= weak_predictions

我们将此代码应用于以下数据集:

一个特征 x 及其标签 y 的标准答案图。该图表显示了一系列略微衰减的正弦波。

图 25. 包含一个数值特征的合成回归数据集。

 

以下是梯度提升算法进行第一次迭代后的三个图表:

三个情节。第一个图表显示了强大模型的预测结果,这是一个斜率为 0 且 y 截距为 0 的直线。第二个图表显示了强大模型的误差,即一系列正弦波。第三个图表显示了弱模型的预测结果,即一组方波。

图 26. 第一次迭代后的三个图表。

 

请注意图 26 中的图表:

  • 第一个图表显示了强大模型的预测结果,目前始终为 0。
  • 第二个图表显示了错误,即弱模型的标签。
  • 第三个图表显示了弱模型。

第一个弱模型会学习标签的大致表示,并且主要侧重于特征空间的左侧部分(变化最明显的部分,因此对于恒定错误模型,该部分的误差最大)。

以下是该算法另一个迭代的相同图表:

三个情节。第一个图显示了强模型的预测结果,与上图中弱模型预测结果的图相反。第二个图显示了强大模型的误差,即一组带噪的正弦波。第三个图显示了弱模型的预测结果,即两个方波。

图 27. 第二次迭代后的三个图表。

 

请注意图 27 中的图表:

  • 强模型现在包含上一次迭代中弱模型的预测结果。
  • 强大模型的新误差略小。
  • 弱模型的新预测现在侧重于特征空间的右侧。

我们再运行 8 次算法迭代:

图表显示,强模型的预测结果逐渐接近标准答案,而弱模型的预测结果逐渐变差。

图 28. 第三次迭代和第十次迭代后的三个图。

 

请注意,在图 28 中,强大模型的预测结果开始类似于数据集的图

这些图展示了使用决策树作为弱学习器的梯度提升算法。这种组合称为梯度提升(决策)树

上述图表揭示了梯度提升的精髓。不过,此示例缺少以下两项实际操作:

  • 收缩
  • 使用牛顿法的一步对叶值进行优化

缩水

弱模型 $f_i$ 会先乘以一个小值 $\nu$(例如 $\nu = 0.1$),然后再添加到强模型 $F_i$。此小值称为收缩。换句话说,在每次迭代中,请使用以下公式:

\[ F_{i+1} = F_i - f_i \]

每个迭代都使用以下公式:

\[ F_{i+1} = F_i - \nu f_i \]

梯度提升中的收缩类似于神经网络中的学习率。收缩控制强大模型的学习速度,有助于限制过拟合。也就是说,收缩值越接近 0.0,过拟合程度就越小,而收缩值越接近 1.0,过拟合程度就越大。

在上面的代码中,缩减会按如下方式实现:

shrinkage = 0.1   # 0.1 is a common shrinkage value.
strong_predictions -= shrinkage * weak_predictions