原文: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. [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)

    显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的 ...

  2. with在模板中的应用

    var str = 'Hello <%= name %>!'; var o = { name: 'Alice' }; function tmpl(str, obj) { str = 'va ...

  3. bzoj 3653

    每个点维护一颗以深度为下标,size-1为值的线段树,保存整颗子树的信息,这样就可以查询了,但是如果为每个节点都建立这么一颗树,显然会MLE,所以考虑在DFS序上建立主席树,然后每个节点原来对应的线段 ...

  4. ACM需要掌握算法

    数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列 双端队列 可并堆 左偏堆 二叉查找树 Treap 伸展树 并查集 集合计数问题 二分图的识别 平衡二叉树 二叉排序树 线段树 一维线段树 二维 ...

  5. hdu 4452 Running Rabbits 模拟

    Running RabbitsTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. POJ Anniversary party 树形DP

    /* 树形dp: 给一颗树,要求一组节点,节点之间没有父子关系,并且使得所有的节点的权值和最大 对于每一个节点,我们有两种状态 dp[i][0]表示不选择节点i,以节点i为根的子树所能形成的节点集所能 ...

  7. react中的children使用方法

    使用过vue的小伙伴都知道vue中有个slot,也就是插槽,作用就是占位,那么再react中可以使用children来替代 父组件 render(){ return( <div> < ...

  8. Git_解决冲突

    人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a new ...

  9. angularjs中如何在异步请求执行完以后再执行其他函数?

    angularjs中如何在异步请求执行完以后再执行其他函数? 之前脑袋回路就是从上到下的执行js,直到有一次我的页面上已经显示了空才走到angularjs里的$http的成功回调函数里,然后才开始正视 ...

  10. Oracle SP2-0640

    安装Oracle database 11g express edition后,使用自带的SQL命令行,执行 select 1 from dual; 报出错误:SP2-0640 未连接 解决方法:使用 ...