定义
GBDT(Gradient Boosting Decision Tree)梯度提升树 是boosting系列算法中的一种迭代的决策树算法,该算法由多棵决策树组成,其中每一棵回归树学习的是之前所有树的结论和残差,拟合得到一个当前的残差回归树。其中残差=真实值-预测值,整个迭代过程生成的回归树的累加起来做最终结果。
GBDT无论用于分类还是回归,使用的都是CART回归树。GBDT不会因为我们所选择的任务是分类任务就选用分类树,这里的核心原因是GBDT每轮的训练是在上一轮训练模型的负梯度值基础之上训练的。这就要求每轮迭代的时候,真实标签减去弱分类器的输出结果是有意义的,即残差是有意义的。如果选用的弱分类器是分类树,类别相减是没有意义的。对于这样的问题,可以采用两种方法来解决:
- 一是采用指数损失函数,这样GBDT就退化成了Adaboost,能够解决分类的问题;
- 二是使用类似于逻辑回归的对数似然损失函数,如此可以通过结果的概率值与真实概率值的差距当做残差来拟合
示例
下面我们举个例子帮助理解GBDT思路
训练数据:
| 购物金额 | 经常去百度提问还是回答 | label(年龄) | |
|---|---|---|---|
| 小明 | 0.2k | 提问 | 14 |
| 小李 | 0.5k | 回答 | 16 |
| 小丽 | 2k | 提问 | 24 |
| 小光 | 3k | 回答 | 26 |
特征:购物金额,经常去百度提问还是回答
训练数据的均值:20岁(这个很重要,因为GBDT每轮都需要预测的均值,这样后面才会有残差!)
决策树的个数:2棵(step1、step2)
step1、首先根据特征的最大收益确定划分特征为购物金额是否小于1k,,划分后得到两类分别是15岁和25岁。
对应的残差分别是(-1, 1)和(-1,1),残差将作为下棵树的样本。
step2、然后学习第二棵决策树,我们把第一棵的残差样本(小明, -1岁)、(小李,1岁)、(小丽, -1岁)、(小光, 1岁)输入。此时我们根据特征的信息增益,选择的特征是经常去百度提问还是回答。
通过计算可以看到最后左叶子和右叶子的残差都是0。我们学习结束~
下面拿一个测试样本来测试一下效果
测试数据:
| 购物金额 | 经常去百度提问还是回答 | label(年龄) | |
|---|---|---|---|
| 小王 | 3k | 提问 | 26 |
测试流程:
可以得到最后测试数据的预测结果为24岁,真实的年龄为26岁。
我们能够直观的看到,预测值等于所有树值的累加,如小王的预测值=树1右节点(25)+树2左节点(-1)=24岁。因此给定当前决策树模型,只需拟合决策树的残差,便可迭代得到提升树,算法过程如下
我们介绍了Boosting Decision Tree的基本思路,但是没有解决损失函数拟合方法的问题。当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不那么容易,针对这一问题,Freidman提出了梯度提升算法,利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树。了解Boosting Decision Tree方法后,我们便可将Gradient与Boosting Decision Tree相结合得到Gradient Boosting Decision Tree的负梯度拟合。
GBDT-为什么拟合负梯度
我们可以把学习器看做一个参数,损失函数为, 在优化的过程中,为使L的损失最小,采用梯度下降法:
GBDT采用加法模型与前向分步算法:
T为训练的新树,所以可推:
因此每次需要拟合的是损失函数的负梯度
为什么当损失函数为平方损失函数时,负梯度值就是残差值
推导过程如下
- 第t轮损失函数的负梯度为
- 平方损失函数为
- 负梯度为
所以当损失函数为平方损失时,负梯度值等于残差值。
GBDT-正则化
GBDT正则化主要有三种方式:
1、learning_rate(学习率)
2、subsample(下采样比例)
- 每一轮迭代中,新的决策树拟合的是原始训练集的一个子集(而并不是原始训练集)的残差。这个子集是通过对原始训练集的无放回随机采样而来。
- 无放回抽样的子采样比例(subsample),取值为(0,1]。
- 如果取值为1,则与原始的梯度提升树算法相同,即使用全部样本。如果取值小于1,则使用部分样本去做决策树拟合。
- 较小的取值会引入随机性,有助于改善过拟合,因此可以视作一定程度上的正则化;但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
- 这种方法除了改善过拟合之外,另一个好处是:未被采样的另一部分子集可以用来计算包外估计误差。因此可以避免额外给出一个独立的验证集。
3、min_samples_split(叶子节点包含的最小样本数)
- 叶子结点包含的最小样本数。梯度提升树会限制每棵树的叶子结点包含的样本数量至少包含m个样本,其中m为超参数。在训练过程中,一旦划分结点会导致子结点的样本数少于m,则终止划分
GBDT-为什么需要归一化
概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、rf。而像adaboost、svm、lr、KNN、KMeans之类的最优化问题就需要归一化
GBDT的树是在上一颗树的基础上通过梯度下降求解最优解,归一化能收敛的更快,GBDT通过减少偏差来提高性能,而随机森林本来就是通过减少方差提高性能的,树之间建立关系是独立的,不需要归一化
树模型为什么不需要归一化
因为数值缩放不影响分裂点位置,对树模型的结构不造成影响,而且是不能进行梯度下降的,因为构建树模型(回归树)寻找最优点时是通过寻找最优分裂点完成的,因此树模型是阶跃的,阶跃点是不可导的,并且求导没意义,也就不需要归一化
补充
| 树 | 并行 | 异常值 | 方差、偏差 | 归一化 | 场景 | |
|---|---|---|---|---|---|---|
| 随机森林RF | 分类树或者回归树 | 可以 | 不敏感 | 减小方差 | 不需要 | 回归、分类 |
| 梯度提升树GBDT | 回归树 | 不可以 | 敏感 | 减小方差 | 需要 | 回归、分类 |
[
