GBDT 的全称是 Gradient Boosting Decision Tree,梯度提升树,是GB(梯度提升)+DT(决策树),在传统机器学习算法中,GBDT算的上TOP3的算法。想要理解GBDT的真正意义,那就必须理解GBDT中的Gradient Boosting 和Decision Tree分别是什么?
目录
1. Decision Tree:CART回归树
2. Gradient Boosting: 拟合负梯度
3.GBDT(Gradient Boosting Decision Tree)思想
Boosting :
Gradient boosting
1.GBDT
2.负梯度拟合
3.损失函数
4.正则化
4.优缺点
5.GBDT和XGBoost区别
首先,GBDT使用的决策树是CART回归树,无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树通通都是都是CART回归树。为什么不用CART分类树呢?因为GBDT每次迭代要拟合的是梯度值,是连续值所以要用回归树。
对于回归树算法来说最重要的是寻找最佳的划分点,那么回归树中的可划分点包含了所有特征的所有可取的值。在分类树中最佳划分点的判别标准是熵或者基尼系数,都是用纯度来衡量的,但是在回归树中的样本标签是连续数值,所以再使用熵之类的指标不再合适,取而代之的是平方误差,它能很好的评判拟合程度。
回归树生成算法:
输入:训练数据集D:
输出:回归树f(x).
在训练数据集所在的输入空间中,递归的将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
(1)选择最优切分变量j与切分点s,求解
遍历变量j,对固定的切分变量j扫描切分点s,选择使得上式达到最小值的对(j,s).
(2)用选定的对(j,s)划分区域并决定相应的输出值:
(3)继续对两个子区域调用步骤(1)和(2),直至满足停止条件。
(4)将输入空间划分为M个区域 R1,R2,...RM,生成决策树:
梯度提升树(Grandient Boosting)是提升树(Boosting Tree)的一种改进算法,所以在讲梯度提升树之前先来说一下提升树。
先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。最后将每次拟合的岁数加起来便是模型输出的结果。
提升树算法:
(1)初始化f0(x)=0
(2)对m=1,2,...,M
(a) 计算残差
(b) 拟合残差学习一个回归树,得到
上面伪代码中的残差是什么?
在提升树算法中,假设我们前一轮迭代得到的强学习器是
损失函数是
我们本轮迭代的目标是找到一个弱学习器
最小化让本轮的损失
当采用平方损失函数时
这里,
是当前模型拟合数据的残差(residual)所以,对于提升树来说只需要简单地拟合当前模型的残差。
回到我们上面讲的那个通俗易懂的例子中,第一次迭代的残差是10岁,第二 次残差4岁……
当损失函数是平方损失和指数损失函数时,梯度提升树每一步优化是很简单的,但是对于一般损失函数而言,往往每一步优化起来不那么容易,针对这一问题,Friedman提出了梯度提升树算法,这是利用最速下降的近似方法,其关键是利用损失函数的负梯度作为提升树算法中的残差的近似值。
那么负梯度长什么样呢?
第t轮的第i个样本的损失函数的负梯度为:
此时不同的损失函数将会得到不同的负梯度,如果选择平方损失
负梯度为
此时我们发现GBDT的负梯度就是残差,所以说对于回归问题,我们要拟合的就是残差。
那么对于分类问题呢?二分类和多分类的损失函数都是loglosslog losslogloss,本文以回归问题为例进行讲解。
给定初始训练数据,由此训练出第一个基学习器; 根据基学习器的表现对样本进行调整,在之前学习器做错的样本上投入更多关注; 用调整后的样本,训练下一个基学习器; 重复上述过程 T 次,将 T 个学习器加权结合。
Gradient boosting是 boosting 的其中一种方法,它主要的思想是,每一次建立单个学习器时,是在之前建立的模型的损失函数的梯度下降方向。
我们知道损失函数(loss function)越大,说明模型越容易出错,如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。
GBDT是 GB 和 DT(Decision Tree) 的结合,就是当 GB 中的单个学习器为决策树时的情况.决策树分为两大类,回归树和分类树。前者用于预测实数值,如明天的温度、用户的年龄、网页的相关程度;后者用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是否是垃圾页面。这里要强调的是,前者的结果加减是有意义的,如10岁+5岁-3岁=12岁,后者则无意义,如男+男+女=到底是男是女?GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;
如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。
而分类树的结果显然是没办法累加的,所以GBDT中的树都是回归树,这点对理解GBDT相当重要
我们通过一张图片,来说明gbdt的训练过程:
gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度,(此处是可以证明的)。
弱分类器一般会选择为CART TREE(也就是分类回归树)。由于上述高偏差和简单的要求 每个分类回归树的深度不会很深。最终的总分类器 是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。
模型最终可以描述为:
我们希望找到一个 使得 最小,那么 就得沿着使损失函数L减小的方向变化,即:
同时,最新的学习器是由当前学习器 与本次要产生的回归树 相加得到的:
因此,为了让损失函数减小,需要令:
即用损失函数对f(x)的负梯度来拟合回归树。
这里我们再对常用的GBDT损失函数做一个总结。
对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种:
a) 如果是指数损失函数,则损失函数表达式为
b) 如果是对数损失函数,分为二元分类和多元分类两种,参见4节和5节。
对于回归算法,常用损失函数有如下3种:
a)均方差,这个是最常见的回归损失函数了
b)绝对损失,这个损失函数也很常见
对应负梯度误差为:
我们需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有三种方式。
1) 第一种是步长(learning rate)。定义为,对于前面的弱学习器的迭代
如果我们加上了正则化项,则有
的取值范围为。
对于同样的训练集学习效果,较小的意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
2)第二种是对于弱学习器即CART回归树进行正则化剪枝。
3) 第三种正则化的方式是通过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
GBDT主要的优点有:
1) 可以灵活处理各种类型的数据,包括连续值和离散值。
2) 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
GBDT的主要缺点有:
1)由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
上面两节分别将Decision Tree和Gradient Boosting介绍完了,下面将这两部分组合在一起就是我们的GBDT了。