说明:本篇文章是参看文章结尾相关博客写的读书笔记。
GBDT算法步骤:
k:表示待分类的类别,一共有K个类别。
m:表示迭代次数,一共迭代M次。
i:表示样本编号,一共有N个样本。
Fk0(x):表示样本x在第k个分类下的估值,是一个k维的向量。下表0表示第0次迭代。例如:假设输入数据x可能属于5个分类(分别为1,2,3,4,5),训练数据中,x属于类别3,则y = (0, 0, 1, 0, 0),假设模型估计得到的F(x) = (0, 0.3, 0.6, 0, 0)。也可以理解为F1(x) =0, F2(x) =0.3, F3(x)=0.6, F4(x) =0, F5(x) =0。
(1)初始化所有样本在K个类别上的估计值
说明:Fk0(x) = 0, k=1,2,…K。 这其实是对样本x,在所有类别上的分别给出的估计,其实是一个for循环操作,这样写为了看起来简洁。如上所示,就是一个向量。
循环下面的学习更新过程M次;
(2)对每个样本的函数估计值做logistic变换
pk(x):经过Logistic变换后的数据,将F(x)转换成0~1之间的概率值。第4行后面的k= 1, …K 表示计算for循环,分别计算p1(x),p2(x),p3(x),p4(x),p5(x)
Logistic变换后的数据p(x) = (0.16,0.21,0.29,0.16,0.16)
(3)遍历所有样本的每个类别的概率,求每个样本在第k类上概率梯度(详细推导过程如下:)
我们通过常见的建立代价函数。代价函数是对数似然函数的形式为(算法步骤中省略了此部分):
通过求导的梯度下降法来学习:
这个其实就是对应算法步骤中的第6行是如何来的,算法步骤中直接给出了结论。有没有发现这里的求导得到的梯度形式居然是残差的形式:第i个样本属于第k个类别的残差 = 真实的概率 -估计的概率。
yik为输入的样本数据的实际类别,当一个样本x属于类别k时,yik = 1,否则yik = 0。 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的意思类似。
这一步也是残差版本和梯度版本的联系。 这些的梯度也是下面我们构建回归树的学习方向。
(5)沿着梯度方法学习到J个叶子结点的回归树
学习的伪代码:
上式是用N个样本来建立回归树。
我们输入所有样本xi,i = 1~N,以及每个样本在第k个类别上概率的残差作为更新方向,我们学习到有J个叶子的回归树。学习的基本过程和回归树类似:遍历样本的特征维数,选择一个特征作为分割点,需要满足最小均方差的原则,或者满足【左子树样本目标值(残差)和的平方均值+右子树样本目标值(残差)和的平方均值-父结点所有样本目标值(残差)和的平方均值】最大的准则,一旦学习到J个叶子结点,我们就停止学习。结果是该回归树中每个叶子上都会有许多个样本分布在上面。 记住:每个叶子上的样本,既有自己属于类别k的估计概率,也有真实概率,因为后面求增益需要用到它们。
(6)求每个叶子结点的增益 每个结点的增益计算公式为: 注意后标,每个叶子结点j都有一个增益值(不是向量,是值)。计算的时候需要用到该叶子结点上的所有样本的梯度。 换句话说,每个叶子结点都可以计算出一个增益值,记住是值啊!
(7)更新所有样本在第k类下的估计值
上一步中求得的增益是基于梯度计算得到的,而且前面说到的梯度和残差有
一定的关联,我们可以利用这个增益更新样本的估计值。
第m次迭代中的第k类下,所有样本的估计值F可以通过上次迭代m-1中,这些样本的估计值+增益向量求得。注意,这个增益向量需要把所有的J个叶子结点的增益值求和,然后和向量1相乘,而得。
也就是我们上面讲的,第k类的所有样本的估计值是一列: 也就是按列更新,前面有对类别数k的循环,所以每一类(每一列)的估计值都可以更新。一定记住是按列更新,每一类(每一列)都建立一个回归树来更新下去,最后原始的K类的N个样本的估计值矩阵都更新了一遍,带着这个新的估计值矩阵,我们进入下次m+1次的迭代学习。
如此,迭代学习M次之后,我们可以得到最终的所有样本在所有类别下的估计值矩阵,基于这个估计值矩阵,我们可以实现多类分类。
这样,基于梯度版本的GBDT算法的所有详细步骤我们都说完了。
参考资料:
http://blog.csdn.net/xiaokang06/article/details/76687517
http://blog.csdn.net/xiaokang06/article/details/76691444
http://blog.csdn.net/xiaokang06/article/details/76687564
https://cethik.vip/2016/09/21/machineCAST/