原文: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. python opencv3 特征提取与描述 DoG SIFT hessian surf

    git:https://github.com/linyi0604/Computer-Vision DoG和SIFT特征提取与描述 # coding:utf-8 import cv2 # 读取图片 im ...

  2. PHP7新特性 What will be in PHP 7/PHPNG

    本文结合php官网和鸟哥相关文章总结: 官网:http://www.php7.ca/   https://wiki.php.net/phpng PHP7将在2015年10月正式发布,PHP7 ,将会是 ...

  3. redis 多实例 连接 加密码

    =启动多个redis实例= #redis-server/usr/local/redis/redis6370.conf #redis-server/usr/local/redis/redis6371.c ...

  4. lor框架代码分析

    属性 lor: version router route request response fn app create_app Router Route Request Response 属性 lor ...

  5. 【对比分析二】Web Storage和cookie的区别

    1)  存储空间不同. a)  Web Storage能提供5MB的存储空间(不同浏览器的提供的空间不同).Cookie仅4KB. b)  Web Storage每个域(包括子域)有独立的存储空间,各 ...

  6. UVALive 6262 Darts

    Description Consider a game in which darts are thrown at a board. The board is formed by 10 circles ...

  7. cookie、sessionStorage、localStorage 详解

    转自--http://www.cnblogs.com/fly_dragon/p/3946012.html cookie Cookie的大小.格式.存储数据格式等限制,网站应用如果想在浏览器端存储用户的 ...

  8. 读书笔记_Effective_C++_条款三十五:考虑virtual函数以外的其他选择

    举书上的例子,考虑一个virtual函数的应用实例: class GameCharacter { private: int BaseHealth; public: virtual int GetHea ...

  9. Git_Bug分支

    软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一 ...

  10. Git_安装Git

    最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Window ...