原文: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

GBDT(Gradient Boost Decision Tree)的更多相关文章

  1. 后端程序员之路 10、gbdt(Gradient Boosting Decision Tree)

    1.GbdtModelGNode,含fea_idx.val.left.right.missing(指向left或right之一,本身不分配空间)load,从model文件加载模型,xgboost输出的 ...

  2. Gradient Boost Decision Tree(&Treelink)

    http://www.cnblogs.com/joneswood/archive/2012/03/04/2379615.html 1.      什么是Treelink Treelink是阿里集团内部 ...

  3. CART分类与回归树与GBDT(Gradient Boost Decision Tree)

    一.CART分类与回归树 资料转载: http://dataunion.org/5771.html        Classification And Regression Tree(CART)是决策 ...

  4. Gradient Boost Decision Tree(GBDT)中损失函数为什么是对数形式

    由于最近要经常用到XGBOOST的包,不免对相关的GBDT的原理又重新学习了一遍, 发现其中在考虑损失函数的时候,是以对数log进行度量的,囿于误差平方和函数的印象 那么为什么是对数呢?可能是下面的原 ...

  5. Gradient Boosting Decision Tree学习

    Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...

  6. GBDT(Gradient Boosting Decision Tree) 没有实现仅仅有原理

                阿弥陀佛.好久没写文章,实在是受不了了.特来填坑,近期实习了(ting)解(shuo)到(le)非常多工业界经常使用的算法.诸如GBDT,CRF,topic model的一些算 ...

  7. 机器学习技法之Aggregation方法总结:Blending、Learning(Bagging、AdaBoost、Decision Tree)及其aggregation of aggregation

    本文主要基于台大林轩田老师的机器学习技法课程中关于使用融合(aggregation)方法获得更好性能的g的一个总结.包含从静态的融合方法blending(已经有了一堆的g,通过uniform:voti ...

  8. GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法

    GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...

  9. 决策树(decision tree)

    决策树是一种常见的机器学习模型.形象地说,决策树对应着我们直观上做决策的过程:经由一系列判断,得到最终决策.由此,我们引出决策树模型. 一.决策树的基本流程 决策树的跟节点包含全部样例,叶节点则对应决 ...

随机推荐

  1. 求N!末尾所得数字0的个数

    题目:给定一个整数N ,那么N 的阶乘N !末尾有多少个0呢? 例如:N = 10,N! = 3628800,所以N!末尾就有2个零. 分析:如果直接先算出N!阶乘,很容易导致内存溢出.显然,直接算出 ...

  2. [CC-MCHEF]MasterChef

    [CC-MCHEF]MasterChef 题目大意: \(n(n\le10^5)\)片花,第\(i\)片花的美观度为\(b_i(|b_i|\le10^9)\).总体美观度为各片花的美观度之和. 由于有 ...

  3. (Nginx) URL REWRITE

    URL重写的基础介绍 把URI地址用作参数传递:URL REWRITE 最简单的是基于各种WEB服务器中的URL重写转向(Rewrite)模块的URL转换: 这样几乎可以不修改程序的实现将 news. ...

  4. 细说React(二)

    上篇文章主要介绍了React的基本用法,这次将介绍一个React路由组件—react-router. 在 web 应用开发中,路由系统是不可或缺的一部分.在浏览器当前的 URL 发生变化时,路由系统会 ...

  5. 【JavaScript代码实现四】获取和设置 cookie

    // 创建cookie function setCookie(name, value, expires, path, domain, secure) { var cookieText = encode ...

  6. 机器学习(4):BP神经网络原理及其python实现

    BP神经网络是深度学习的重要基础,它是深度学习的重要前行算法之一,因此理解BP神经网络原理以及实现技巧非常有必要.接下来,我们对原理和实现展开讨论. 1.原理  有空再慢慢补上,请先参考老外一篇不错的 ...

  7. [分享]2013:Linux的黄金之年-十大杰出成就

    2013年已经过去.这一年见证了许多里程碑事件,使得2013年可以称得上是一个Linux的黄金之年.其中一些成果在FOSS和Linux世界更可以称得上是举世瞩目的成就. 1.Android的上升趋势 ...

  8. 《C预处理》Linux内核中可变参数宏的用法

    http://blog.csdn.net/tankai19880619/article/details/12015305

  9. lykchat+zabbix实现微信告警

    http://www.ttlsa.com/zabbix/lykchat-zabbix-wechat-alert/

  10. 《TCP/IP具体解释卷2:实现》笔记--IP:网际协议

    本章介绍IP分组的结构和主要的IP处理过程,包含输入,转发和输出. 下图显示了IP层常见的组织形式. 在之前的文章中.我们看到了网络接口怎样把到达的IP分组放到IP输入队列ipintrq中去,并怎样调 ...