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 个节点的回归树时,回归树模型可以表示为
其中 ( R j ) 1 J R_{j})^{J}_{1} Rj)1J 表示不相交的区域,它们的集合覆盖了预测的空间, ( b j ) 1 J (b_{j})^{J}_{1} (bj)1J 是叶子节点的值,可以认为是模型 h h h 的系数,利用回归树模型,之前GBDT的算法流程可以被替换为
其中 ( 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 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 ,加性模型可以被表示为
可以通过如下公式来获取最优的系数 γ j m \gamma_{jm} γjm
γ 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)作为学习器的损失函数:
其中
这里的 P r ( y = 1 ∣ x ) Pr(y=1|x) Pr(y=1∣x) 我理解为分类器预测样本 x x x 为 1 的概率, P r ( y = − 1 ∣ x ) Pr(y=-1|x) Pr(y=−1∣x)为分类器预测样本 x x x 为 -1 的概率
计算损失函数的负梯度有
叶子节点估计值在该损失函数下的计算公式为
该式在论文中通过Newton-Raphson公式来近似求解,估计结果为
根据分类器的最终输出 F ( x ) F(x) F(x), 我们可以进行概率估计
有了概率以后我们就可以利用概率进行分类
三、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
五、更多资源下载
微信搜索“老和山算法指南”获取更多下载链接与技术交流群
有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。