机器学习教程 之 梯度提升方法:GBDT处理分类问题

Gradient boosting是一种广泛被用于回归、分类和排序任务的集成方法,于2001年被Friedman提出
该类算法通过以***上一轮基学习器的误差的负梯度***为训练目标训练本轮的基学习器,不断降低集成模型在训练集上的偏差实现高精度的集成
基于Gradient Boosting算法的学习器被称为Gradient Boosting Machine(GBM),如果说AdaBoost是boosting方法的开山之作,那么GBM就是boosting方法的集大成者。GBM几乎刷新了各个领域众多数据集的精度记录,有人认为GBM是性能最好的机器学习方法,这种说法有点激进,但通常各类数据竞赛赢家的策略里也确实都会有这类算法的方法或者思想

由于集成学习方法在实际应用中出色的性能,我曾经写过几篇这方面的博文,关于集成学习及其boosting方法的

机器学习教程 之 Boosting 与 bagging:集成学习框架
人工智能里的数学修炼 | AdaBoost的数学原理: 分布更新推导
机器学习教程 之 集成学习算法: 深入刨析AdaBoost

还有一片关于 bagging 类随机森林的
机器学习教程 之 随机森林: 算法及其特征选择原理

感兴趣的朋友可以了解一下,可以帮助你们更好的了解集成学习的整体情况
我之前写过一篇博客 机器学习教程 之 梯度提升方法:GBDT及其扩展模型XGBoost 借助回归问题基本上已经完整的讲述了GBDT的原理,包括:

1. GBDT的基分类器为CART树(分类回归树)
2. 一种boosting方法:Boosting Tree 提升树
3. 加性模型与前向分布算法
4. Gradient Boosting 梯度提升
5. GBDT采用的一些小技巧

GBDT处理分类问题时,除了将损失函数替换了之外还有一些稍显复杂的操作,我会在这篇博客里详细的讲述GBDT处理分类问题时应该注意的细节,之前博客里已经提到的内容,除了必要的回顾,其余的在这里我会尽量避免重复提及,有什么疑问可以去上一篇博客了解。

这篇博客主要有三块内容:

1. 简单回顾GBDT的算法流程
2. GBDT处理二分类问题
3. GBDT处理多分类问题

一、简单回顾GBDT的算法流程

Friedman在2000年提出了梯度提升算法,该方法是利用最速下降的近似方法,其关键是利用当前模型的损失函数负梯度的值
这里写图片描述
作为回归问题算法中的残差的近似值,拟合一个回归模型
GBDT基本的算法流程如下
这里写图片描述
其中, h ( x i , a m ) h(x_{i},a_{m}) h(xi,am) 表示基学习器步骤4中的 a m a_{m} am 表示在Cart树中拟合负梯度能力最好的学习器参数
负梯度表示的只是下降的方向,但是下降多少没有确定,步骤5中的 ρ m \rho_{m} ρm 可以认为是最优的步长,一般用线性搜索的方式来估计 ρ m \rho_{m} ρm 的值

再来回顾一下当基分类器为回归树时的GBDT表示形式
当我们的基分类器是一个包含 J J J 个节点的回归树时,回归树模型可以表示为

h ( x ; ( b j , R j ) 1 J ) = ∑ b = j J b j I h(x;(b_{j},R_{j})^{J}_{1})=\sum_{b=j}^{J}b_{j}I h(x;(bj,Rj)1J)=b=jJbjI

其中 ( R j ) 1 J R_{j})^{J}_{1} Rj)1J 表示不相交的区域,它们的集合覆盖了预测的空间, ( b j ) 1 J (b_{j})^{J}_{1} (bj)1J 是叶子节点的值,可以认为是模型 h h h 的系数,利用回归树模型,之前GBDT的算法流程可以被替换为
F m ( x ) = F m − 1 ( x ) + ρ m ∑ j = 1 J b j m I ( x ϵ R j m ) F_{m}(x) = F_{m-1}(x)+\rho_{m}\sum_{j=1}^{J}b_{jm}I(x \epsilon R_{jm}) Fm(x)=Fm1(x)+ρmj=1JbjmI(xϵRjm)

其中 ( R j m ) 1 J (R_{jm})^{J}_{1} (Rjm)1J 是第 m m m 次迭代生成的树所产生的区域。第 m m m 次迭代的树用来预测流程3中由流程4中平方误差产生的 ( y ˉ i ) i N ( b j m ) (\bar y_{i})^{N}_{i} (b_{jm}) (yˉi)iN(bjm) 可以被表示为
b j m = a v e x i ϵ R j m y ˉ i b_{jm} = ave_{x_{i} \epsilon R_{jm}}\bar y_{i} bjm=avexiϵRjmyˉi

即用标签的平均值表示该叶子节点拟合的值,现在我们已经有了下降的方向 b b b ,那么下降的步长 ρ m \rho_{m} ρm 呢?之前提到的线性搜索是一种方案。我们现在尝试将 b m j 和 ρ m b_{mj} 和 \rho_{m} bmjρm 同时求解,令 γ j m = ρ m b j m \gamma_{jm}=\rho_{m}b_{jm} γjm=ρmbjm ,加性模型可以被表示为
F m ( x ) = F m − 1 ( x ) + ∑ j = 1 J γ j m I ( x ϵ R j m ) F_{m}(x) = F_{m-1}(x)+\sum^{J}_{j=1}\gamma_{jm}I(x\epsilon R_{jm}) Fm(x)=Fm1(x)+j=1JγjmI(xϵRjm)

可以通过如下公式来获取最优的系数 γ j m \gamma_{jm} γjm
γ j m = a r g m i n r ∑ x i ϵ R j m L ( y i , F m − 1 ( x i + γ ) ) \gamma_{jm} = argmin_{r}\sum_{x_{i}\epsilon R_{jm}}L(y_{i},F_{m-1}(x_{i}+\gamma)) γjm=argminrxiϵRjmL(yi,Fm1(xi+γ))

γ j m \gamma_{jm} γjm 可以作为叶子节点的值,该值可以看作是基于损失函数 L L L 的每个叶子节点的最理想的常数更新值,也可以认为 γ j m \gamma_{jm} γjm是既有下降方向,又有下降步长的值。当然,上面的式子只是给出了求解该值的目标函数,只有在给出具体的 损失函数以后,才可以根据具体情况进行求解,这也是我们下面两个章节要说明的问题。

GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接去拟合类别输出的误差,为了解决这个问题,主要有两个方法:
第一种方法是用指数损失函数,此时的GBDT会退化为AdaBoost算法, 关于GBDT退化为AdaBoost我会在另一篇博客中进行讨论
第二种方法使用类似于逻辑回归的对数似然损失函数的方法,也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失,本文讨论为也正是这种方法。由于对数似然损失函数有二分类和多分类的区别,GBDT处理分类问题也会分为二分类和多分类两种不同的形式,接下来我们会分别讨论这两个形式

二、GBDT处理二分类问题

Friedman采用负二项对数似然损失函数(negative binomial log-likelihood)作为学习器的损失函数:

L ( y , F ) = l o g ( 1 + e x p ( − 2 y F ) ) , y ϵ − 1 , 1 L(y,F)=log(1+exp(-2yF)),y \epsilon -1,1 L(y,F)=log(1+exp(2yF)),yϵ1,1

其中
F ( x ) = 1 2 l o g [ P r ( y = 1 ∣ x ) P r ( y = − 1 ∣ x ) ] F(x)=\frac{1}{2} log[\frac{Pr(y=1|x)}{Pr(y=-1|x)}] F(x)=21log[Pr(y=1x)Pr(y=1x)]

这里的 P r ( y = 1 ∣ x ) Pr(y=1|x) Pr(y=1x) 我理解为分类器预测样本 x x x 为 1 的概率, P r ( y = − 1 ∣ x ) Pr(y=-1|x) Pr(y=1x)为分类器预测样本 x x x 为 -1 的概率

计算损失函数的负梯度有

y i ˉ = − [ ∂ L ( y , F ( x i ) ) ∂ F ( x i ) ] F ( x ) = F m − 1 ( x ) = 2 y i 1 + e x p ( 2 y i F m − 1 ( x i ) ) \bar{y_{i}}=-[\frac{\partial L(y,F(x_{i}))}{\partial F(x_{i})}]_{F(x)=F_{m-1}(x)}=\frac{2y_{i}}{1+exp(2y_{i}F_{m-1}(x_{i}))} yiˉ=[F(xi)L(y,F(xi))]F(x)=Fm1(x)=1+exp(2yiFm1(xi))2yi

叶子节点估计值在该损失函数下的计算公式为

γ j m = a r g m i n r ∑ x i ϵ R j m l o g ( 1 + e x p ( − 2 y i ( F m − 1 ( x i ) + γ ) ) ) \gamma_{jm} = argmin_{r}\sum_{x_{i}\epsilon R_{jm}} log(1+exp(-2y_{i}(F_{m-1}(x_{i})+\gamma))) γjm=argminrxiϵRjmlog(1+exp(2yi(Fm1(xi)+γ)))

该式在论文中通过Newton-Raphson公式来近似求解,估计结果为
γ j m = ∑ x i ϵ R j m y ˉ i ∑ x i ϵ R j m ∣ y ˉ i ∣ ( 2 − ∣ y ˉ i ∣ ) \gamma_{jm}=\frac{\sum_{x_{i} \epsilon R_{jm}} \bar y_{i}}{\sum_{x_{i} \epsilon R_{jm}} |\bar y_{i}|(2-|\bar y_{i}|) } γjm=xiϵRjmyˉi(2yˉi)xiϵRjmyˉi

根据分类器的最终输出 F ( x ) F(x) F(x), 我们可以进行概率估计
p + ( x ) = p = 1 1 + e − 2 F ( x ) p_{+}(x)=p= \frac{1}{1+e^{-2F(x)}} p+(x)=p=1+e2F(x)1
p − ( x ) = 1 − p = 1 1 + e 2 F ( x ) p_{-}(x)=1-p= \frac{1}{1+e^{2F(x)}} p(x)=1p=1+e2F(x)1

有了概率以后我们就可以利用概率进行分类

三、GBDT处理多分类问题

GBDT采用多类逻辑损失函数(muti-class log-loss)作为损失函数:
这里写图片描述
这里的 y k ϵ 0 , 1 y_{k} \epsilon 0,1 ykϵ0,1 使用softmax来计算最后的类别概率:
这里写图片描述
从上式中我们可以得出,对于多分类问题,我们需要为每个类别创建一棵回归树 F l ( x ) = 1 , 2 , . . . , k F_{l}(x) = 1,2,...,k Fl(x)=1,2,...,k , 每一棵树用来预测一类的概率
根据损失函数计算负梯度为
这里写图片描述
叶子节点的估计公式为
这里写图片描述
同样的通过Newton-Raphson公式来近似求解,估计结果为
这里写图片描述
得到分类器的输出结果以后即可通过softmax计算得到最后的类别概率

四、参考文献

[1] Jerome H. Friedman. Greedy Function Approximation: A Gradient Boosting Machine[J]. The Annals of Statistics, 2001, 29(5):1189-1232.
[2] http://nbviewer.jupyter.org/github/liudragonfly/GBDT/blob/master/GBDT.ipynb

五、更多资源下载

微信搜索“老和山算法指南”获取更多下载链接与技术交流群
在这里插入图片描述
有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liangjun_Feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值