机器学习中的算法:决策树模型组合之gbdt(gradientboostdecisiontree)

小猪童鞋 小猪童鞋     2022-07-28     116

关键词:

【转载自:http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/random-forest-and-gbdt.html

 

前言

    决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的。

    模型组合(比如说有Boosting,Bagging等)与决策树相关的算法比较多,这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的减少单决策树带来的毛病,有点类似于三个臭皮匠等于一个诸葛亮的做法,虽然这几百棵决策树中的每一棵都很简单(相对于C4.5这种单决策树来说),但是他们组合起来确是很强大。

    在最近几年的paper上,如iccv这种重量级的会议,iccv 09年的里面有不少的文章都是与Boosting与随机森林相关的。模型组合+决策树相关的算法有两种比较基本的形式
随机森林与GBDT(Gradient Boost Decision Tree),其他的比较新的模型组合+决策树的算法都是来自这两种算法的延伸。在看本文之前,建议先看看机器学习与数学(3)与其中引用的论文,本文中的GBDT主要基于此,而随机森林相对比较独立。

 

基础内容

     有两个概念比较重要:首先是information
gain,其次是决策树。推荐Andrew Moore的Decision Trees Tutorial,与Information
Gain Tutorial
,以及Moore的Data Mining Tutorial系列。决策树可分为分类树与回归树,一个用于分类,一个用于回归。对于决策树的分类功能,简单的讲是通过每一个特征(属性),对样本进行粗略的分类,可能只是分成2类。但是运用的特征多了,分类的结果就细了,所以最终会有较正确的分类效果。

      决策树实际上是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间一分为二,例如图1所示的决策树,其属性的值都是连续的实数:首先先根据特征x,将特征x的值小于3和大于等于3的分为2类,再根据特征y对样本再次细分,如此循环,这样使得每一个叶子节点都是在空间中的一个不相交的区域。分割后的空间如图2所示。在进行决策的时候对于新来的样本,从根结点开始判断,根据输入样本每一维feature的值,一步一步往下,最后使得样本落入N个区域中的一个(假设有N个叶子节点)。

 

image

图 1

image

图 2

GBDT(Gradient Boost Decision Tree)

   GBDT是一个应用很广泛的算法,可以用来做分类、回归。在很多的数据上都有不错的效果。GBDT这个算法还有一些其他的名字,比如说MART(Multiple Additive Regression Tree),GBRT(Gradient Boost Regression Tree),Tree Net等,其实它们都是一个东西(参考自wikipedia
– Gradient Boosting
),发明者是Friedman

   Gradient Boost其实是一个框架,里面可以套入很多不同的算法,可以参考一下机器学习与数学(3)中的讲解。Boost是"提升"的意思,一般Boosting算法都是一个迭代的过程,每一次新的训练都是为了改进上一次的结果。

   原始的Boost算法是在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。在每一步训练中得到的模型,会使得数据点的估计有对有错,我们就在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的分类器(basic
learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。

   而Gradient Boost与传统的Boost的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boost中,每个新的模型的简历是为了使得之前模型的残差往梯度方向减少,与传统Boost对正确、错误的样本进行加权有着很大的区别。

   在分类问题中,有一个很重要的内容叫做Multi-Class Logistic,也就是多分类的Logistic问题,它适用于那些类别数>2的问题,并且在分类结果中,样本x不是一定只属于某一个类可以得到样本x分别属于多个类的概率(也可以说样本x的估计y符合某一个几何分布),这实际上是属于Generalized
Linear Model中讨论的内容,这里就先不谈了,以后有机会再用一个专门的章节去做吧。这里就用一个结论:如果一个分类问题符合几何分布,那么就可以用Logistic变换来进行之后的运算

   假设对于一个样本x,它可能属于K个分类,其估计值分别为F1(x)…FK(x),Logistic变换如下,logistic变换是一个平滑且将数据规范化(使得向量的长度为1)的过程,结果为属于类别k的概率pk(x),

image

   对于Logistic变换后的结果,损失函数为:

image   
其中,yk为输入的样本数据的估计值,当一个样本x属于类别k时,yk = 1,否则yk = 0。

    将Logistic变换的式子带入损失函数,并且对其求导,可以得到损失函数的梯度

image   
上面说的比较抽象,下面举个例子:

    假设输入数据x可能属于5个分类(分别为1,2,3,4,5),训练数据中,x属于类别3,则y = (0, 0, 1, 0, 0),假设模型估计得到的F(x) = (0, 0.3, 0.6, 0, 0),则经过Logistic变换后的数据p(x) = (0.16,0.21,0.29,0.16,0.16),y
- p得到梯度g:(-0.16, -0.21, 0.71, -0.16, -0.16)。观察这里可以得到一个比较有意思的结论:

    假设gk为样本当某一维(某一个分类)上的梯度:

    gk>0时,越大表示其在这一维上的概率p(x)越应该提高,比如说上面的第三维的概率为0.29,就应该提高,属于应该往“正确的方向”前进

                  越小表示这个估计越“准确”

    gk<0时,越小,负得越多表示在这一维上的概率应该降低,比如说第二维0.21就应该得到降低。属于应该朝着“错误的反方向”前进

                  越大,负得越少表示这个估计越“不错误 ”

    总的来说,对于一个样本,最理想的梯度是越接近0的梯度。所以,我们要能够让函数的估计值能够使得梯度往反方向移动(>0的维度上,往负方向移动,<0的维度上,往正方向移动)最终使得梯度尽量=0),并且该算法在会严重关注那些梯度比较大的样本,跟Boost的意思类似

 

 

    得到梯度之后,就是如何让梯度减少了。这里是用的一个迭代+决策树的方法,当初始化的时候,随便给出一个估计函数F(x)(可以让F(x)是一个随机的值,也可以让F(x)=0),然后之后每迭代一步就根据当前每一个样本的梯度的情况,建立一棵决策树。就让函数往梯度的反方向前进,最终使得迭代N步后,梯度越小。

    这里建立的决策树和普通的决策树不太一样,首先,这个决策树是一个叶子节点数J固定的,当生成了J个节点后,就不再生成新的节点了。

    算法的流程如下:(参考自treeBoost论文)

image

     0. 表示给定一个初始值

     1. 表示建立M棵决策树(迭代M次)

     2. 表示对函数估计值F(x)进行Logistic变换

     3. 表示对于K个分类进行下面的操作(其实这个for循环也可以理解为向量的操作,每一个样本点xi都对应了K种可能的分类yi,所以yi, F(xi), p(xi)都是一个K维的向量,这样或许容易理解一点)

     4. 表示求得残差减少的梯度方向

     5. 表示根据每一个样本点x,与其残差减少的梯度方向,得到一棵由J个叶子节点组成的决策树

     6. 为当决策树建立完成后,通过这个公式,可以得到每一个叶子节点的增益(这个增益在预测的时候用的)

       每个增益的组成其实也是一个K维的向量,表示如果在决策树预测的过程中,如果某一个样本点掉入了这个叶子节点,则其对应的K个分类的值是多少。比如说,GBDT得到了三棵决策树,一个样本点在预测的时候,也会掉入3个叶子节点上,其增益分别为(假设为3分类的问题):

       (0.5, 0.8, 0.1),  (0.2, 0.6, 0.3),  (0.4, 0.3, 0.3),那么这样最终得到的分类为第二个,因为选择分类2的决策树是最多的。

     7. 的意思为,将当前得到的决策树与之前的那些决策树合并起来,作为新的一个模型(跟6中所举的例子差不多)

     GBDT的算法大概就讲到这里了,希望能够弥补一下上一篇文章中没有说清楚的部分:)

 

实现

     看明白了算法,就需要去实现一下,或者看看别人实现的代码,这里推荐一下wikipedia中的gradient boosting页面,下面就有一些开源软件中的一些实现,比如说下面这个:http://elf-project.sourceforge.net/

     另外我这里有一份GBDT的源代码http://pan.baidu.com/share/link?shareid=552848144&uk=2383340416

 

参考资料

     除了文章中的引用的内容(已经给出了链接)外,主要还是参考Friedman大牛的文章:Greedy function approximation : A Gradient Boosting Machine。

机器学习中的算法-决策树模型组合之随机森林与gbdt

版权声明:   本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com,本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系[email protected]。也可以加我的微博: @leftnoteasy 前言:   决策... 查看详情

机器学习中的算法-决策树模型组合之随机森林与gbdt

版权声明:   本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com,本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系[email protected] 前言:   决策树这种算法有着很多良好的特性,... 查看详情

决策树模型组合之(在线)随机森林与gbdt

前言:决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽... 查看详情

决策树模型组合之随机森林与gbdt(转)

...微博: @leftnoteasy 前言:   决策树这种算法有着很多良好的特性,比如 查看详情

机器学习-集成学习gbdt(代码片段)

...优点:高准确性:GBDT能够得到非常高的准确性,在许多机器学习问题中表现良好。鲁棒性:GBDT对于输入数据的异常值和噪声具有很强的鲁棒处理缺失值和高维特征:GBDT算法能够很好地处理缺失值和高维特征,这是由于决策树可... 查看详情

spark2.0机器学习系列之6:gbdt(梯度提升决策树)gbdt与随机森林差异参数调试及scikit代码分析

概念梳理GBDT的别称 GBDT(GradientBoostDecisionTree),梯度提升决策树。   GBDT这个算法还有一些其他的名字,比如说MART(MultipleAdditiveRegressionTree),GBRT(GradientBoostRegressionTree),TreeNet等,其实它们都是一个东西(参考自wikipedia–G... 查看详情

gbdt算法:原理篇

本文由云+社区发表GBDT是常用的机器学习算法之一,因其出色的特征自动组合能力和高效的运算大受欢迎。这里简单介绍一下GBDT算法的原理,后续再写一个实战篇。1、决策树的分类决策树分为两大类,分类树和回归树。分类树... 查看详情

gbdt算法简述

...要得益于其算法的性能,以及该算法在各类数据挖掘以及机器学习比赛中的卓越表现,有很多人对GBDT算法进行了开源代码的开发,比较火的是陈天奇的XGBoost和微软的LightGBM一、监督学习1、 监督学习的主要任务监督学习是机... 查看详情

机器学习gbdt-xgboost决策树提升(代码片段)

目录xgboostCART(ClassifyandRegressionTree)GBDT(GradientBoostingDesicionTree)GB思想(GradientBoosting)DT树(DesicionTree)横空出世的前向分步算法GB再解释GBDT大BOSS——xgboost训练xgboostxgboost模型目标函数正则化项处理理论终章最终章-拨开云雾见月明多说一... 查看详情

(二):gbdt算法梳理

...组成,所有树的结论加起来形成最终答案。GBDT也是集成学习Boosting家族的成员,但是却和传统的Adaboost有很大的不同。回顾下Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也... 查看详情

决策树与迭代决策树(转)

....5&CART4.RandomForest5.GBDT6.参考内容 今天我们来谈一谈机器学习算法中的各种树形算法,包括ID3、C4.5、CART以及基于集成思想的树模型RandomForest和GBDT。本 查看详情

开始学习机器学习时你必须要了解的模型有哪些?机器学习系列之决策树进阶篇(代码片段)

前言在上一篇文章中我们已经详细介绍了决策树模型,并且提到了ID3算法及其局限性,那么在本篇文章中,我们将会介绍基于ID3算法进行改良的C4.5算法以及决策树拟合度的优化问题。目录前言1C4.5算法1.1修改局部最优... 查看详情

十大经典预测算法---gbdt

...与AdaBoost不同,AdaBoost是通过不断加强对错判数据的权重学习来提升模型的预测效果,而GBDT则是通过不断降低模型误差来(学习残差)的思想来提升模 查看详情

4.sparkml学习笔记—sparkml决策树(应用案例)随机森林gbdt算法ml树模型参数详解(本篇概念多)(代码片段)

...机森林、GBDT算法4.1SparkML决策树4.1.1决策树定义4.1.2决策树学习过程4.1.3特征选择4.1.3.1特征选择:熵4.1.3.2特征选择:基尼4.1.3.3特征选择:方差4.1.4生成决策树的方法:ID3算法4.1.5使用决策树算法建立一个可扩展的分类器4.2集成学习4.2.1Bag... 查看详情

机器学习算法之决策树(上)

信息熵决策树决策树优化剪枝决策树可视化决策树直观理解比特化(Bits) 查看详情

gbdt:梯度提升决策树

...就和SVM一起被认为是泛化能力较强的算法。  GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类。  GBDT的思想使其具有天然优势可以发现多种有区分性的特征以及特征组合。业界... 查看详情

机器学习面试总结————

目录1、使用机器学习模型时,一般怎么处理数据集2、什么是训练误差和测试误差3、什么是过拟合与欠拟合?怎么解决4、机器学习当中的回归模型有哪些5、机器学习当中的分类模型有哪些6、回归和分类模型的评价指标都有哪... 查看详情

gbdt-梯度提升决策树

...GBDT与SVM支持向量机被认为是泛化能力较强的模型。名称中的提升(Boosting)说明该算法是一种集成算法,与AdaBoosting不同的是:GBDT集成的对象必须是C 查看详情