梯度提升树(GBDT)原理与Python实现

前言

看完统计学习方法有一段时间了,一直拖着没有总结。临近期末,复习完课程再去学新的知识过于疲劳,就想着把之前决定写的总结都给补一下。统计学习方法实现基本也差不多完成了(还有一两章寒假慢慢补吧),所有代码详见github(包括决策树,逻辑回归,SVM,梯度提升树,Adaboost,隐马尔可夫模型等)。所有实现都有很详细的注释,如果能够帮助到你的话就可以点个赞吧~

正文

回归树

  在讲梯度提升树之前,先简单了解下回归树。因为GBDT中每一轮对残差拟合的都是回归树(无论是用GBDT做回归还是分类)。
  在CART算法中,回归树均为二叉树,内部节点特征值作为分割点,左边分支对应特征值小于该切分点,右边分支对应特征值大于该切分点。对于每个分支递归的寻找特征值与切分点,最后将输入空间(即特征空间)划分为了有限的单元(也就是叶节点),然后在在每一个单元上给出预测的值作为最终输出。
  

下面我们思考一下回归树的生成

  首先我们有输入变量X与输出变量Y。共同构成训练集D{(x1,y1),(x2,y2)…(xn,yn)}
  假定我们已经划分好了一棵树,它将输入空间划分为R1,R2,…,Rm总共m个单元(叶节点)。在每一个单元上预测值为cm。那么回归树可以表示为 f ( x ) = ∑ m = 1 M c m I ( x i ϵ R m ) f(x)=\sum_{m=1}^{M} c_{m}I (x_i \epsilon R_m ) f(x)=m=1McmI(xiϵRm)
  在每一个叶节点上,我们的损失函数使用MSE(均方误差)来衡量我们预测的准确性,则在该叶节点上损失为 L m = ∑ x ϵ R m ( y i − c m ) 2 L_m=\sum_{x\epsilon Rm}(y_{i}-c_m)^2 Lm=xϵRm(yicm)2
  那么我们怎么获得使得每一个叶节点上的损失最小呢。我们以cm为参数,对损失函数求导,令其为0,即可获得cm最佳值。如果你对于求和符号很不习惯,你可以试试一项一项的写,然后对每一个二次项中的cm求导,所有二次项相加和为0,得到cm即叶节点上所有值的均值。还是做个示范吧
∂ L m ∂ c m = ( y 1 − c m ) + ( y 2 − c m ) + . . . + ( y n − c m ) = 0 \frac{\partial L_m}{\partial c_m}=(y_1-c_m)+(y_2-c_m)+...+(y_n-c_m)=0 cmLm=(y1cm)+(y2cm)+...+(yncm)=0
c m = a v g ( y i ∣ x i ϵ R m ) c_m=avg(y_i|x_i\epsilon R_m) cm=avg(yixiϵRm)
  当我们获得了叶节点,基于以上我们就知道了如何获取最佳预测值了。那么下面的任务就是如何对于对输入空间进行划分呢。
  我们采用启发式的划分法,遍历所有可能的划分特征以及每一个特征对应的值,尝试以该值作为切分点构建左右节点。注意,回归树的分裂准则也是MSE。那么,我们就只需要找到划分之后似的左右节点MSE之和最小的特征与特征值作为切分变量(split variable)与切分点(split point)。假设当前选取第j个变量与其取值s,则左右区域R1与R2为: R 1 ( j , s ) = ( x ∣ x ( j ) < = s ) R_{1(j,s)}= (x|x^{(j)}<=s) R1(j,s)=(xx(j)<=s), R 2 ( j , s ) = ( x ∣ x ( j ) > s ) R_{2(j,s)}= (x|x^{(j)}>s) R2(j,s)=(xx(j)>s)

则我们遍历所有切分特征与切分点,求解
min ⁡ j , s [ min ⁡ c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min ⁡ c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] \min _{j, s}\left[\min _{c_{1}} \sum_{x_{i} \in R_{1}(j, s)}\left(y_{i}-c_{1}\right)^{2}+\min _{c_{2}} \sum_{x_{i} \in R_{2}(j, s)}\left(y_{i}-c_{2}\right)^{2}\right] j,sminc1minxiR1(j,s)(yic1)2+c2minxiR2(j,s)(yic2)2
从而获得最解切分变量与切分点。其中,确定切分之后,c1,c2的值为
c 1 = a v g ( y i ∣ x i ϵ R 1 ( j , s ) ) ) c1=avg(yi|xi\epsilon R_{1(j,s))}) c1=avg(yixiϵR1(j,s)))
c 2 = a v g ( y i ∣ x i ϵ R 2 ( j , s ) ) ) c2=avg(yi|xi\epsilon R_{2(j,s))}) c2=avg(yixiϵR2(j,s)))

最小二乘回归树生成算法

最小二乘回归树生成算法

回归提升树

  在进入正题之前,再简单说说回归提升树。提升树模型使用的前向分步算法,模型是决策树的加法模型。首先确定初始提升树 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0。则在第m步的时候,模型就是 f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x)=f_{m-1}(x)+T(x; \theta_m) fm(x)=f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值