转自:http://blog.csdn.net/w28971023/article/details/43704775
一、要理解GBDT当然要从GB(Gradient Boosting)和DT(Decision Tree)两个角度来理解了;
二、GB其实是一种理念,他并不是这一个具体的算法,意思是说沿着梯度方向,构造一系列的弱分类器函数,并以一定权重组合起来,形成最终决策的强分类器;注意,这里的梯度下降法是在函数空间中通过梯度下降法寻找使得LOSS最小的一个函数,即L(y,f)对f求层,区别于传统的梯度下降法选择一个方向(对x求导);那么问题就来了,对函数求导?这也太难了吧。所以就有了一个近似的方法,根据经验风险最小化原则,我们认为在训练集上使得LOSS最小的函数,往往在测试集上表现会好,即在训练集上寻优;因此,把求导的函数理解成在训练集上该函数对应的离散的函数值,对函数求导就变成了对样本的函数值向量求导;因此就可以得到一个梯度向量,表示寻找到的最优函数, 这个函数就是一个新的弱分类器;
三、通过回归树来拟合这个梯度向量,就得到了DT,而每棵树就对应上面的函数,其预测值就是函数值;
四、当我们选择平方差损失函数时,函数向量就表示成前一棵回归树在样本空间上的预测值,则对函数向量求梯度就等于目标值减去预测值,即我们所说的残差向量;因此,下一棵回归树就是在拟合这个残差向量;
五、回归树拟合可以通过平均最小均方差来寻找分裂点,生成一个树;当然这棵树不可能完全拟合得好,因此,又会通过对损失函数求梯度,得到新的残差向量;
六、对初始分类器(函数)的选择就可以直接用0,通过平方差LOSS函数求得的残差当然就是样本本身了;也可以选择样本的均值;
七、一棵树的分裂过程只需要找到找到每个结点的分裂的特征id与特征值,而寻找的方法可以是平均最小均方差,也可以是使得(左子树样本目标值和的平方均值+右子树样本目标值和的平方均值-父结点所有样本目标值和的平方均值)最大的那个分裂点与分裂特征值等等方法;从而将样本分到左右子树中,继续上面过程;
八、用残差更新每个样本的目标值:叶子节点的均值作为落到该叶子节点的样本的预测值,使用目标值减去预测值,得到该样本的残差,作为下一棵树的训练目标;
九、对于使用logistic作为损失函数的多分类问题,下面单独进行推导说明:
1、多分类问题与回归问题不同,每棵树的样本的目标就不是一个数值了,而是每个样本在每个分类下面都有一个估值Fk(x);
2、同逻辑回归一样,假如有K类,每一个样本的估计值为F1(x)...Fk(x),对其作logistic变化之后得到属于每一类的概率是P1(x)...pk(x),则损失函数可以定义为负的log似然:
可以看出对多分类问题,新的一棵树拟合的目标仍是残差向量;
3、训练过程如下:
对第一棵树,可以初始化每个样本在每个分类上的估计值Fk(x)都为0;计算logistic变换pk(x),计算残差向量,作为当前树的回归的目标,回归树的分裂过程仍可采用【左子树样本目标值(残差)和的平方均值+右子树样本目标值(残差)和的平方均值-父结点所有样本目标值(残差)和的平方均值】最大的那个分裂点与分裂特征值等方法;当回归树的叶子节点数目达到要求示,则该树建立完成;对每个叶子节点,利用落到该叶子节点的所有样本的残差向量,计算增益rjkm;更新每一个样本的估计值Fk(x);因此,又可以对估计进行logistic变化,利用样本的目标值计算残差向量,训练第二棵树了;
4、注意样本的估计值Fk(x)是前面所有树的估值之和,因此,计算残差时,用样本的目标值减去Fk(x)就可以得到残差了;
十、GBDT并行化:
1、按行并行化,将样本按行分成N份,分别在N个节点上做计算;
2、并行建立一棵的过程:
1>在0号节点上对特征随机采样,生成建立一棵树需要用到的特征,并分发到N个节点上;
2>在0号结点上维护每一维采样特征所有可能的特征值;
3>将每一维特征的每一个可能的特征值分发到N个节点上;
4>每一个节点并行计算该节点上所有样本与分发得到的特征值的比较结果,分割成左右子树,并计算增益;
5>归并所有节点的增益,在0号结点得到每一个特征在每一个特征值的增益(f,v,incr);
6>在0号结点上找出最大的(f,v,incr),并作为本次的最佳裂点,分发到N个节点上;
7>N个节点将样本分割成左右子树;
8>对左右子树继续上面过程,直到叶子节点数目满足要求;
3、并行建立第二棵树;
因此,GBDT并行化包括了样本并行化与特征分裂点计算的并行化;其中最耗时的仍然是需要遍历特征的所有可能的特征值,并计算增益寻找最优分裂点的过程;可以采用对特征值直方图采样,不用遍历所有特征值来优化。
这里参考了http://www.cnblogs.com/leftnoteasy/archive/2011/03/07/random-forest-and-gbdt.html对分类问题的解释,写得非常好,treelink里面的代码基本就是按照这个流程实现的。
http://www.cnblogs.com/rocketfan/p/4324605.html