GBDT、GBRT

GBDT(Gradient Boost Decision Tree)

原文:http://blog.csdn.net/aspirinvagrant/article/details/48415435

GBDT,全称Gradient Boosting Decision Tree,叫法比较多,如Treelink、 GBRT(Gradient Boost Regression Tree)、Tree Net、MART(Multiple Additive Regression Tree)等。GBDT是决策树中的回归树,决策树分为回归树和分类树,分类树的衡量标准是最大熵,而回归树的衡量标准是最小化均方差。GBDT可以用来做分类、回归。GBDT由多棵决策树构成,通常都是上百棵树,而且每棵树规模都较小(即树的深度会比较浅)。模型预测的时候,对于输入的一个样本实例,然后会遍历每一棵决策树,每棵树都会对预测值进行调整修正,最后得到预测的结果。

为了搞明白GBDT,下面先解释Gradient Boosting(GB,梯度提升)。

Boosting是利用一些弱分类器的组合来构造一个强分类器。与Boosting相比,GB每一次的计算是为了减少上一次的残差,就可以在残差减少的梯度方向上建立一个新的模型。在Gradient Boost中,每个新的模型是为了使得之前模型的残差往梯度方向减少,与Boosting对错误的样本加大加权的做法有着很大的区别。

还是不太明白?想想在线性回归中,我们希望找到一组参数使得模型的残差最小化。如果只使用一次项来解释二次曲线,那么就会存有大量残差,此时就可以用二次项来继续解释残差,所以可在模型中加入这个二次项。同样的,GB是先根据初始模型计算伪残差,之后建立一个学习器来解释伪残差,该学习器是在梯度方向上减少残差。再将该学习器乘上权重系数(学习速率)和原来的模型进行线性组合形成新的模型。这样反复迭代就可以找到一个使损失函数的期望达到最小的模型。

GBDT的每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习。如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄。如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学习。

概括GBDT:先构造一个(决策)树,然后不断在已有模型和实际样本输出的残差上再构造一颗树,依次迭代

 

GBDT的学习过程

ABCD四个人的年龄分别为15,19,23,27,分别为高中生、大学生、运动员和码农。
决策树学习过程:

 

GBDT的学习过程:

现在A,B,C,D的预测值都和真实年龄一致
A: 15岁高中学生,收入较少,天天没时间玩电脑;预测年龄A = 17– 2 = 15


B: 19岁大学生;收入较少,天天宅在宿舍玩电脑;预测年龄B = 17+ 2 = 19


C: 23岁运动员;收入较多,体育训练没时间玩电脑;预测年龄C = 25 – 2 = 23


D: 27岁码农;收入较多,长时间玩电脑;预测年龄D = 25 + 2 = 27

 

GBDT的优点:

(1)防止过拟合;
(2)每一步的残差计算其实变相地增大了分错instance的权重,而已经分对的instance则都趋向于0;
(3)残差作为全局最优的绝对方向。

GBDT的两个版本:

(1)残差版本把GBDT认为是一个残差迭代树,每一棵回归树都在学习前N-1棵树的残差;

      求解方法:残差----残差是全局最优值

      优化目标:让结果变成最好

(2)Gradient版本把 GBDT看作一个梯度迭代树,使用梯度下降法求解,每一棵回归树在学习前N-1棵树的梯度下降值。

 

      求解方法:局部最优方向 * 步长

      优化目标:让结果变成更好

RF和GBDT的对比:

   

  

R语言中gbm包用来实现boosting的扩展包。在gbm包中,采用的是决策树作为基学习器,重要的参数设置如下:

  • 损失函数的形式(distribution)
  • 迭代次数(n.trees)
  • 学习速率(shrinkage)
  • 再抽样比率(bag.fraction)
  • 决策树的深度(interaction.depth)

损失函数的形式容易设定,分类问题一般选择bernoulli分布,而回归问题可以选择gaussian分布。学习速率方面,学习速率是越小越好,但是步子太小的话,步数就得增加,也就是训练的迭代次数需要加大才能使模型达到最优,这样训练所需时间和计算资源也相应加大了。经验法则是设置shrinkage参数在0.01-0.001之间,而n.trees参数在3000-10000之间。

采用gbm自带的例子:

 

1、构造数据集

 

  1. # A least squares regression example # create some data  
  2. N <- 1000  
  3. X1 <- runif(N)  
  4. X2 <- 2*runif(N)  
  5. X3 <- ordered(sample(letters[1:4],N,replace=TRUE),levels=letters[4:1])  
  6. X4 <- factor(sample(letters[1:6],N,replace=TRUE))  
  7. X5 <- factor(sample(letters[1:3],N,replace=TRUE))  
  8. X6 <- 3*runif(N)   
  9. mu <- c(-1,0,1,2)[as.numeric(X3)]  
  10. SNR <- 10 # signal-to-noise ratio  
  11. Y <- X1**1.5 + 2 * (X2**.5) + mu  
  12. sigma <- sqrt(var(Y)/SNR)  
  13. Y <- Y + rnorm(N,0,sigma)  
  14. # introduce some missing values  
  15. X1[sample(1:N,size=500)] <- NA  
  16. X4[sample(1:N,size=300)] <- NA  
  17. data <- data.frame(Y=Y,X1=X1,X2=X2,X3=X3,X4=X4,X5=X5,X6=X6)  

 

 

2、使用gbm函数建模

 

  1. library(gbm)  
  2. # fit initial model  
  3. gbm1 <-  
  4. gbm(Y~X1+X2+X3+X4+X5+X6,             # formula  
  5.     data=data,                         # dataset  
  6.     var.monotone=c(0,0,0,0,0,0),    # -1: monotone decrease, +1: monotone increase,  
  7.                                          #  0: no monotone restrictions  
  8.     distribution="gaussian",        # see the help for other choices  
  9.     n.trees=1000,                     # number of trees  
  10.     shrinkage=0.05,                   # shrinkage or learning rate, 0.001 to 0.1 usually work  
  11.     interaction.depth=3,             # 1: additive model, 2: two-way interactions, etc.  
  12.     bag.fraction = 0.5,              # subsampling fraction, 0.5 is probably best  
  13.     train.fraction = 0.5,           # fraction of data for training, first train.fraction*N used for training  
  14.     n.minobsinnode = 10,             # minimum total weight needed in each node  
  15.     cv.folds = 3,                     # do 3-fold cross-validation  
  16.     keep.data=TRUE,                  # keep a copy of the dataset with the object  
  17.     verbose=FALSE,                   # don't print out progress  
  18.     n.cores=1)                        # use only a single core (detecting #cores is error-prone, so avoided here)  

 

 
  

3、使用交叉验证确定最佳迭代次数

 

 

  1. # check performance using 5-fold cross-validation  
  2. best.iter <- gbm.perf(gbm1,method="cv")  
  3. print(best.iter)  
  4. [1] 111  

 


4、各解释变量的重要程度

 

  1. # plot the performance # plot variable influence  
  2. summary(gbm1,n.trees=best.iter) # based on the estimated best number of trees  
  3.    var     rel.inf  
  4. X3  X3 65.28183677  
  5. X2  X2 29.23551102  
  6. X1  X1  4.03158814  
  7. X4  X4  0.77052093  
  8. X6  X6  0.62159781  
  9. X5  X5  0.05894533  

 

 

参考资料:

Generalized Boosted Regression Modeling(gbm package)

HITSCIR-TM zkli-李泽魁 Bagging & Boosting

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值