【机器学习】集成学习之梯度提升树GBDT

Boosting方法的核心思想是对错分类的样本给予更高关注度,也就是样本权重,在提升树中与之对应的就是残差,在梯度提升树中就是梯度了。

Regression Decision Tree:回归树

回归树在之前讲决策树的讲过,这里重提一下。其实很简单,不要对它抱有什么很恐惧对感觉,哈哈,可能有的时候刚看到公式或者算法步骤很长一串,还有一堆数学表达,就感到头大。其实真的很简单,关键的东西就一点点,而且也不是很晦涩难懂,稍微一想就可以理解为什么要那么做。机器学习的很多东西都是按照常理在做的,可能有的时候发明这个东西的人自己都没有数学证明出来,但事实就是这么做效果好。很多证明也是后来才被证明出来的。

好了回归正题,先上算法

如果直到决策树的话,理解起来这个也很容易。就看第二步,就是把信息增益啥的换成了这种最佳分割策略,按照这个算法作出来的树是一个二叉树。

回归树总体流程类似于分类树,区别在于,回归树的每一个节点都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化平方误差。也就是被预测出错的人数越多,错的越离谱,平方误差就越大,通过最小化平方误差能够找到最可靠的分枝依据。分枝直到每个叶子节点上人的年龄都唯一或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。(引用自一篇博客,详见参考文献3)

一般回归树就是CART树。

提升树

提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中性能最好的方法之一。(为什么会被认为是最好的呢,后面会讲。)

从提升方法学习中就可以知道提升方法采用加法模型(基函数的线性组合)与前向分步算法,以决策树为基函数的提升方法成为提升树。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。

提升树用的是残差。

直接上算法吧。

算法实例:

提升树用的也是加法模型和向前分步算法,不过损失函数换成来MSE,在回归问题中。该实例中只应用了回归树的树桩来做基回归模型,实际使用中会稍微再复杂一点,但还是与adaboost同样的道理,基模型不可以太过复杂,否则容易过拟合。boosting方法是降低偏差的。

梯度提升树GBDT回归

先上算法

如果对比一下就会发现,梯度提升树的步骤流程与提升树几乎一模一样。两处变动,第一处是它不再是求残差而是负梯度。第二处是求叶子节点回归值的时候是最小化损失函数不是直接用平均值。

再仔细思考一下,如果说我们这里的损失函数是最小均方误差MSE,其实梯度提升树就和提升树一模一样了。MSE的负梯度就是残差,叶子节点处最小化损失函数就是取叶子节点的平均值。

梯度提升树就可以将损失函数换成其它的,比如指数损失函数,交叉熵损失函数等等。

这里提到的线性搜索就简单理解成遍历吧,其实线性搜索也有一堆方法。下次有时间再专门写一个章节。

好了,到这里提升树和GBDT的回归算法应该可以搞清楚了。接下来就讲讲GBDT的分类算法

GBDT二分类

参考https://blog.csdn.net/qq_22238533/article/details/79192579

将介绍在分类任务下的GBDT,大家将可以看到,对于回归和分类,其实GBDT过程简直就是一模一样的。如果说最大的不同的话,那就是在于由于loss function不同而引起的初始化不同、叶子节点取值不同

熟悉了吧,这个就是交叉熵损失,激活函数用的还是sigmoid函数,像极了LR回归的用法,所以这个也只能用在二分类上。

梯度算出来和LR回归的梯度也一样,不过LR是对\theta_j求的梯度,这边是对F(x)求的,所以少一个x。

这一步想表达的是以\{\tilde{y}_i,x_i\}^N_1为训练数据,拟合一颗分类树,最终得到叶子节点的区域。

其实这个时候的分类树和回归树已经一样了,区域的划分什么的都一样了,这个时候的分类树划分也可以用MSE了,y也是个数值变量。只是分类树的节点值计算或者损失函数不一样,以及在最后得到输出的时候会再输入到一个例如sigmoid的激活函数中去得到所属分类的概率输出。

关于GBDT二分类强烈建议看一下那篇csdn,里面有一个例子可以帮助理解。

GBDT多分类

https://blog.csdn.net/qq_22238533/article/details/79199605

先上算法

这里需要注意的是: 

  1. 对于多分类任务,GDBT的做法是采用一对多的策略(详情见文章)。 也就是说,对每个类别训练M个分类器。假设有K个类别,那么训练完之后总共有M*K颗树。 
  2. 两层循环的顺序不能改变。也就是说,K个类别都拟合完第一颗树之后才开始拟合第二颗树,不允许先把某一个类别的M颗树学习完,再学习另外一个类别。

看着上面乱七八糟的公式,心里乱糟糟的,可是一看到One VS Rest就完事了,豁然开朗,把思路返回到LR回归。第二个for循环里面做了一件什么事情呢,就是训练了K个决策树,每个决策树用来判断属于这一个类的概率,One Vs Rest总共需要训练K颗树,然后第一个循环就是GB算法。

关于第二点也是显而易见的,第二个for循环完整结束算是成功训练了一个One VS Rest模型,而GB模型是顺序串行的,肯定不能够乱了顺序咯。

看p函数其实也好理解,就是一个softmax函数。

多分类一般要先做one-hot编码

好了,还是推荐看一下博客,博客里有个例子

GBDT正则化

和Adaboost一样,我们也需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有三种方式。 
   

  1. 第一种是和Adaboost类似的正则化项,即步长(learning rate)。对于同样的训练集学习效果,较小的νν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。 
  2. 第二种正则化的方式是通过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。 使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。这里其实引入了bagging的思想,所以GBDT能够有效地抵御训练数据中的噪音,具有更好的健壮性。(降低方差)
  3. 第三种是对于弱学习器即CART回归树进行正则化剪枝。在决策树原理篇里我们已经讲过,这里就不重复了。

优缺点:

  1. Gradient Boosting:每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boost中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少(当然也可以变向理解成每个新建的模型都给予上一模型的误差给了更多的关注),与传统Boost对正确、错误的样本进行直接加权还是有区别的。
  2. Size of trees(J):模型叶结点的数量J需要根据现有数据调整,它控制着模型变量之间的相互作用,例如上一章案例中采用的仅仅两个叶结点(树桩),那么变量之间就没有什么相互作用了。一般情况下都选择J的大小在4到8之间,J=2一般不能满足需要,J>10的情况也不太可能需要。—字面翻译过来的 
    这一部分理解还不太明白,路过大神帮忙解答,这里说的变量之间相互作用具体指什么?我的初步理解是控制了叶结点的数目其实也就控制了树的深度(层数),每一个分层结点都是选择了一个最优特征来划分,这样如果有多层结点,子结点与父结点的划分特征之间必然会有相互作用。 
  3. Shrinkage(缩减):在《统计》一书中并未提及,在wiki中介绍是正则化部分,防止过拟合。就是一个步长
  4. Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。用方程来看更清晰,即没用Shrinkage时:(yi表示第i棵树上y的预测值, y(1~i)表示前i棵树y的综合预测值) 
    y(i+1) = 残差(y1~yi), 其中: 残差(y1~yi) = y真实值 - y(1 ~ i) 
    y(1 ~ i) = SUM(y1, …, yi) 
    Shrinkage不改变第一个方程,只把第二个方程改为: 
    y(1 ~ i) = y(1 ~ i-1) + step * yi

    即Shrinkage仍然以残差作为学习目标,但对于残差学习出来的结果,只累加一小部分(step*残差)逐步逼近目标,step一般都比较小,如0.01~0.001(注意该step非gradient的step),导致各个树的残差是渐变的而不是陡变的。直觉上这也很好理解,不像直接用残差一步修复误差,而是只修复一点点,其实就是把大步切成了很多小步。本质上,Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,但和Gradient并没有关系。这个weight就是step。就像Adaboost一样,Shrinkage能减少过拟合发生也是经验证明的,目前还没有看到从理论的证明。

  5. GBDT几乎可用于所有回归问题(线性/非线性),相对logistic regression仅能用于线性回归,GBDT的适用面非常广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)。多分类也可以。
  6. 并行化实现:由于GBDT是迭代的学习方法,且下一模型的学习是在前一模型的基础上,因而只能在训练样本的层面上进行并行化处理。关于并行化相关内容等结合Xgboost学习再详细了解。
  7. GBDT 是一个加性回归模型,通过 boosting 迭代的构造一组弱学习器,相对LR的优势如不需要做特征的归一化,自动进行特征选择,模型可解释性较好,可以适应多种损失函数如 SquareLoss,LogLoss 等等。但作为非线性模型,其相对线性模型的缺点也是显然的:boosting 是个串行的过程,不能并行化,计算复杂度较高,同时其不太适合高维稀疏特征,通常采用稠密的数值特征如点击率预估中的 COEC。—引自xgboost导读与实战

在Adaboost中每个弱分类器之间其实联系不是很大,上一个弱分类器只是改变了下一个弱分类器所要训练的样本的权重。而在提升树中,下一个F(x)是直接由之前的所有的模型加权累加所得再去拟合新的梯度(残差)。

所以说仔细思考一下不难发现,GBDT到底是通过怎样的一种核心思想来使得模型的精度可以那么的强大。GBDT通过不断的去拟合残差(负梯度),使得模型可以一步一步的逼近最优解,从boosting的角度来看,对一个误差大的样本,那下一次拟合中,这个样本的负梯度就会很大(绝对值),所以模型在拟合的时候会对这个样本尤其关注,因为这个样本对模型的损失高低的影响权重相对梯度小的样本是很大的。再换一个角度思考,GBDT在adaboost上的改进考量其实就是让模型的优化有了一个更加明确的方向,adaboost是统一的将所有正确的样本的权重缩放,将错误的样本权重缩放,不难发现,所有的错误样本权重缩放之后权重和是0.5,每一步迭代都会是0.5。但它缺失了一种针对性。而GBDT通过求梯度,使得模型的优化方向为损失函数下降最快的方向,有了一定的针对性。

接下来会专门有一篇总结一下ensemble集成学习方法的优缺点等。

参考

https://blog.csdn.net/qq_22238533/article/details/79192579

https://www.jianshu.com/p/005a4e6ac775

https://blog.csdn.net/sb19931201/article/details/52506157

猜你喜欢

转载自blog.csdn.net/qq_32742009/article/details/81346636
今日推荐