GBDT详解及举例

【尊重原创,转载请注明出处】http://blog.csdn.net/zpalyq110/article/details/79527653

  GBDT 的全称是 Gradient Boosting Decision Tree,梯度下降树,在传统机器学习算法中,GBDT算的上TOP3的算法。想要理解GBDT的真正意义,那就必须理解GBDT中的Gradient Boosting 和Decision Tree分别是什么?

1. Decision Tree:CART回归树

  没错,GBDT使用的决策树就是CART回归树,无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树自始至终都是CART回归树。
  对于回归树算法来说最主要的是寻找最佳的划分点,那么回归树中的可划分点包含了所有特征的所有可取的值。在分类树中最佳划分点的判别标准是熵或者基尼系数,都是用纯度来衡量的,但是在回归树中的样本标签也是连续数值,所以再使用熵之类的指标不再合适,取而代之的是平方误差,它能很好的评判数据分散程度。我们希望最佳划分节点能够使得划分得到的两组数据组内的标签值相近,如果每组的方差都很小,这就说明每组的组内相似度很高,确实应该被划分。
  取自李航《统计学习方法》回归树伪代码:

这里写图片描述

  从上图可以看出:利用方差寻找最佳划分点,预测值选择决策树的叶子节点中所有样本的真实值的均值。

2. Gradient Boosting: 负梯度——残差

  GBDT无疑也是Boosting家族的一员,而Adaboost在Boosting家族很出名,但是GBDT并没有采用Adaboost算法!!!那GBDT中的Boosting是怎么做的呢?
  先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
  再来 个公式表达:在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft1(x)ft−1(x)最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。
  最关键的来了,那这个所谓的损失是什么呢?下表是常见的损失函数:

这里写图片描述

  在上述损失函数中,GBDT选取了相对来说容易优化的损失函数——平方损失。针对怎样去拟合这个损失,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值。第t轮的第i个样本的损失函数的负梯度为:

rti=[L(yi,f(xi)))f(xi)]f(x)=ft1(x)rti=−[∂L(yi,f(xi)))∂f(xi)]f(x)=ft−1(x)

  对应损失函数列表可知,GBDT使用的平方损失,经过负梯度拟合得到了yf(xi)y−f(xi),这就是我们最终要去拟合的,它的另一个名字叫作残差。回到我们上面讲的那个通俗易懂的例子中,第一次迭代的残差是10岁,第二 次残差4岁……

3. GBDT算法流程以及实例详解

  上面两节分别将Decision Tree和Gradient Boosting介绍完了,下面将这两部分组合在一起就是我们的GBDT了。先上一张伪代码的图:

这里写图片描述

算法流程:

1.初始化弱学习器

f0(x)=argminγi=1NL(yi,γ)f0(x)=argminγ∑i=1NL(yi,γ)


2.对迭代轮数m=1,2,…M有
  a)对每个样本i=1,2,…,N,计算负梯度,即残差

rim=[L(yi,f(xi)))f(xi)]f(x)=fm1(x)rim=−[∂L(yi,f(xi)))∂f(xi)]f(x)=fm−1(x)

  b)将上步得到的残差作为样本新的真实值,并将数据(xi,rim)(i=1,2,..N)(xi,rim)(i=1,2,..N)

  d)更新强学习器

fm(x)=fm1(x)+j=1JΥjmI(xRjm)fm(x)=fm−1(x)+∑j=1JΥjmI(x∈Rjm)


3.得到强学习器

f(x)=fM(x)=f0(x)+m=1Mj=1JΥjmI(xRjm)f(x)=fM(x)=f0(x)+∑m=1M∑j=1JΥjmI(x∈Rjm)


实例详解:

  如下表所示:一组数据,特征为年龄、体重,身高为标签值。共有5条数据,前四条为训练样本,最后一条为要预测的样本。

编号年龄(岁)体重(kg)身高(m)(标签值)
15201.1
27301.3
321701.7
430601.8
5(要预测的)2565

1.初始化弱学习器:

f0(x)=argminγi=1NL(yi,γ)f0(x)=argminγ∑i=1NL(yi,γ)

  由于此时只有根节点,样本1,2,3,4都在根节点,此时要找到使得平方损失函数最小的参数ΥΥ

Υy=0Υ−y=0

所以初始化时,ΥΥ


2.对迭代轮数m=1:
  计算负梯度——残差
  

ri1=[L(yi,f(xi)))f(xi)]f(x)=f0(x)ri1=−[∂L(yi,f(xi)))∂f(xi)]f(x)=f0(x)

  说白了,就是残差(上面已经解释过了),在此例中,残差在下表列出:
 

编号真实值f0(x)f0(x)残差
11.11.475-0.375
21.31.475-0.175
31.71.4750.225
41.81.4750.325

此时将残差作为样本的真实值训练f1(x)f1(x),即下表数据

编号年龄(岁)体重(kg)身高(m)(标签值)
1520-0.375
2730-0.175
321700.225
430600.325

接着,寻找回归树的最佳划分节点,遍历每个特征的每个可能取值。从年龄特征的5开始,到体重特征的70结束,分别计算方差,找到使方差最小的那个划分节点即为最佳划分节点。
例如:以年龄7为划分节点,将小于7的样本划分为一类,大于等于7的样本划分为另一类。样本1为一组,样本2,3,4为一组,两组的方差分别为0,0.047,两组方差之和为0.047。所有可能划分情况如下表所示:

划分点小于划分点的样本大于等于划分点的样本总方差
年龄5/1,2,3,40.082
年龄712,3,40.047
年龄211,23,40.0125
年龄301,2,340.062
体重20/1,2,3,40.082
体重3012,3,40.047
体重601,23,40.0125
体重701,2,430.0867

以上划分点是的总方差最小为0.0125有两个划分点:年龄21和体重60,所以随机选一个作为划分点,这里我们选年龄21。
此时还需要做一件事情,给这两个叶子节点分别赋一个参数,来拟合残差。

Υj1=argminΥxiRj1L(yi,f0(xi)+Υ)Υj1=argmin⏟Υ∑xi∈Rj1L(yi,f0(xi)+Υ)

这里其实和上面初始化学习器是一个道理,平方损失,求导,令导数等于零,化简之后得到每个叶子节点的参数ΥΥ


3.对迭代轮数m=2,3,4,5,…,M:
  循环迭代M次,M是人为控制的参数,迭代结束生成M棵树


4.得到最后的强学习器:
  为了方别展示和理解,我们假设M=1,根据上述结果得到强学习器:

f(x)=fM(x)=f0(x)+m=1Mj=1JΥjmI(xRjm)f(x)=fM(x)=f0(x)+∑m=1M∑j=1JΥjmI(x∈Rjm)

如图所示得到只迭代一次,只有一颗树的GBDT:

这里写图片描述


5.预测样本5:
  样本5在根节点中(即初始学习器)被预测为1.475,样本5的年龄为25,大于划分节点21岁,所以被分到了右边的叶子节点,同时被预测为0.275。此时便得到样本5的最总预测值为1.75。


4. 总结

  本文章从GBDT算法的原理到实例详解进行了详细描述,后续的优缺点以及实际应用场景还会更新。希望自己在今后的学习过程中能及时将学到和悟到的东西整理出来,并分享给大家。
  

参考资料

  1. 李航 《统计学习方法》
  2. https://www.cnblogs.com/pinard/p/6140514.html
  3. https://www.cnblogs.com/ModifyRong/p/7744987.html
  4. https://www.jianshu.com/p/005a4e6ac775

【尊重原创,转载请注明出处】 http://blog.csdn.net/zpalyq110/article/details/79527653

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值