GBDT算法之回归算法

1、GBDT算法简介

GBDT,全称Gradient Boosting Decision Tree,梯度提升决策树。该算法于1999年由Friedman最早提出。

在boosting集成学习算法中,梯度提升算法是极其重要的一种算法。GBDT算法是梯度提升算法中一种具有代表性的算法。

GBDT算法的基本思路是通过对负梯度的不断拟合,实现学习器的更新,得到最终的强学习器。

当损失函数为平方损失函数时,负梯度正好等于残差,此时可通过对残差的不断拟合实现学习器的更新。

2、GBDT算法过程

GBDT算法本质上是一种回归算法,在此基础上可改造为分类算法。这里讲解GBDT回归算法。

在节点分裂过程中,一般是选择ID3算法、C4.5算法、CART算法中的一种。GBDT算法中,节点的分裂采用的是CART回归算法。

2.1 输入输出

1)输入

训练样本集:D=\left \{ (x_{1},y_{1}),(x_{2},y_{2}),...,(x_{N},y_{N}) \right \}

2)输出

最终回归树f(x)

2.2 算法过程

2.2.1 模型初始化

初始化的弱学习器为:f_{0}(x)=c,其中c=\frac{1}{N}\sum_{i=1}^{N}y_{i}

这里,初始化弱学习器的选择会对迭代效率产生影响。

2.2.2 进行迭代

对于t=1,2,...,T轮迭代:

1)计算样本残差

本轮样本残差r_{t,i}=y_{i}-f_{t-1}(x_{i}),i=1,2,...,N

Tips:

在梯度提升决策树中,损失函数的形态决定着梯度的计算。在GBDT回归算法中,一般选择平方损失函数。即:

L(y,f(x))=\frac{1}{2}(y-f(x))^{2}

此时其负梯度为:

-[\frac{\partial L(y,f(x))}{\partial f(x)}]_{f(x)=f_{t-1}(x)}=-\left [ \frac{\partial (\frac{1}{2}(y-f(x))^{2})}{\partial f(x)} \right ]_{f(x) =f_{t-1}(x)}=\left [ y-f(x) \right ]_{f(x)=f_{t-1}(x)}=y-f_{t-1}(x)

可以看出,此时的负梯度正好等于残差。

2)利用残差生成回归树

利用残差构建新的数据集D=\left \{ (x_{1},r_{t,1}),(x_{2},r_{t,2}),...,(x_{N},r_{t,N}) \right \}

利用新数据集生成回归树,在CART回归算法下,得到本轮的回归树h_{t}(x)

该回归树对应的叶子节点划分出的区域为R_{t,1},R_{t,2},...,R_{t,M_{t}}

对于叶子区域R_{t,m},其拟合值为\gamma _{t,m}=\frac{1}{N_{t,m}}\sum_{x_{}\in R_{t,m}}^{}r_{t,i},其中m=1,2,..,M_{t}N_{t,m}表示叶子区域样本的数量。

3)更新强学习器

f_{t}(x)=f_{t-1}(x)+h_{t}(x)=f_{t-1}(x)+\sum_{m=1}^{M_{t}}\gamma _{t,m}I(x\in R_{t,m})

在不满足停止条件时,继续迭代。

2.2.3 得到最终学习器

在第T轮迭代时:当损失函数小于指定值或满足其它设定的停止条件(如迭代次数、分类器在训练集或测试集上的性能等)时,迭代停止。

f(x)=f_{T}(x)=f_{0}(x)+\sum_{t=1}^{T}\sum_{m=1}^{M_{t}}\gamma _{t,m}I(x\in R_{t,m})

3、算法实例

给定如下数据集:

序号0123456789
age18202225283035404550
level1132354261
score50666070807688568264

x=(age,level)y=score为预测特征。

3.1 模型初始化

初始化的弱学习器为:

f_{0}(x)=\frac{1}{N}\sum_{i=1}^{N}y_{i}=69.2

这里,我们设定个模型停止迭代的条件:当残差为0或迭代次数>5时,停止迭代。

3.2 进行迭代

3.2.1 第1轮迭代

1)计算样本残差

本轮样本残差r_{1,i}=y_{i}-f_{0}(x_{i}),i=1,2,...,N

数据如下:

序号0123456789
age18202225283035404550
level1132354261
r1-19.2-3.2-9.20.810.86.818.8-13.212.8-5.2

2)利用残差生成回归树

在CART回归算法下,得到本轮的回归树。

将特征age从小到大排序,以每邻近两值的平均值作为切割点,可得9个切割点,切割点左右部分分别计算平均值,以两部分的平均值作为各部分的估计值,分别计算切割点左右的平方误差。类似处理特征level。

选择最小平方误差对应的特征和切割点,作为分裂节点。对分裂后的每个区域,继续照此分裂。设定树的深度为3,当树的深度达到3时停止分裂。

通过以上过程得出本轮回归树h_{1}(x)=\sum_{m=1}^{6}\gamma _{1,m}I(x\in R_{1,m})

共有6个叶子区域:

R_{1,1}=\left \{ (level,age)|level\leqslant 3.5,age\leqslant 19 \right \},其拟合值\gamma _{1,1}=-19.2

R_{1,2}=\left \{ (level,age)|level\leqslant 3.5,19< age\leqslant 34 \right \},其拟合值\gamma _{1,2}=-0.2

R_{1,3}=\left \{ (level,age)|level\leqslant 3.5,age> 34 \right \},其拟合值\gamma _{1,3}=-9.2

R_{1,4}=\left \{ (level,age)|level> 3.5,age\leqslant 32.5 \right \},其拟合值\gamma _{1,4}=6.8

R_{1,5}=\left \{ (level,age)|level> 3.5,32.5< age\leqslant 40 \right \},其拟合值\gamma _{1,5}=18.8

R_{1,6}=\left \{ (level,age)|level> 3.5,age> 40 \right \},其拟合值\gamma _{1,6}=12.8

其图示如下:

图中value表示回归树在该节点下的拟合值。

树的具体生成过程可参考:CART算法之回归树-CSDN博客

3)更新强学习器

f_{1}(x)=f_{0}(x)+h_{1}(x)=f_{0}(x)+\sum_{m=1}^{6}\gamma _{1,m}I(x\in R_{1,m})

3.2.2 第2轮迭代

1)计算本轮样本残差

本轮样本残差r_{2,i}=y_{i}-f_{1}(x_{i})=y_{i}-f_{0}(x_{i})-h_{1}(x_{i})=r_{1,i}-h_{1}(x_{i}),i=1,2,...,N

数据如下:

序号0123456789
age18202225283035404550
level1132354261
r20-3-911100-404

2)利用残差生成回归树

通过CART回归算法得出本轮回归树h_{2}(x)=\sum_{m=1}^{7}\gamma _{2,m}I(x\in R_{2,m})

共有7个叶子区域:

R_{2,1}=\left \{ (level,age)|age\leqslant 19 \right \},其拟合值\gamma _{2,1}=0

R_{2,2}=\left \{ (level,age)|19< age\leqslant 21 \right \},其拟合值\gamma _{2,2}=-3.0

R_{2,3}=\left \{ (level,age)|21< age\leqslant 23.5 \right \},其拟合值\gamma _{2,3}=-9.0

R_{2,4}=\left \{ (level,age)|23.5< age\leqslant 26.5 \right \},其拟合值\gamma _{2,4}=1.0

R_{2,5}=\left \{ (level,age)|26.5< age\leqslant 29 \right \},其拟合值\gamma _{2,5}=11

R_{2,6}=\left \{ (level,age)|age> 29,level\leqslant 1.5 \right \},其拟合值\gamma _{2,6}=4.0

R_{2,7}=\left \{ (level,age)|age> 29,level> 1.5 \right \},其拟合值\gamma _{2,7}=-1.0

其图示如下:

3)更新强学习器

f_{2}(x)=f_{1}(x)+h_{2}(x)=f_{0}(x)+\sum_{m=1}^{6}\gamma _{1,m}I(x\in R_{1,m})+\sum_{m=1}^{7}\gamma _{2,m}I(x\in R_{2,m})

3.2.3 第3轮迭代

 1)计算本轮样本残差

本轮样本残差r_{3,i}=y_{i}-f_{2}(x_{i})=y_{i}-f_{1}(x_{i})-h_{2}(x_{i})=r_{2,i}-h_{2}(x_{i}),i=1,2,...,N

数据如下:

0123456789
age18202225283035404550
level1132354261
r30000011-310

2)利用残差生成回归树

通过CART回归算法得出本轮回归树h_{3}(x)=\sum_{m=1}^{4}\gamma _{3,m}I(x\in R_{3,m})

共有4个叶子区域:

R_{3,1}=\left \{ (level,age)|level\leqslant 3.5,age \leqslant 34 \right \},其拟合值\gamma _{3,1}=0

R_{3,2}=\left \{ (level,age)|level\leqslant 3.5,34< age \leqslant 45 \right \},其拟合值\gamma _{3,2}=-3.0

R_{3,3}=\left \{ (level,age)|level\leqslant 3.5,age > 45 \right \},其拟合值\gamma _{3,3}=0

R_{3,4}=\left \{ (level,age)|level> 3.5 \right \},其拟合值\gamma _{3,4}=1.0

其图示如下:

3)更新强学习器

f_{3}(x)=f_{2}(x)+h_{3}(x)=f_{0}(x)+\sum_{m=1}^{6}\gamma _{1,m}I(x\in R_{1,m})+\sum_{m=1}^{7}\gamma _{2,m}I(x\in R_{2,m})+\sum_{m=1}^{3}\gamma _{3,m}I(x\in R_{3,m})

3.2.4 第4轮迭代

 1)计算本轮样本残差

本轮样本残差r_{4,i}=y_{i}-f_{3}(x_{i})=y_{i}-f_{2}(x_{i})-h_{3}(x_{i})=r_{3,i}-h_{3}(x_{i}),i=1,2,...,N

数据如下:

0123456789
age18202225283035404550
level1132354261
r0000000000

残差均为0,h_{3}(x)能够完全拟合残差,分裂停止。

3.3 得到最终学习器

最终学习器f(x)=f_{3}(x),即

f(x)=f_{0}(x)+\sum_{m=1}^{6}\gamma _{1,m}I(x\in R_{1,m})+\sum_{m=1}^{7}\gamma _{2,m}I(x\in R_{2,m})+\sum_{m=1}^{3}\gamma _{3,m}I(x\in R_{3,m})

=69.2+\sum_{t=1}^{3}\sum_{m=1}^{M_{t}}\gamma _{t,m}I(x\in R_{t,m})

4、算法代码实现

本例中,使用sklearn中的GradientBoostingRegressor算法训练回归树。由于该算法中的参数设置原因,最终分类树的结果可能与前述分析不一样。

from sklearn.ensemble import GradientBoostingRegressor
df = pd.DataFrame(
    {'age':[18,20,22,25,28,30,35,40,45,50],
    'level':[1,1,3,2,3,5,4,2,6,1],
    'score':[50,66,60,70,80,76,88,56,82,64]}
)
X = df.iloc[:,0:2]
y = df.iloc[:,2]
gbdt = GradientBoostingRegressor(random_state=0)
gbdt.fit(X,y)
gbdt.predict(X)
array([50.01010981, 65.98314498, 60.00986206, 70.00231756, 79.97949217,
       76.01309023, 87.99022476, 56.01830674, 81.99924901, 63.99420268])

5、算法的说明

1、GBDT算法既支持回归也支持分类,均以CART回归算法作为基学习器。在GBDT算法中,需要对残差进行拟合,因此其基学习器采用回归算法。

2、GBDT算法中的输入特征只支持连续特征,不支持类别特征。

3、在GBDT算法中实现过程中, 一般会设置一个学习率learning_rate,用shrinkage(缩减)的思想,缩小每棵树的贡献,延缓大幅度的拟合容易产生的过拟合。

  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值