一、提升树

提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法。以决策树为基函数的提升方法称为提升树,boosting tree。对分类问题的决策树是二叉分类树,对回归问题的决策树是二叉回归树。提升树算法是AdaBoost算法的特殊情况。我的理解提升树分为普通提升树与梯度提升树,普通提升树每次拟合的是真实残差值,而梯度提升树拟合的是损失函数在当前模型的的负梯度。

普通提升树解决回归问题算法如下

输入:训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)}

输出:提升树fM(x)

1) 初始化f0(x)=0

2) 对m=1,2,...,M

  a)计算残差 rmi=yi-fm-1(xi),i=1,2,..,n

  b)拟合残差rmi学习一个回归树,得到T(x;θm)

  c)更新fm(x)=fm-1(x)+T(x;θm)

3) 得到回归问题提升树  fM(x)=∑T(x;θm),  m=1,2,...,M

二、梯度提升树GBDT(Gradient Boosting Decision Tree)

普通提升树利用加法模型与前向分布算法实现学习的优化过程,这个时候损失函数可能是平方损失(如上例子)或者指数损失函数(AdaBoost就是指数损失函数,L=exp(-yf(x))),像平方损失函数,每棵树拟合的都是之前的残差值,这个能够直观去解释,但是如果是其它更一般的损失函数呢,如何去明确无误的一步步优化呢,有什么方法论去指引优化呢,优化的合理方向在哪呢?针对这一问题,Friedman于论文” Greedy Function Approximation…”中提出GBDT模型,为更一般形式的损失函数指明了优化方向。

其模型F定义为加法模型,x为输入样本,f为单棵树,w为每棵树的参数。

通过最小化损失函数求解最优模型:

也就是我们要找到一个使损失函数L最小的F,这里的损失函数跟构建单棵树所使用的损失函数不一样,是两码事,这里面的损失指的是所有树合并起来的整体损失。

与普通提升树不同的是,GBDT每次拟合的是损失函数L在当前模型F上的负梯度值,以此作为一个近似的残差值,拟合成一个新的回归树:

从上面几个公式我们就可以看到,梯度提升就是提升树的一种,也是前向分布算法实现的,所谓分布就是逐步提升,构建多棵树。

为什么GBDT每次拟合的是负梯度呢?

从我们的优化目标着手,我们的优化目标是让损失函数L越来越小,直到求解出一个最优的F,使得L到达最小值。那么我们可以把F整体做为一个变量去理解,跟我们之前的梯度下降法求解思路一样,让损失函数L对F进行求导,得到一个负梯度值,然后根据这个负梯度值作为新的值去拟合成一棵树,有n个样本,就会有n个负梯度值产生作为新的目标值y去拟合。F的初始值为F0,每构造一棵树f,F=Fm-1+f,就相当于模型F在负梯度方向又向前走了一步,直到走到最优解。这就是GBDT的核心思路,跟我们平时利用梯度下降法求解最优参数θ思路其实一样。

GBDT具体算法流程如下:

其中的步长就是对应了xgboost中常说的shinkage技术,对应调参参数就是eta,是通过减少每棵树的学习输出值,削弱每棵树的影响,让后面的树有更大的学习空间,理论上是增加了树的个数,能够防止过拟合。比如:如果原始目标值是y=1,假如第一颗树就学到了0.9,那后面树学的信息就很少了,而且几棵树可能就让模型收敛了,这样模型整体的精确度很大程度上都依赖于第一颗树了,容易过拟合;如果将每棵树都乘以0.1,这样第一颗树输出就为0.09,后面还有很多信息可以学习,同时构造的树也多了,多方承担,有效了防止过拟合。

三、树模型的梯度提升算法与传统的梯度下降求参数区别

传统梯度下降法是在参数空间进行搜索,找到最优参数:

  

树模型的梯度提升算法,是在函数空间进行搜索,找到最优的函数,也是梯度下降,所谓的提升指的是模型整体精度提升:

四、树模型优缺点

优点:

  可解释性强
  可处理混合类型特征
  具体伸缩不变性(不用归一化特征)
  有特征组合的作用
  可自然地处理缺失值
  对异常点鲁棒
  有特征选择作用

  可扩展性强,容易并行

缺点:

  缺乏平滑性(回归预测时输出值只能输出有限的若干种数值)
  不适合处理高维稀疏数据

GBDT理解的更多相关文章

  1. 一步一步理解GB、GBDT、xgboost

    GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...

  2. (转)GBDT迭代决策树理解

    在网上看到一篇对从代码层面理解gbdt比较好的文章,转载记录一下: GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Re ...

  3. gbdt xgboost 贼难理解!

    https://www.zybuluo.com/yxd/note/611571 https://zhuanlan.zhihu.com/p/29765582 gbdt 在看统计学习方法的时候 理解很吃力 ...

  4. 大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程

    目录 1.前述 2.向量空间的梯度下降: 3.函数空间的梯度下降: 4.梯度下降的流程: 5.在向量空间的梯度下降和在函数空间的梯度下降有什么区别呢? 6.我们看下GBDT的流程图解: 7.我们看一个 ...

  5. GB、GBDT、XGboost理解

    GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...

  6. GBDT的理解和总结

    2015/11/21 16:29:29 by guhaohit 导语: GBDT是非常有用的机器学习的其中一个算法,目前广泛应用于各个领域中(regression,classification,ran ...

  7. Adaboost\GBDT\GBRT\组合算法

    Adaboost\GBDT\GBRT\组合算法(龙心尘老师上课笔记) 一.Bagging (并行bootstrap)& Boosting(串行) 随机森林实际上是bagging的思路,而GBD ...

  8. LightGBM中GBDT的实现

    现在LightGBM开源了,这里将之前的一个文档发布出来供大家参考,帮助更快理解LightGBM的实现,整体思路应该是类似的. LightGBM优雅,快速,效果好,希望LightGBM越来越好:) L ...

  9. 决策树和基于决策树的集成方法(DT,RF,GBDT,XGBT)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 内容: 1.算法概述 1.1 决策树(DT)是一种基本的分类和回归方法.在分类问题中它可以认为是if-the ...

随机推荐

  1. 《Linux内核分析》第三周

    [李行之原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] <Linux内 ...

  2. java入门--4110:圣诞老人的礼物-Santa Clau’s Gifts

    学习了一下java的语法,就用poj上的题目做作练习,好更快的熟悉常用的java语法. 题目在这里 http://bailian.openjudge.cn/practice/4110/ import ...

  3. 《Spring2之站立会议10》

    <Spring2之站立会议10> 昨天,添加完了表情库: 今天,对整个项目进行了测试: 遇到的问题:测试后觉得有些方面还不足,需要进一步改进.

  4. RAC系统化学习

    1.RACSignal:   // 只要订阅者调用sendNext,就会执行nextBlock // 只要订阅RACDynamicSignal,就会执行didSubscribe // 前提条件是RAC ...

  5. mysql 列转行处理

    CREATE TABLE `table1` ( `id` ) DEFAULT NULL, `name` ) CHARACTER SET utf8 DEFAULT NULL ) ENGINE=MyISA ...

  6. std::string 字符串切割

    在很多字符串类库里都实现了split函数.不过在std里没有实现.在这里拿出几个: 1. 用单字符作为分隔 #include <string> #include <vector> ...

  7. BZOJ5461 PKUWC2018Minimax(概率期望+线段树合并+动态规划)

    离散化后,容易想到设f[i][j]为i节点权值为j的概率,不妨设j权值在左子树,则有f[i][j]=f[lson][j](pi·f[rson][1~j]+(1-pi)·f[rson][j~m]). 考 ...

  8. linux运行sh文件提示 permission denied

    原因:文件没权限 解决:chmod +x 文件名 赋予执行权限或者  chmod 777 文件(赋予最高权限)

  9. 【BZOJ1966】[AHOI2005]病毒检测(动态规划)

    [BZOJ1966][AHOI2005]病毒检测(动态规划) 题面 BZOJ 洛谷 题解 我就蒯了一份代码随便改了改怎么就过了??? 从这道题目蒯的 代码: #include<iostream& ...

  10. 【转】C/C++位域结构深入解析

    C/C++位域结构深入解析 内存是以字节为单位进行编址的,编程语言的基本类型中,最小类型的长度一般也就是1个字节.然而,在解决某些问题时,必须要有二进制层面的表达手段(见本博客的自己动手实现DNS协议 ...