最新分享,第一时间送达!
本文是《机器学习宝典》第 19 篇,读完本文你能够掌握集成学习中的 GBDT。
前一篇介绍了 Boosting 中经典的一个算法:AdaBoost,这篇介绍 Boosting 中另一个经典的算法:GBDT(gradient boosting descision tree),也称为 GBM (gradient boosting machine) 或 MART (multiple additive regression tree),GBDT 虽然也是属于 Boosting 算法,但是和 AdaBoost 算法差别较大,AdaBoost 是通过前一轮基模型的误差率来更新训练样本权重,这样不断重视那些分错的样本来不断迭代,GBDT 首先限定基模型只能是 CART 回归树(不是分类树),其次是采用的是梯度提升的思想来不断迭代,梯度提升我们稍后会介绍。
GBDT 简介
在正式介绍 GBDT 之前,我们先来举一个简单的例子。假设一个人的年龄为30岁,我们要使用模型来预测。第一次我们的拟合目标为 30,假设预测值为 20,两者相差了 10;第二次我们的拟合目标不再是30,而是对应的残差 10,假设这次预测值为 8,这次残差为 2;如果继续预测,那下一次的拟合目标就是 2 了,这样,每次拟合目标都是上一次的残差。
GBDT 其实就是参考前面的思想,我们假设前一轮迭代得到的集成模型为 ,损失函数是 ,我们本轮迭代要做的就是找到一个拟合目标,训练一个基模型 ,得到本轮的集成模型 , 使得本轮的损失函数 最小。
可以看到,只要在每一轮找到一个能够让本轮损失函数最小的拟合的目标,问题是什么样的拟合目标才能够使得损失函数降低呢?前面的示例我们每轮的拟合目标是真实值与前一轮集成模型的残差,实际上,如果拟合目标是残差的话,是有局限性的,为什么这么说呢?因为如果损失函数为平方损失函数时,拟合目标为残差确实能够降低损失函数,但是如果损失函数为其他时,拟合目标为残差就不合适了。
为了可以扩展到更复杂的损失函数,所以提出了使用上一轮的损失函数的负梯度来作为当前轮的拟合目标。
为什么可以使用负梯度
前面说了,如果将每一轮的拟合目标设为损失函数的负梯度就能够使得损失函数降低,但是并没有说明原因,这里来给出一个证明。由于证明过程中需要涉及到泰勒公式,所以先简单介绍下泰勒公式。
泰勒公式是一个用函数在某点的信息描述其附近取值的公式,它的基本形式如下:
经常要用到一阶泰勒展开式如下:
考虑到在GBDT中第 t 轮的集成模型 可以表示为:
将第 t 轮的损失函数 在 处进行一阶泰勒展开:
想要使得 ,可以使得:
这时:
由于 ,所以可以使得 。
在上面的过程中,我们假设 ,也就是说,如果第 t 轮的基模型 的拟合目标是第 t-1 轮损失函数的负梯度的话,就能够使得第 t 轮的损失函数最小。当损失函数为平方损失函数是,负梯度也就变为了残差。
另外补充一点,不知道你发现没有,在通过优化目标函数求解GBDT的过程是不是和梯度下降这个优化算法很是相像,实际上可以认为GBDT的求解过程可以认为是在函数空间的梯度下降,也就是将带求解的模型函数作为梯度下降中要求解的参数。
GBDT 算法流程
假设我们的训练集为 ,总共迭代次数为T次(基模型的个数为 T),那么整个算法的流程可以表示如下:
1.初始化模型
2.令t = 1,2,…T,循环:
a. 对于每个样本 ,计算 t-1 轮的损失函数的负梯度:,并将其作为第 t 轮中样本的标签
b. 根据更新后的 训练出第 t 轮的基模型(CART回归树)。
c. 生成第 t 轮的集成模型
GBDT 正则化
GBDT正则化常见的有三种方式,第一种正则化方式类似于 AdaBoost 中的学习率,我们可以定义为 ,加上了学习率之后,则
的取值范围为 。对于同样的训练集学习效果,较小的 意味着我们需要更多的迭代次数。通常我们用学习率和迭代最大次数一起来决定算法的拟合效果。
第二种正则化的方式是控制子采样(subsample)的比例,也就是说只是用一部分样本训练,但是如果采样比例过小的话,在降低方差的同时也会提高偏差,因此不能过低。
第三种正则化的方式就是控制每个决策树(基模型)的复杂度,也就是对决策树进行一些剪枝操作。
参考:
GBDT&XGBOOST(一)
(http://frankblog.site/2018/06/12/GBDT&XGBOOST%EF%BC%88%E4%B8%80%EF%BC%89/)
GBM Paper Reading
(http://xtf615.com/paper/GBM.html)
GBDT理论知识总结
(https://www.cnblogs.com/bentuwuying/p/6667267.html)
梯度提升树(GBDT)原理小
(https://www.cnblogs.com/pinard/p/6140514.html)
5. gbdt的残差为什么用负梯度代替
(https://www.zhihu.com/question/63560633)
??扫码查看《机器学习宝典》历史内容