与膨胀和升位一样,梯度提升也是一种应用于其他机器学习算法的方法。通俗来说,梯度提升涉及两种类型的模型:
- 一个“弱”机器学习模型,通常是决策树。
- 一个“强”机器学习模型,由多个弱模型组成。
在梯度增强中,在每个步骤中,系统都会训练一个新的弱模型来预测当前强模型的“误差”(称为伪响应)。我们稍后会详细说明“错误”。现在,假设“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
让我们将此代码应用于以下数据集:
图 25. 具有一个数值特征的合成回归数据集。
下面是梯度增强算法首次迭代的三张图:
图 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