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、构造数据集
- # A least squares regression example # create some data
- N <- 1000
- X1 <- runif(N)
- X2 <- 2*runif(N)
- X3 <- ordered(sample(letters[1:4],N,replace=TRUE),levels=letters[4:1])
- X4 <- factor(sample(letters[1:6],N,replace=TRUE))
- X5 <- factor(sample(letters[1:3],N,replace=TRUE))
- X6 <- 3*runif(N)
- mu <- c(-1,0,1,2)[as.numeric(X3)]
- SNR <- 10 # signal-to-noise ratio
- Y <- X1**1.5 + 2 * (X2**.5) + mu
- sigma <- sqrt(var(Y)/SNR)
- Y <- Y + rnorm(N,0,sigma)
- # introduce some missing values
- X1[sample(1:N,size=500)] <- NA
- X4[sample(1:N,size=300)] <- NA
- data <- data.frame(Y=Y,X1=X1,X2=X2,X3=X3,X4=X4,X5=X5,X6=X6)
2、使用gbm函数建模
- library(gbm)
- # fit initial model
- gbm1 <-
- gbm(Y~X1+X2+X3+X4+X5+X6, # formula
- data=data, # dataset
- var.monotone=c(0,0,0,0,0,0), # -1: monotone decrease, +1: monotone increase,
- # 0: no monotone restrictions
- distribution="gaussian", # see the help for other choices
- n.trees=1000, # number of trees
- shrinkage=0.05, # shrinkage or learning rate, 0.001 to 0.1 usually work
- interaction.depth=3, # 1: additive model, 2: two-way interactions, etc.
- bag.fraction = 0.5, # subsampling fraction, 0.5 is probably best
- train.fraction = 0.5, # fraction of data for training, first train.fraction*N used for training
- n.minobsinnode = 10, # minimum total weight needed in each node
- cv.folds = 3, # do 3-fold cross-validation
- keep.data=TRUE, # keep a copy of the dataset with the object
- verbose=FALSE, # don't print out progress
- n.cores=1) # use only a single core (detecting #cores is error-prone, so avoided here)
3、使用交叉验证确定最佳迭代次数
- # check performance using 5-fold cross-validation
- best.iter <- gbm.perf(gbm1,method="cv")
- print(best.iter)
- [1] 111
4、各解释变量的重要程度
- # plot the performance # plot variable influence
- summary(gbm1,n.trees=best.iter) # based on the estimated best number of trees
- var rel.inf
- X3 X3 65.28183677
- X2 X2 29.23551102
- X1 X1 4.03158814
- X4 X4 0.77052093
- X6 X6 0.62159781
- X5 X5 0.05894533
参考资料:
Generalized Boosted Regression Modeling(gbm package)
HITSCIR-TM zkli-李泽魁 Bagging & Boosting
GBDT(Gradient Boost Decision Tree)的更多相关文章
- 后端程序员之路 10、gbdt(Gradient Boosting Decision Tree)
1.GbdtModelGNode,含fea_idx.val.left.right.missing(指向left或right之一,本身不分配空间)load,从model文件加载模型,xgboost输出的 ...
- Gradient Boost Decision Tree(&Treelink)
http://www.cnblogs.com/joneswood/archive/2012/03/04/2379615.html 1. 什么是Treelink Treelink是阿里集团内部 ...
- CART分类与回归树与GBDT(Gradient Boost Decision Tree)
一.CART分类与回归树 资料转载: http://dataunion.org/5771.html Classification And Regression Tree(CART)是决策 ...
- Gradient Boost Decision Tree(GBDT)中损失函数为什么是对数形式
由于最近要经常用到XGBOOST的包,不免对相关的GBDT的原理又重新学习了一遍, 发现其中在考虑损失函数的时候,是以对数log进行度量的,囿于误差平方和函数的印象 那么为什么是对数呢?可能是下面的原 ...
- Gradient Boosting Decision Tree学习
Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...
- GBDT(Gradient Boosting Decision Tree) 没有实现仅仅有原理
阿弥陀佛.好久没写文章,实在是受不了了.特来填坑,近期实习了(ting)解(shuo)到(le)非常多工业界经常使用的算法.诸如GBDT,CRF,topic model的一些算 ...
- 机器学习技法之Aggregation方法总结:Blending、Learning(Bagging、AdaBoost、Decision Tree)及其aggregation of aggregation
本文主要基于台大林轩田老师的机器学习技法课程中关于使用融合(aggregation)方法获得更好性能的g的一个总结.包含从静态的融合方法blending(已经有了一堆的g,通过uniform:voti ...
- GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法
GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...
- 决策树(decision tree)
决策树是一种常见的机器学习模型.形象地说,决策树对应着我们直观上做决策的过程:经由一系列判断,得到最终决策.由此,我们引出决策树模型. 一.决策树的基本流程 决策树的跟节点包含全部样例,叶节点则对应决 ...
随机推荐
- python opencv3 特征提取与描述 DoG SIFT hessian surf
git:https://github.com/linyi0604/Computer-Vision DoG和SIFT特征提取与描述 # coding:utf-8 import cv2 # 读取图片 im ...
- PHP7新特性 What will be in PHP 7/PHPNG
本文结合php官网和鸟哥相关文章总结: 官网:http://www.php7.ca/ https://wiki.php.net/phpng PHP7将在2015年10月正式发布,PHP7 ,将会是 ...
- redis 多实例 连接 加密码
=启动多个redis实例= #redis-server/usr/local/redis/redis6370.conf #redis-server/usr/local/redis/redis6371.c ...
- lor框架代码分析
属性 lor: version router route request response fn app create_app Router Route Request Response 属性 lor ...
- 【对比分析二】Web Storage和cookie的区别
1) 存储空间不同. a) Web Storage能提供5MB的存储空间(不同浏览器的提供的空间不同).Cookie仅4KB. b) Web Storage每个域(包括子域)有独立的存储空间,各 ...
- UVALive 6262 Darts
Description Consider a game in which darts are thrown at a board. The board is formed by 10 circles ...
- cookie、sessionStorage、localStorage 详解
转自--http://www.cnblogs.com/fly_dragon/p/3946012.html cookie Cookie的大小.格式.存储数据格式等限制,网站应用如果想在浏览器端存储用户的 ...
- 读书笔记_Effective_C++_条款三十五:考虑virtual函数以外的其他选择
举书上的例子,考虑一个virtual函数的应用实例: class GameCharacter { private: int BaseHealth; public: virtual int GetHea ...
- Git_Bug分支
软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一 ...
- Git_安装Git
最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Window ...