随机森林 oob如何实现和GBDT分类器,都可以实现在线学习吗

没有更多推荐了,
不良信息举报
举报内容:
随机森林和GBDT算法的分析
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
从决策树说起决策树是我们后面一系列树方法的基础,因此不能不提。在我看来,它的精要只在一点,即如何衡量一个划分(split)的好坏。ID3用的是信息增益,C4.5用的是信息增益率,而CART用的是Gini系数。无论用的哪种metric,有一点是很有意思的,即做一次划分后的impurity一定是减少的(至少不会增加)。
更进一步讲,某一类sample总的impurity贡献在一次划分后是减少的。设某个node的样本数为n,其中某一类的样本数为a,记为(n, a),经过某一划分后,左右子节点分别为(n1, a2)、(n2, a2)。上述性质用数学公式可以表述为:
impurity(n, a) >= n1/n * impurity(n1, a1) + n2/n * impurity(n2, a2)
通过Jensen不等式可以证明(略)。
对于分类问题,impurity函数可以是熵或者Gini系数;对于回归问题,impurity函数一般采用方差。
(方差的来历:对连续值,一般让平方损失最小,因此节点的预测值取的是节点内均值,代入即为方差)
而将多个CART组合起来即可以产生一个ensemble模型,如RF。RF是决策树的组合,通过样本随机和特征集随机来提升模型的鲁棒性。这个模型的优势在于它很难过拟合,可以放心大胆的迭代下去。不好的地方则是随机的可解释性,你的效果比别人好,到底是模型好呢还是因为运气好。
Boosted-Tree很多讲gbdt的blog用的是残差的概念,即每添加一个新的树,学习的是之前剩下的残差。这么讲当然没有错,但是突然扔出这样一个概念还是略显生硬。另一类blog则用的是泛函的概念,摘抄了论文中比较复杂的公式,看了有点眼花缭乱。我个人觉得这里要说清楚,从boosted-tree的角度来讲更加自然。
假设我们想构造含有t颗树的模型,可以用下面的过程来表示:
每一轮迭代以后的输出,是当前所有树的求和。那么每一轮迭代我们如何去构造新的树呢?可以用下式来表示第t轮我们的目标函数,其中n是sample数,等式右边前一项是损失函数,第二项是正则项(可以忽略)。
我们将其前半部分使用Taylor展开,可以得到:
如果我们只看一阶导数,那么ft(x)取-gi时梯度下降最快(回想梯度下降算法),如果恰好损失函数用的是平方误差,那么 L=1/2*(y'-y)^2 ,即 g(y, y’) = y’-y,那么ft(x)的更新方向应为 -g(y, y’) = y-y’,这就是残差的由来;又因为这里的f是一个函数,因此又和泛函扯上了关系,求解这个泛函的过程实际上就是建树的过程。
而如果我们把二阶导数也考虑进去呢,那就得到了xgboost,陈天奇大神有非常详细的介绍,这里就不再细说。
计算split的比较对于连续值得feature,我们在求split时,一般是先做排序,然后顺序选择分割点并计算结构分数。
这里Boosted-Tree中的tree,相比于CART有一个很大的好处,那就是每一个sample的结构分是固定不变的,因此计算分数时只需要在上一次迭代后的分数的基础上算增量即可;而CART的impurity则无法计算增量,无论是熵还是gini系数,当增减sample时,需要全部重新算一次,这无疑是很大一部分的计算量。
关于LightGBM微软亚研最近开源了他们的LightGBM,我大致看了下,和xgboost一样用到了二阶导数。主要的特点如下:
- 使用直方图简化计算,计算split时只考虑直方图的bin做划分点,而不细化到每个sample。
- 使用leaf-wise替代level-wise,每次选择delta-loss最大的节点做分割。
- 计算直方图时,两个子节点只用计算其中一个,另一个通过root和前一个做差可得。
- 基于histogram的算法,在寻找最佳split时,可以先顺序访问data的gradient,填入对应bin中,提高cache hit。
- 对于category类型的feature,可以直接作为特征输入,不需要转化成one-hot之类的编码,据说在准确度差不多的情况下速度能快8倍以上。
有几个地方还有疑问
- 直方图中桶的个数和宽度如何确定?
- 如果要通过直方图做差节约计算,那么父节点和子节点的直方图分桶必须一致,难道一棵树所有节点的分桶都一致?
- 对于category类型的feature是如何做到支持直接输入的呢?
扫了一下源码,建直方图的过程如下:- 首先对原数据排序;
- 然后统计出distinct value 以及对应的 count;
- 如果distinct value数目小于max bin数,则正好每个value放入一个bin;
- 如果distinct value大于max bin,计算bin大小的均值,按一定规则将sample放入bin,保证相同value的放入同一bin,bin包含的sample数尽量平均。
- 注:max bin的默认值是256。
对于category类型的feature,则是每一种取值放入一个bin,且当取值的个数大于max bin数时,会忽略那些很少出现的category值。
在求split时,对于category类型的feature,算的是&按是否属于某个category值划分&的gain,这和数值型feature是完全不同的,它的实际效果就是类似one-hot的编码方法。
欢迎有兴趣的同学一起讨论~
要回复问题请先或
浏览: 3661
关注: 3 人版权声明:
&&& 本文由LeftNotEasy发布于, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系。也可以加我的微博:&
&&& 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的。
&&& 模型组合(比如说有Boosting,Bagging等)与决策树相关的算法比较多,这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的减少单决策树带来的毛病,有点类似于三个臭皮匠等于一个诸葛亮的做法,虽然这几百棵决策树中的每一棵都很简单(相对于C4.5这种单决策树来说),但是他们组合起来确是很强大。
&&& 在最近几年的paper上,如iccv这种重量级的会议,年的里面有不少的文章都是与Boosting与随机森林相关的。模型组合+决策树相关的算法有两种比较基本的形式 - 随机森林与GBDT((Gradient Boost Decision Tree),其他的比较新的模型组合+决策树的算法都是来自这两种算法的延伸。本文主要侧重于GBDT,对于随机森林只是大概提提,因为它相对比较简单。
&&& 在看本文之前,建议先看看与其中引用的论文,本文中的GBDT主要基于此,而随机森林相对比较独立。
基础内容:
&&& 这里只是准备简单谈谈基础的内容,主要参考一下别人的文章,对于随机森林与GBDT,有两个地方比较重要,首先是information gain,其次是决策树。这里特别推荐Andrew Moore大牛的,与。Moore的非常赞,看懂了上面说的两个内容之后的文章才能继续读下去。
&&& 决策树实际上是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间一分为二,比如说下面的决策树:
&&& 就是将空间划分成下面的样子:
&&& 这样使得每一个叶子节点都是在空间中的一个不相交的区域,在进行决策的时候,会根据输入样本每一维feature的值,一步一步往下,最后使得样本落入N个区域中的一个(假设有N个叶子节点)
随机森林(Random Forest):
&&& 随机森林是一个最近比较火的算法,它有很多的优点:
&&& 在数据集上表现良好
&&& 在当前的很多数据集上,相对其他算法有着很大的优势
&&& 它能够处理很高维度(feature很多)的数据,并且不用做特征选择
&&& 在训练完后,它能够给出哪些feature比较重要
&&& 在创建随机森林的时候,对generlization error使用的是无偏估计
&&& 训练速度快
&&& 在训练过程中,能够检测到feature间的互相影响
&&& 容易做成并行化方法
&&& 实现比较简单
&&& 随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。
&&& 在建立每一棵决策树的过程中,有两点需要注意 - 采样与完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从M个feature中,选择m个(m && M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。
&&& 按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从M个feature中选择m让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。
&&& 随机森林的过程请参考 。这个页面上写的比较清楚了,其中可能不明白的就是Information Gain,可以看看之前推荐过的Moore的页面。
Gradient Boost Decision Tree:
&& GBDT是一个应用很广泛的算法,可以用来做分类、回归。在很多的数据上都有不错的效果。GBDT这个算法还有一些其他的名字,比如说MART(Multiple Additive Regression Tree),GBRT(Gradient Boost Regression Tree),Tree Net等,其实它们都是一个东西(参考自),发明者是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),
&& 对于Logistic变换后的结果,损失函数为:
&&& 其中,yk为输入的样本数据的估计值,当一个样本x属于类别k时,yk = 1,否则yk = 0。
&&& 将Logistic变换的式子带入损失函数,并且对其求导,可以得到损失函数的梯度:
&&& 上面说的比较抽象,下面举个例子:
&&& 假设输入数据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论文)
&&&& 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页面,下面就有一些开源软件中的一些实现,比如说下面这个:&
参考资料:
&&&& 除了文章中的引用的内容(已经给出了链接)外,主要还是参考Friedman大牛的文章:Greedy function approximation : A Gradient Boosting Machine
阅读(...) 评论()没有更多推荐了,
不良信息举报
举报内容:
随机森林&GBDT算法以及在MLlib中的实现
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!当前位置: →
→ 决策树模型组合之在线随机森林与GBDT
决策树模型组合之在线随机森林与GBDT
& 作者及来源: wentingtu - 博客园 &
&收藏到→_→:
摘要: 决策树模型组合之(在线)随机森林与GBDT
"决策树模型组合之在线随机森林与GBDT"::
决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。但是同时, 单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的。
模型组合(比如说有boosting,bagging等)与决策树相关的算法比较多,这些算法最终的结果是生成n(可能会有几百棵以上)棵树,这样可以大 大的减少单决策树带来的毛病,有点类似于三个臭皮匠等于一个诸葛亮的做法,虽然这几百棵决策树中的每一棵都很简单(相对于c4.5这种单决策树来说),但 是他们组合起来确是很强大。
在最近几年的paper上,如iccv这种重量级的会议,iccv 09年 的里面有不少的文章都是与boosting与随机森林相关的。模型组合+决策树相关的算法有两种比较基本的形式 - 随机森林与gbdt((gradient boost decision tree),其他的比较新的模型组合+决策树的算法都是来自这两种算法的延伸。本文主要侧重于gbdt,对于随机森林只是大概提提,因为它相对比较简单。
在看本文之前,建议先看看机器学习与数学(3)与其中引用的论文,本文中的gbdt主要基于此,而随机森林相对比较独立。
基础内容:
这里只是准备简单谈谈基础的内容,主要参考一下别人的文章,对于随机森林与gbdt,有两个地方比较重要,首先是information gain,其次是决策树。这里特别推荐andrew moore大牛的decision trees tutorial,与information gain tutorial。moore的data mining tutorial系列非常赞,看懂了上面说的两个内容之后的文章才能继续读下去。
决策树实际上是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间一分为二,比如说下面的决策树:
就是将空间划分成下面的样子:
这样使得每一个叶子节点都是在空间中的一个不相交的区域,在进行决策的时候,会根据输入样本每一维feature的值,一步一步往下,最后使得样本落入n个区域中的一个(假设有n个叶子节点)
随机森林(random forest):
随机森林是一个最近比较火的算法,它有很多的优点:
在数据集上表现良好
在当前的很多数据集上,相对其他算法有着很大的优势
它能够处理很高维度(feature很多)的数据,并且不用做特征选择
在训练完后,它能够给出哪些feature比较重要
在创建随机森林的时候,对generlization error使用的是无偏估计
训练速度快
在训练过程中,能够检测到feature间的互相影响
容易做成并行化方法
实现比较简单
随机森林顾名思义,是用随此文来自: 马开东博客
转载请注明出处 网址:
机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输 入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本 为那一类。
在建立每一棵决策树的过程中,有两点需要注意此文来自: 马开东博客
转载请注明出处 网址:
- 采样与完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为n个,那 么采样的样本也为n个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从m 个feature中,选择m个(m && m)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一 个分类。一般很多的决策树算法都一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。
按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域 的专家(因为我们从m个feature中选择m让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数 据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。
随机森林的过程请参考mahout的random forest&。这个页面上写的比较清楚了,其中可能不明白的就是information gain,可以看看之前推荐过的moore的页面。
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),
对于logistic变换后的结果,损失函数为:
其中,yk为输入的样本数据的估计值,当一个样本x属于类别k时,yk = 1,否则yk = 0。
将logistic变换的式子带入损失函数,并且对其求导,可以得到损失函数的梯度:
上面说的比较抽象,下面举个例子:
假设输入数据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论文)
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/
参考资料:
除了文章中的引用的内容(已经给出了链接)外,主要还是参考friedman大牛的文章:greedy function approximation : a gradient boosting machine
本文由leftnoteasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系
=========================================
cvchina上的《online random forest》
一直忽悠cvchina,心有歉意。第一次发文,简单写点online learning的东西。
传统的svm和adaboost都是batch mode learning. 所谓的batch mode learning, 简单说,就是所有的训练数据都是available的(或则说所有训练数据都已经在内存中)。这种方法主要有2个缺点:
1)& 有时候数据量太大,在内存中放不下,处理起来不方便
2)& 由于应用环境限制,有时候无法在训练之前得到所有训练数据
而online learning, 他的数据是come in sequence,也就是说traning sample 是一个一个来,或则是几个几个来,然后classifer 根据新来的samples进行更新。online learning是比较困难的,主要原因是你无法知道将来的训练数据是如何的。显然adaboost和svm是行不通的。最近几年也有一些人做 online learning的研究,主要方法还是集中在online boosting这一块。推荐2篇不错的文章:
1)& online adaboost [1], 并把他用在object tracking等方面。这篇文章发表于cvpr2006引用率蛮高。这几年的cvpr上的几篇做tracking的文章以这个idea为基础。 tracking的方法是用最近比较流行的tracking-by-detection的方法。简答的说就是在tracking的时 候,observation model这一块是用一个在线训练的分类器。tracking的过程如下图所示(图中还有一步是用跟踪的结果作为训练器的新的输入):
这篇文章online 训练的时候,用tracking 的结果作为online classifier的positive samples。显然这种数据是有噪声的,最后tracking会drift掉。而且需要指出的是,这种方法没有严格证明,只是模仿batch mode adaboost. 我把这个算法用在uci的训练数据上,效果不是很好。作者的主页是:http://www.vision.ee.ethz.ch/~hegrabne/. 这个是他用online learning 做tracking的项目主页:h搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
决策树模型组合之在线随机森林与GBDT_博客园相关文章
博客园_总排行榜
博客园_最新
博客园_月排行榜
博客园_周排行榜
博客园_日排行榜}

我要回帖

更多关于 随机森林分类器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信