Boosting
- 所谓Boosting,它的主要思想是说将多个弱模型组合在一起,从而形成一个比较强的模型。他的主要目的是为了降低数据拟合的偏差。需要注意的是,相较于之前提到的bagging,这里的组合是串行组合,而不是bagging的并行组合;Boosting降低的是偏差,而Bagging降低的是方差。(具体可以参考下图)
![](https://img-blog.csdnimg.cn/c8ba026d52924cb0bded4bd2e0a9745e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yqq5Yqb5a2m5Lmg55qE6Zi_5rCR,size_20,color_FFFFFF,t_70,g_se,x_16)
- 具体点来说,当处于时间i步时,我会训练我的第i个弱模型 h i h_i hi,紧接着,我们会根据模型 h i h_i hi所得到的误差 ϵ t \epsilon_{t} ϵt,再把数据重新采样一下,使得我们下一个模型 h i + 1 h_{i+1} hi+1会去关注我们预测不准确的样本。用大白话来讲,就是我们把每一次训练做的不好的样本重新拿出来再次做训练,希望每次的训练都能不断地拟合真实值。如此类推,一直迭代。
- 在Boosting算法里面有许多著名的算法,比如Adaboost,GBDT,Lightgbm,Catboost等等。详细可以参考我的另外一篇文章#集成学习.
Gradient Boosting
- 假设在时间步 t t t的时候,我们训练一个模型 H t ( x ) H_t(x) Ht(x)
- 当 t = 1 , 2 , 3 , . . . , n t = 1,2,3,...,n t=1,2,3,...,n
- 对于每个时间步
t
t
t,我们每一个弱模型
h
t
(
x
)
h_t(x)
ht(x)都是在上一时间步的残差上面进行训练,即
r e s i d u a l s : { ( x i , y i − H t ( x i ) ) } i = 1 , … , m residuals:\left\{\left(x_{i}, y_{i}-H_{t}\left(x_{i}\right)\right)\right\}_{i=1, \ldots, m} residuals:{(xi,yi−Ht(xi))}i=1,…,m
从上式可以看出,我们每一次训练的样本都没有变,但是我们的label是真实值 y i y_i yi与预测值 H t ( x ) H_t(x) Ht(x)之间的误差,即残差。也就是说,我们每一次训练都是为了拟合上一步模型没有拟合好的那一部分。 - 对于最终的结果,我们有以下公式:
H t + 1 ( x ) = H t ( x ) + η h t ( x ) H_{t+1}(x)=H_{t}(x)+\eta h_{t}(x) Ht+1(x)=Ht(x)+ηht(x)
这里的 η \eta η是学习率,主要为了控制过拟合的出现。 - 这里的残差学习有点类似于梯度学习法,即每一次的学习出来的 h t ( x ) h_t(x) ht(x)都是为了减少残差,即沿着残差的负梯度方向进行拟合。可以用公式表达: − ∂ L / ∂ H -\partial L / \partial H −∂L/∂H。
- 但是需要注意的是,之前提到的梯度下降是用负的导数梯度,然后乘以学习率,然后再加到我们的权重中,但是这里学习的并不是权重,而是每一个弱模型 h t ( x ) h_t(x) ht(x),最终的结果是一系列弱模型相加起来的综合结果。所以这也是为什么这个算法的思想也叫做梯度提升Gradient Boosting,而不是梯度下降Gradient Descent。
Summary
- Boosting的主要思想就是集成多个弱模型,从而降低学习的偏差Bias
- Gradient Boosting是通过多个弱模型拟合残差,从而进行学习。