GBDT算法可以看成是由K棵树组成的加法模型:

F是所有树组成的函数空间,以回归任务为例,回归树可以看作为一个把特征向量映射为某个score的函数。 模型参数是f {k=1,2,....K}。于一般的机器学习算法不同的是,加法模型不是学习d维空间中的权重,而是直接学习函数(决策树)集合。
目标函数如下:

omega是所有树的复杂度。如何定义树的复杂度呢?比如,可以考虑树的节点数量、树的深度或者叶子节点所对应的分数的L2范数等等。
如何来学习加法模型呢?
解这一优化问题,可以用前向分布算法(forward stagewise algorithm)。因为学习的是加法模型,如果能够从前往后,每一步只学习一个基函数及其系数(结构),逐步逼近优化目标函数,那么就可以简化复杂度。这一学习过程称之为Boosting。具体地,我们从一个常量预测开始,每次学习一个新的函数,过程如下:

那么,在每一步如何决定哪一个函数f被加入呢?指导原则还是最小化目标函数。
在第t步,模型对的预测为:

,其中ft为这一轮我们要学习的函数(决策树)。这个时候目标函数可以写为:

举例说明,假设损失函数为平方损失(square loss),则目标函数为:

使用平方损失函数时,GBDT算法的每一步在生成决策树时只需要拟合前面的模型的残差。
高能预警:
根据泰勒公式把函数f(x + delta_x)在点x处二阶展开,可得到如下等式:

根据formula - 1,目标函数是关于变量

的函数,这里把yi(t-1)作为x, ft(xi)为delta_x,那么formula-1变成这样:

这里面的第一项L,就是f(x);
那么gi就是损失函数的一阶导数,

hi为损失函数的二阶导数,

由于函数中的常量在函数最小化的过程中不起作用,因此我们可以从formula-4中移除掉常量项,得:

由于要学习的函数仅仅依赖于目标函数,从formula-5可以看出只需为学习任务定义好损失函数,并为每个训练样本计算出损失函数的一阶导数和二阶导数。所以,第t次的迭代目标就是这个,本身ft就不是一个解析式,而是一棵树,这棵树事先规定好深度,然后建立数的过程,就是使当前Obj最小,朝着这目标建树。强调一下,i从1到n意思是本次迭代在整个训练集上进行,优化得到的Obj是整体的损失函数。
这里的g 和h,都和ft无关,只和当前y和之前计算得到的输出值有关。损失函数需要事先定义,回归的话是RMSE,分类的话是logloss。可导。所以,这就是为什么xgboost可以自定义损失函数。
只要函数可一阶和二阶求导。
网友评论