目录
1.提升树
在说GBDT之前,我们先来说一下BDT(提升树),提升树实际上是加法模型和前向分布算法,表示为:
在前向分布算法的第m步时,给定当前的模型,求解:
这样就可以得到第m棵决策树.只不过不同问题的提升树,损失函数不同。如果我们解决的一个回顾问题,我们用平方损失函数的话,第m次迭代的损失函数为:
这里的r就是残差,所以第m棵决策树是对该残差的拟合。但是要注意的是提升树算法中的基学习器是CART树的回归树。
这就是BDT算法的一般流程,简单总结就是初始化一棵树,计算残差,根据残差拟合一棵树,然后更新。下面就是完整的提升树算法:
这次要整理的BDT或者是下面的GBDT都是用CART回归树作为的基分类器,所以有必要了解以下CART回归树的生成过程,这也对应着面试过程中的一个问题,如何选择特征?这个细节其实就是CART回归树的生成过程,因为CART回归树生成的过程就是一个特征选择的过程。(这里PS以下:gbdt的弱分类器默认选择的是cart tree.其实也可以选择其他弱分类器,选择的前提是低方差和高偏差,boosting就是干降低偏差这个事情的。框架服从boosting框架即可)
一颗回归树对应着特征空间的一个划分以及在划分单元上的输出值。假设已将输入空间划分为M个单元,并且在每个单元上有一个固定的输出值 ,于是回归树模型表示为:
当输入空间的划分确定时,可以用平方误差 来表示回归树训练数据的误差,用平方误差最小的准则求解每个单元上的最优输出值。单元上的的最优输出值是上的所有输入实例对应的的均值,即
现在问题是如何对输入空间进行划分?这里采用的启发方法,选择第j个变量(特征)和它的取值s,作为切分变量和切分点,并定义两个区域:
然后寻找最优切分变量j和最优切分点s。这个是关键,如何寻找?
具体的求解
对固定输入变量j可以找到最优切分点s。
遍历所有输入变量,找到最优切分变量j,构成一个对(j,s).一次将输入空间划分为两个区域。重复上面的过程,直到满足条件,这样就生成了一颗回归树。
以上就是cart 回归树生成的方式。我们理解了BDT,接下来我们来看GBDT。
2.梯度提升之GBDT的原理
提升树利用加法模型和前向分布算法实现学习的优化过程,但损失函数是平方损失或者指数损失时,优化比较简单,但是对于一般的损失函数而言,往往每一步优化不容易,针对这个问题,所以Friedman大神提出了利用最速下降的近似方法,即利用损失函数的负梯度来拟合基学习器。就是它了。
用这个东西直接作为残差的近似值,拟合回归树。
怎么来理解这个近似?如果时平方损失函数的话,就一目了然了:
这时候对F(Xi)求导,得到:
就会发现,这个残差正是梯度的相反数,即:
所以在GBDT中使用负梯度作为残差进行拟合,当然这是平方损失函数,其他损失的话,也会得到近似的结论,只不过不是完全相等,这里放张图体会一下:
最后这里没太理解,可以看下面这种理解方式:
这其实就是GBDT的核心了,即利用损失函数的负梯度作为回归问题提升树算法中的残差的近似值去拟合一个回归树。gbdt每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。这样每轮训练的时候都能够让损失函数尽可能快的减小,尽快的收敛达到局部最优解或者全局最优解。
更加形象化的解释,可以看图。
可以发现GBDT和提升树的区别是残差使用了损失函数的负梯度来替代,且每个基学习器有了对应的参数权重。gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的(因为训练的过程是通过降低偏差来不断提高最终分类器的精度)。弱分类器一般会选择为cart tree(也就是分类回归树)。由于上述高偏差和简单的要求每个分类回归树的深度不会很深。最终的总分类器是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。
这就是GBDT的训练流程了,当然要明确一点,gbdt无论用于分类还是回归一直都是使用cart回归树,这个原因后面说,既然是用的回归树,我们就有:
这时候,流程可以化成下面的形式了,
算法第1步初始化,估计使损失函数极小化的常数值,它是只有一个根节点的树。第2(a)步计算损失函数的负梯度在当前模型的之,将它作为残差的估计。对于平方损失函数,它就是通常所说的残差,对于一般损失函数,它就是残差的近似值。第2(b)步估计回归树叶节点区域,以拟合残差的近似值。第2(c)步利用线性搜索估计叶节点区域的值,使损失函数极小化。第2(d)步更新回归树。第3步得到输出的最终模型 。
最后,我们从BDT到GBDT这样写是为了方便我们理解GBDT.到这里我们就需要纠正一个概念了。在GBDT中,每个新的弱分类器是学习负梯度的,而残差只不过是当损失函数为平方损失的时候一个特例而已,这就是为啥GBDT中可以使用其他损失函数同样能够学习的原因,上面说一般损失函数是拟合的残差近似值其实也是不太准确的说法。
3.GBDT如何用于分类?
首先明确一点,gbdt无论用于分类还是回归一直都是使用的cart回归树。不会因为我们所选择的任务是分类任务就选用分类树,这里面的核心是因为gbdt每轮的训练是在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的,残差相减是有意义的。
如果选用的弱分类器是分类树,类别相减是没有意义的。上一轮输出的是样本x属于A类,本一轮训练输出的样本x属于B类。A和B很多时候甚至都没有比较的意义,A类-B类是没有意义的。那么我们如何进行分类呢?
假设样本X总共有K类,来了一个样本,我们使用gdbt来判断样本x属于哪一类?流程如下:
1.我们在训练的时候,是针对样本X每个可能的类训练一个分类回归树。举个例子,假设目前样本一共三类,也就是K=3,样本x属于第二类。那么针对该样本x的分类结果,我们可以用一个三维向量[0,1,0]来表示。0表示样本不属于该类,1表示属于该类,因为样本属于第二类。
2.针对样本有三类的情况,我们实质上每轮训练的时候训练三棵树。
第一颗针对样本x的第一类,输入为(x,0),第二棵时针对样本x的第二类,输入(x,1),第三棵树针对样本的第三类,输入(x,0),则例的具体训练过程就是我们上面cart回归树生成过程了,按照上面的生成过程,我们就可以解出这三棵树以及三棵树上x类别的预测值f1(x),f2(x),f3(x)
3.在此类训练中,我们仿照多分类的逻辑回归,使用softmax产生概率,则属于类别1的概率:
4.对每个类别分别计算残差
如类别1:,类别2: ,类别3:
5.开始第二轮的训练,针对第一类输入为,针对第二类输入为,针对第三类输入为,继续训练出三棵树。
6.重复5直到迭代M轮,就得到了最后的模型,预测的时候只要找出概率最高的即为对应的类别。
4.优缺点
因为树要一个特征一个特征去计算对应的指标来选择合适的特征来作为切分点,所以特征数量很多的情况下 计算量太多,因此不适合处理高维稀疏数据。
还有一个GBDT二分类算法,这个先不整理了。只放一个参考链接。