GBDT算法推导过程
m次迭代,n个类别,那么就意味着学习了m*n棵回归树
train过程:假设有8个训练样本,3个类别
步骤一、假设所有样本的F矩阵,F矩阵是8*3的,F矩阵刚开始全为0,而实际每个样本都有一个属于的类别y,y能组成一个实际的矩阵也是8*3的
步骤二、决策树是不断学习残差的过程,这里的残差经过计算是y-p,其中p是由F矩阵求出来的,即
这里要知道决策树的分裂依据:遍历所有的特征纬度,这里是3个特征,对于每一个特征,选择一个合适的分裂点,
如果属性是数字
也就是遍历所有那个属性的值,eg[10,20,30,40,50,60,70]然后分类节点假设是3个的话就需要从中随机采样3个数据作为属性,eg[20,40,60],那么在这个属性进行遍历的时候就可以以该点的值作为分界限,分割左右子树
如果属性是标量
就直接按照节点属性是否等于标量为分界线,分隔左右子树
如何选择最佳属性和最佳分隔点:
我们已经将树分隔成了左右子树了,那么怎么从那么多的分隔中选择最佳的分隔点呢
这里,leftTargets,rightTargets都是左右子树样本点的残差,也就是前面的y-p的值,所以这里分隔的依据是:选择左右子树残差的均方差和最小
这样一直分割下去,只要不超过最大深度,一直到达叶子节点
叶子节点的值:
其中:
建立好一棵树后,需要更新F矩阵,
接着再更加F矩阵和y矩阵重新计算残差,重新生成新的树,这样迭代M次,F矩阵是在不断地逼近y矩阵的(注意,这里的3个类的决策树是同时进行的,也就是一次迭代,生成的是3棵树,如下代码所示:
测试
将测试样本输入到m*n棵树中,每个类别是m棵树,不断累加这m棵树的的结果就是最终的f[instance_id]的值,然后选择值最大的f作为最终的label
公式推导部分:
简言之:最小化目标函数,泰勒展开,f’(x)=0求得叶子节点的值
论文名字:
Greedy function approximation : A Gradient Boosting Machine