集成算法学习(2)-Boosting(GBDT回归)(举例说明,通俗易懂)

通过上帖Bagging、Boosting(AdaBoost)原理与公式推导了解了方差和偏差以及AdaBoost,下面详细讲解GBDT回归的原理以及实现。

GBDT的初始化是一个叶节点,而不是生成一个树(随机森林)或树桩(AdaBoost)。这个叶节点代表所有样本的初始预测值。

GBDT与AdaBoost的对比:

  • 两者都是利用前面模型的误差调节当前模型
  • 两者都要构建固定大小的树(深度和叶节点固定),但是GBDT构建的树比树桩大,GBDT的叶结点一般设为 8-32
  • 两者都需要在构建的模型前加上权重,但GBDT构建的树的权重相等

GBDT回归预测的变量是连续值。

1、案例讲解

下面举例说明:总共有 6 个样本,每个样本有三个属性 Height(m),Favorite Color,Gender,对每个样本的 Weight 进行预测。

num Height(m) Favorite Color Gender Weight(kg)
1 1.6 Blue Male 88
2 1.6 Green Female 76
3 1.5 Blue Female 56
4 1.8 Red Male 73
5 1.5 Green Male 77
1.4 Blue Female 57

1) 初始化 f_0=predicted_0=average(weight)=(88+76+56+73+77+57)/6= 71.2f_0 相当于预测值,此时每个样本的预测值都是 f_0

第一次迭代(建第一棵树):

2) 计算残差 residual,Residual_0=(observed weight -predicted_0)=(observed weight -f_0)

num Height(m) Favorite Color Gender Weight(kg)

Residual_0

1 1.6 Blue Male 88 16.8=88-71.2
2 1.6 Green Female 76 4.8
3 1.5 Blue Female 56 -15.2
4 1.8 Red Male 73 1.8
5 1.5 Green Male 77 5.8
1.4 Blue Female 57 -14.2

注:GBDT的残差叫伪残差,这么叫是为了区分线性回归的残差,两者是不一样的。

3)现在构建树,用Height(m),Favorite Color,Gender去预测Residuals,注意这里预测的是残差,不是直接预测weight。GBDT用的决策树都是CART 树,构建的树如下所示:

                                                              集成算法学习(2)-Boosting(GBDT回归)(举例说明,通俗易懂)_第1张图片

4)由上图知,每条树枝的叶结点有1个以及以上的残差,对此计算用每个叶结点的残差平均值来代表该结点的残差,第一个分支(从左到右)的残差平均值为  (-14.2-15.2)/2=-14.7,第三个分支的残差平均值为  (1.8+5.8)/2=3.8,第二分支和第四分支只有一个残差,所以不需要计算。最终如下图右边那棵树所示:

                                                集成算法学习(2)-Boosting(GBDT回归)(举例说明,通俗易懂)_第2张图片

注:为什么求平均值,因为GBDT的叶结点是固定,本例中叶结点只能是4个,一个结点只能有一个值,所以叶结点值多余1的取平均值,否则违背了决策树构建原则。

5)计算预测值:predicted weight_1= f_0+Residual_0=average(observed weight)+Residual_0

此时构建的决策树在训练集中准确度高,因此偏差低,但不同的训练集会出现不同的模型,因此模型的方差高。为此,引入了学习率,在叶结点前面乘以一个学习率0-1,前人证明小的学习率可以减少测试集中的方差。

修正后的 predicted weight_1 = f_0+learning rate\times Residual_0

最终结果如下所示:

num Height(m) Favorite Color Gender Weight(kg) Residual_0 predicted weight_1

predicted weight_1

(learning rate=0.1) 

1 1.6 Blue Male 88 16.8 88=71.2+16.8 72.9=71.2+0.1*16.8
2 1.6 Green Female 76 4.8 76 71.68
3 1.5 Blue Female 56 -14.7 56.5 69.73
4 1.8 Red Male 73 3.8 75 70.82
5 1.5 Green Male 77 3.8 75 70.82
1.4 Blue Female 57 -14.7 56.5 69.73

这个要比初始叶结点的预测值要好,因为原始叶结点对所有样本的预测值都是71.2。

第二次迭代(建第二棵树):

22)计算残差 residual,Residual_1=(observed weight -predicted_1),如下所示:

num Height(m) Favorite Color Gender Weight(kg)

predicted weight_1

(learning rate=0.1) 

Residual_1
1 1.6 Blue Male 88 72.9 15.1=88-72.9
2 1.6 Green Female 76 71.68 4.3
3 1.5 Blue Female 56 69.73 -13.7
4 1.8 Red Male 73 70.82 1.4
5 1.5 Green Male 77 70.82 5.4
1.4 Blue Female 57 69.73 -12.7

23)构建新树:

                                               集成算法学习(2)-Boosting(GBDT回归)(举例说明,通俗易懂)_第3张图片

24)叶结点残差值修正:

                                              集成算法学习(2)-Boosting(GBDT回归)(举例说明,通俗易懂)_第4张图片

25)计算预测值:  predicted weight_2 = f_0+learning rate\times Residual_0 +learning rate\times Residual_1

num Height(m) Favorite Color Gender Weight(kg) Residual_0 Residual_1 predicted weight_2
1 1.6 Blue Male 88 16.8 15.1 74.4=71.2+0.1*16.8+0.1*15.1
2 1.6 Green Female 76 4.8 4.3 72.11
3 1.5 Blue Female 56 -14.7 -13.2 68.41
4 1.8 Red Male 73 3.8 3.4 71.92
5 1.5 Green Male 77 3.8 3.4 71.92
1.4 Blue Female 57 -14.7 -13.2 68.41

第三次迭代:

计算残差......

残差会越来越小

2、具体步骤讲解

由上总结GBDT回归的具体步骤如下:

1)

这一步确定样本和损失函数。

n 是样本数量,i 代表第几个样本,x_i 代表属性,y_i 代表要预测的值。

损失函数是评估模型预测效果。GBDT 回归中主要有  方差 :  \frac{1}{2}(observed-predicted)^2

2)

这一步得到所有样本的最佳初始预测值。

最小化观测值与预测值之间的误差并对预测值微分即可得到最佳初始观测值。

y_i  是观测值,\gamma 是常数 (这里用来代替初始预测值) ,F_{0}(x) 表示初始预测值

                                                       F_0(x)=\arg \min_{predicted} \sum_{i=1}^n 1/2(observed-predicted)^2

                                             \frac{\partial F_0(x)}{\partial predicted}=-\sum_{i=1}^n (observed-predicted)=-\sum_{i=1}^n y_i+n \gamma=0

                                                 \Rightarrow F_0(x)=\gamma =(\sum_{i=1}^n y_i)/n

3) 

这一步,建立M 棵树。

m=1,代表第一棵树,M 代表最后一棵树,通常 M=100。

Step2 是一个循环,主要包含以下几个部分:

这一步计算所有样本的第 m 棵树的残差。

\frac{\partial L}{\partial F} 是损失函数的导数也叫梯度,F是预测值(上一棵树的预测值),\frac{\partial L}{\partial F}=-(observed-predicted)

在 \frac{\partial L}{\partial F} 前面加个负号,这就是负向梯度, -\frac{\partial L}{\partial F}=observed-predicted,就是上面例子的 Residual,用 r 表示。

r_{im} 代表第 m 棵树第  i 个样本的残差。

如果损失函数用  \frac{1}{2}(observed-predicted)^2,则计算正常的残差  (observed-predicted)

如果损失函数用  (observed-predicted)^2,则得到类似残差的公式 2(observed-predicted),但不完全是  (observed-predicted);因此 r_{im} 叫伪残差。

这一步根据 (A) 计算的残差构建树。注意每个叶结点都要有数据,不能为空。

j 代表第 m 棵树的第 j 个结点。

这一步修正叶结点的残差值,因为有的叶结点有1个以上的残差值。跟上面例子中的 24)叶结点残差值修正一致。

\gamma_{jm} 表示第 j 个叶结点残差,y_i 表示第 j 个叶结点的观测值,F_{m-1}(x_i) 表示第 j 个叶结点预测值,\gamma 是常数(用来替代第 j 个叶结点的残差值)。

对于每个结点都有一个最优残差值 \gamma_{jm} 是 第 j 个叶结点的观测值 y_i  与 (第 j 个叶结点预测值 F_{m-1}(x_i) +第 j 个叶结点的残差值 \gamma) 之间的最小误差。因此通过损失函数对\gamma 微分即可找到每个结点的最优残差值 \gamma_{jm}

假设第m棵树第1个叶结点有l个残差,则:

                                                \gamma_{1m}=\arg \min_{\gamma}\sum_{i=1}^l((y_i-F_{m-1}(x_i))-\gamma)^2

                                              \frac{\partial \gamma_{1m}}{\partial \gamma}=-2\sum_{i=1}^l((y_i-F_{m-1}(x_i))-\gamma)=0

                                                        \Rightarrow \sum_{i=1}^l(y_i-F_{m-1}(x_i))-l\gamma=0

                                                        \Rightarrow \gamma_{1m}=\gamma=\sum_{i=1}^l(y_i-F_{m-1}(x_i))/l

注意:Step1中的损失函数不包括残差预测值;Step1中的损失函数计算包含了所有样本(n);这步中的损失函数只包含当前叶结点的数据然后对所有叶结点相加得到 \gamma_{jm}

这一步计算新的预测值。

4) 误差低于阈值或达到迭代次数,返回F_m(x)

 

参考:StatQuest with Josh Starmer

你可能感兴趣的:(算法)