Freidman提出了梯度提升算法,该方法是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值
作为回归问题算法中的残差的近似值,拟合一个回归模型。
其算法流程如下:
1.
F0(x)=argminρ∑Ni=1L(yi,ρ)
2. For
m=1
to
M
do:
3.
4.
am=argmina,β∑Ni=1[ỹ i−βh(xi;a)]2
5.
ρm=argminρ∑Ni=1L(yi,Fm−1(xi)+ρh(xi;am))
6.
Fm(x)=Fm−1(x)+ρmh(x;am)
7. endFor
endAlgorighm
其中
h(xi;am)
表示基本分类器(weak learner or base learner),4中
am
表示拟合负梯度能力最好的分类器参数
负梯度只是表示下降的方向,但是下降多少没有确定,5中
ρm
可以认为是下降最快的步长,可以让Loss最小,可以用线性搜索的方式来估计
ρm
的值
回归树
当我们的基本分类器是一个包含J个节点的回归树时,回归树模型可以表示为
其中 {Rj}J1 不相交的区域,它们的集合覆盖了预测值的空间, {bj}J1 是叶子节点的值,可以认为是模型 h 的系数
利用回归树模型,算法流程6中的公式可以被替换为:
其中 {Rjm}J1 是第m次迭代生成的树所产生的区域。第m次迭代的树用来预测流程3中由流程4中平方误差产生的 {ỹ i}Ni
{bjm} 可以被表示为
有了下降的方向,我们还需要最好的步长,缩放因子 ρm 是流程5中线性搜索方式的一种解决方案
从上面可以看出,我们是先求的 bjm ,然后在求解 ρm ,我们能否同时求解呢?
另 γjm=ρmbjm ,公式9可以被表示为:
通过优化如下公式来获取最优的系数 γjm :
由于回归树产生的叶子节点各个区域之间是不相交的,且所有的样本最终都会属于某个叶子节点,所以公式11可以表示为:
给定当前 Fm−1(xi) , γjm 可以作为叶子节点的值,该值可以看做是基于损失函数L的每个叶子节点的最理想的常数更新值,也可以认为 γjm 是即有下降方向又有下降步长的值。
综上,用回归树作为基本分类器的梯度提升算法流程可以如下表示:
1. F0(x)=argminρ∑Ni=1L(yi,ρ)
2. For m=1 to M do:
3.
4. {Rjm}J1=J−terminalnodetree({ỹ i,xi}Ni)
5. γjm=argminγ∑xi∈RjmL(yi,Fm−1(xi)+γ)
6. Fm(x)=Fm−1(x)+∑Jj=1γjmI(x∈Rjm)
7. endFor
endAlgorighm
其中3是计算残差(利用损失函数的负梯度在当前模型的值作为残差的近似值),4是拟合一颗含有J个叶子节点的回归树,5是估计回归树叶子节点的值
下面我们看一下二元分类、多元分类、回归中残差的计算、叶子节点值的估计。
Two-class logistic regression and classification
我们用negative binomial log-likehood作为我们的损失函数:
其中
公式13是logit函数,log odds
如上公式是Freidman的论文中使用的公式,我认为使用在逻辑回归中常见的 L(y,F)=ylogF+(1−y)log(1−F) ,其中 F(z)=11+exp(−z) 也可以
计算残差:
叶子节点值的估计:
可以通过一步Newton-Raphson来近似公式15,估计结果为:
最终得到的 FM(x) 与对数几率 log-odds相关,我们可以用来进行概率估计
有了概率之后,我们接下来就可以利用概率进行分类
Multi-class logistic regression and classification
我们使用multi-class log-loss作为损失函数:
其中使用softmax来计算概率:
从公式17可以得出,对于多分类问题,我们需要为每个类别创建一颗回归树 Fl(x)l=1,2,...,k
计算残差:
叶子节点值的估计:
可以通过一步Newton-Raphson来近似公式19,估计结果为:
Regression
我们使用Least-squares作为损失函数:
计算残差:
叶子节点值的估计:
容易得出以下结果:
回归树的创建
拟合残数是一个回归问题,所以在分割样本时,我们不会采用基尼指数(Gini)、信息增益(IG)等用于分类的标准。
我们可以选用MSE(mean square error impurity criterion)作为分割样本的标准。
也可是采用Friedman在论文中的the least-squares improvement criterion,公式如下:
其中 y¯ly¯r 分别是左右孩子的平均值, wlwr 分别是左右孩子对应的权重和
本文是针对具体的损失函数进行的相关推导,泛化能力差,大家可以参考xgboost作者的这篇 文章,作者进行了更加一般的推导,这一个抽象的形式对于实现机器学习工具也是非常有帮助的。
引用:
Greedy Function Approximation: A Gradient Boosting Machine