梯度提升决策树

与膨胀和升位一样,梯度提升也是一种应用于其他机器学习算法的方法。通俗来说,梯度提升涉及两种类型的模型:

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

在梯度增强中,在每个步骤中,系统都会训练一个新的弱模型来预测当前强模型的“误差”(称为伪响应)。我们稍后会详细说明“错误”。现在,假设“error”是预测与回归标签之间的差异。然后,使用负号将弱模型(即“error”)添加到安全模型中,以减少安全模型的错误。

渐变提升是迭代的。每次迭代都会调用以下公式:

\[ 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 的直线和截距为 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 \]

梯度提升中的收敛与神经网络中的学习速率类似。缩减可控制强模型的学习速度,这有助于限制过拟合。也就是说,与接近 1.0 的缩减值相比,接近于 0.0 的缩减率能够减少过拟合。

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

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