嗯,我对你的问题有点困惑。
在梯度提升中,我们确实使用了残差。残差是梯度。
你可以查看我的梯度提升的简单实现。这就是魔法发生的地方:
def fit(self, X, y):
self.fs = [self.first_estimator]
# step 0
f = self.first_estimator.fit(X, y)
# step 1
for m in range(self.M):
f = self.predict(X)
# step 2
U = self.loss(y, f)
# step 3
g = clone(self.base_estimator).fit(X, U)
# step 4
self.fs.append(g)
你从一个虚拟模型开始 F. 然后你创建一个新模型G 基于现有集成的错误 L ( f( x ) , y). 代码应该非常简单。检查维基百科页面中的算法以获得更正式的演示。
为什么我使用残差和梯度作为可互换的词?
你有离散数学和连续数学。
在神经网络中,我们使用来自连续数学的梯度定义。你有一个损失函数是C1 连续的(意味着损失必须至少可微一次)。
f′(x)=limh→0f(x+h)−f(x)h
在梯度提升中,我们使用离散数学中梯度的定义。它通常被称为有限差分,而不是导数或梯度。
f′(x)=f(x+1)−f(x)
就个人而言,我认为梯度是用词不当。但这是营销。梯度提升听起来比“差异提升”或“残差提升”更数学和复杂。
顺便说一句,当梯度提升被发明时,提升这个术语就已经存在了。它用于 AdaBoost,它根据损失改变观察的权重,而不是在残差中进行训练。AdaBoost 仅适用于弱模型(每个模型都必须犯错误),而梯度提升可以重新采样并适用于强模型。
梯度提升的重点
梯度提升(离散优化)和神经网络(连续优化)之间的一个重要区别是梯度提升允许您使用导数为常数的函数。
在梯度提升中,您可以使用“奇怪”的函数,如 MAE 或Pinball 函数。在我的代码中,您可以看到您可以在 MSE、MAE 和分位数(即弹球损失)之间进行选择。后两者不适用于神经网络。
pinball 损失用于分位数预测,如能源系统中的风预测。这就是为什么在这些系统中大量使用梯度提升的原因。
小点:很多人认为 MAE 和 Pinball 函数对神经网络效果不好的原因是因为它们不是连续的。虽然这是真的,但它们不是连续的,当y=y^,很容易解决这个问题。这不是这些损失导致结果如此糟糕的原因。它们不能很好地工作的原因是因为优化步骤使用梯度(在梯度下降中),并且梯度对于整个函数是恒定的L′(y,y^)=1 或者 L′(y,y^)=−1,因此梯度的大小始终为 1。优化将仅取决于您使用的学习率启发式算法,这通常不会很好地工作。