GBDT

简介

GBDT也是集成学习Boosting家族的成员,由梯度提升方法与回归树结合而成。
分类|损失函数
回归|$(y-\hat y)^2$
分类|$p_K log_2 \; p_K$

回归树

回归树生成算法

提升树

提升树可以表示为以下形式:这里我们约定 $T(x;Θ_m)$ 表示第 $m$ 棵决策树;$Θ_m$表示决策树的参数;$M$ 为树的个数。强分类器 $f_M(x)$ 可以由多个弱分类器 $T(x;Θ_m)$ 线性相加而成

提升树的前向分步算法。第$m$步的模型可以写成

然后得到损失函数

迭代的目的是构建 $T(x;Θ_m)$,使得本轮损失 $L(f_m(x),y)$ 最小。思想其实并不复杂,但是问题也很明显,对于不同的任务会有不同的损失函数,当损失函数是平方损失和指数损失函数时,每一步的优化还是简单的。但是对于一般损失函数而言,每一步的优化并不容易

提升树算法

梯度提升树

采用泰勒展开式将上式中的残差展开,

泰勒公式

一元函数在点$x_k$处的泰勒展开式为:

拟合残差的近似

梯度提升思想正是为了解决上面的问题。它的主要思想是先求$h_m$,再求$β_m$。观察式子

我们要最小化的式子由N部分相加而成,如果能够最小化每一部分,自然也就最小化了整个式子。考察其中任一部分,并将其进行泰勒一阶展开

由于需要

由于$β$是大于0的,则
这说明,我们已经成功地降低了在第$i$个样本点上的预测损失。同理,我们可以降低在每一个样本点上的预测损失。条件就是

这个条件其实告诉了我们如何去寻找基学习器$h_m$,用回归树拟合$h_m(x_i)$。我们已经有了$h_m$,下面优化求解$β$,很显然,这是一个一维搜索问题,如下:

在上面的泰勒一阶展开时,有一个条件就是$βh_m(x_i)$要足够小,显然,执行一维搜索后得到的β会满足这个条件

GBDT算法

以上算法将回归树和提升树的算法结合起来,在第5步中求解 $c_{m,j}$ ,如果损失函数为平方损失函数,则解法与前面的回归树一致,直接取均值即可。如果是其他损失函数,则需要具体进行求解。具体而言,就是取导数为零来解等式

GBDT回归算法

实例

编号 年龄(岁) 体重(kg) 身高(m)(标签值)
1 5 20 1.1
2 7 30 1.3
3 21 70 1.7
4 30 60 1.8
5(要预测的) 25 65

设损失函数为平方差函数

1、初始化学习器 $f_0(x)$

由于此时只有根结点,样本1,2,3,4都在根结点,此时要找到使得平方损失函数最小的参数$c$,怎么求呢?平方损失显然是一个凸函数,直接求导,倒数等于零,得到$c$。

令$\sum _{i=1}^N (c-y_i)=0$,得$c=\overline{y}$。
所以初始化时,$c$取值为所有训练样本标签值的均值。$c=(1.1+1.3+1.7+1.8)/4=1.475$,此时得到初始学习器 $f_0(x)$。

2、对迭代轮数m=1:

计算负梯度——残差

说白了,就是残差(上面已经解释过了),在此例中,残差在下表列出:

编号 年龄(岁) 体重(kg) 身高(m)(标签值) $f_0(x)$ 残差
1 5 20 1.1 1.475 -0.375
2 7 30 1.3 1.475 -0.175
3 21 70 1.7 1.475 0.225
4 30 60 1.8 1.475 0.325

此时将残差作为样本的目标值训练$f_1(x)$,寻找回归树的最佳划分结点,遍历每个特征的每个可能取值。从年龄特征的5开始,到体重特征的70结束,分别计算方差,找到使损失函数最小的那个划分结点即为最佳划分结点。例如:以年龄7为划分结点,将小于7的样本划分为一类,大于等于7的样本划分为另一类。样本1为一组,样本2,3,4为一组,两组的方差分别为0,0.047,两组方差之和为0.047。所有可能划分情况如下表所示

划分点 小于划分点的样本 大于等于划分点的样本 总方差
年龄5 / 1,2,3,4 0.082
年龄7 1 2,3,4 0.047
年龄21 1,2 3,4 0.0125
年龄30 1,2,3 4 0.062
体重20 / 1,2,3,4 0.082
体重30 1 2,3,4 0.047
体重60 1,2 3,4 0.0125
体重70 1,2,4 3 0.0867

以上划分点的损失函数最小为0.0125,有两个划分点分别为年龄21和体重60,所以随机选一个作为划分点,这里我们选年龄21。
此时还需要做一件事情,给这两个叶子结点分别赋一个参数,来拟合残差。

这里其实和上面初始化学习器是一个道理,平方损失,求导,

令导数等于零$\sum _{i=1}^N (c-y_i+f_0(x_i))=0$化简之后得到每个叶子结点的参数$c$,其实就是标签值的均值$c=\overline{y_i-f_0(x_i)}$。
根据上述划分结点:

  • 样本1,2为左叶子结点,$(x_1,x_2 \in R_{11})$,所以$c_{11}=(−0.375−0.175)/2=−0.275。 $
  • 样本3,4为右叶子结点,$(x_3,x_4 \in R_{11})$,所以$c_{21}=(0.225+0.325)/2=0.275。 $

此时可更新强学习器

3、对迭代轮数m=2,3,4,5,…,M:

循环迭代$M$次,$M$是人为控制的参数,迭代结束生成M棵树

4、得到最后的强学习器:

为了方别展示和理解,我们假设$M=1$,根据上述结果得到强学习器:

GBDT分类算法

二元GBDT分类算法

假设条件

  • 类别1的概率为:$p_1=\frac{e^{f_1(x)}}{e^{f_1(x)}+e^{f_2(x)}}$
  • 类别2的概率为:$p_2=1-p_2=\frac{e^{f_2(x)}}{e^{f_1(x)}+e^{f_2(x)}}$

损失函数化简

对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为:

其中$\large p=\frac{1}{1+e^{f(x)}}$

算法简介

实例

$x_i$ 1 2 3 4 5 6 7 8 9 10
$y_i$ 0 0 0 1 1 0 0 0 1 1

第一棵树

推导
计算

对迭代轮数m=1

$x_i$ 1 2 3 4 5 6 7 8 9 10
$r_{1,i}$ -0.4 -0.4 -0.4 0.6 0.6 -0.4 -0.4 -0.4 0.6 0.6

接着,我们需要以$r_{1,i}$为目标,拟合一颗树。

划分点 小于等于划分点的样本 大于划分点的样本 总方差
1 1 2,3,4,5,6,7,8,9,10 0.2469
2 1,2 3,4,5,6,7,8,9,10 0.25
3 1,2,3 4,5,6,7,8,9,10 0.2449
4 1,2,3,4 5,6,7,8,9,10 0.4375
5 1,2,3,4,5 6,7,8,9,10 0.48
6 1,2,3,4,5,6 7,8,9,10 0.4722
7 1,2,3,4,5,6,7 8,9,10 0.4263
8 1,2,3,4,5,6,7,8 9,10 0.1875
9 1,2,3,4,5,6,7,8,9 10 0.2222
10 1,2,3,4,5,6,7,8,9,10 \ 0.24

由此可知当切分点为8时,总方差最小。所以$R_{11}:x_i\leqslant 8,R_{11}:x_i> 8$

输出$c_{m,j}$
$x_i$ 1 2 3 4 5 6 7 8 9 10
$f_{1,i}(x_i)$ -1.0304 -1.0304 -1.0304 -1.0304 -1.0304 -1.0304 -1.0304 -1.0304 2.0946 2.0946

对迭代轮数m=2

其残差为

$x_i$ 1 2 3 4 5 6 7 8 9 10
$f_{1,i}(x_i)$ -0.3569 -0.3569 -0.3569 0.6431 0.6431 -0.3569 -0.3569 -0.3569 -7.1222 -7.1222

继续拟合第二可数

综上

一共拟合$M$棵树

多元GBDT分类算法

示例

$x_i$ 6 12 14 18 20 65 31 40 1 2 100 101 65 54
$y_i$ 0 0 0 0 0 1 1 1 1 1 2 2 2 2
$y_{i,0}$ 1 1 1 1 1 0 0 0 0 0 0 0 0 0
$y_{i,1}$ 0 0 0 0 0 1 1 1 1 1 0 0 0 0
$y_{i,2}$ 0 0 0 0 0 0 0 0 0 0 1 1 1 1

根学习器

首先进行初始化$f_{k0}(x_i)=0$,对所有的样本

迭代轮数m=1

第一个类别$(y_i=0)$拟合第一棵树$(m=1)$
$x_i$ 6 12 14 18 20 65 31 40 1 2 100 101 65 54
$y_{i,0}$ 1 1 1 1 1 0 0 0 0 0 0 0 0 0
$p_{0,0}$ 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333
$r_{1,i,0}$ 0.6667 0.6667 0.6667 0.6667 0.6667 -0.3333 -0.3333 -0.3333 -0.3333 -0.3333 -0.3333 -0.3333 -0.3333 -0.3333
  • 选择切分点进行拟合
    计算完后可以发现,当选择31做为分裂点时,可以得到最小的$MSE,MSE=0.4879$
划分点 小于等于划分点的样本 大于划分点的样本 总方差
1 1 2,6,12,14,18,20,31,40,54,65,65,100,101 1.0036
2 1,2 6,12,14,18,20,31,40,54,65,65,100,101 0.5063
6 1,2,6 12,14,18,20,31,40,54,65,65,100,101 0.5149
12 1,2,6,12 14,18,20,31,40,54,65,65,100,101 0.5222
14 1,2,6,12,14 18,20,31,40,54,65,65,100,101 0.5270
18 1,2,6,12,14,18 20,31,40,54,65,65,100,101 0.5270
20 1,2,6,12,14,18,20 31,40,54,65,65,100,101 0.5175
31 1,2,6,12,14,18,20,31 40,54,65,65,100,101 0.4879
40 1,2,6,12,14,18,20,31,40 54,65,65,100,101 0.5163
54 1,2,6,12,14,18,20,31,40,54 65,65,100,101 0.9012
65 1,2,6,12,14,18,20,31,40,54,65,65 100,101 1.060
100 1,14,18,20,31,40,54,65,65,100 101 0.5045
101 1,2,6,12,14,18,20,31,40,54,65,65,100,101 \ 0.5149
  • 计算$c_{m,j,l}$
$x_i$ 6 12 14 18 20 65 31 40 1 2 100 101 65 54
$f_{m,k}(x_i)=f_{1,0}(x_i)$ 1.1428 1.1428 1.1428 1.1428 1.1428 -0.999 -0.999 -0.999 1.1428 1.1428 -0.999 -0.999 -0.999 -0.999
第二个类别(y_i=1)拟合第一颗树$(m=1)$
$x_i$ 6 12 14 18 20 65 31 40 1 2 100 101 65 54
$y_{i,1}$ 0 0 0 0 0 1 1 1 1 1 0 0 0 0
$p_{0,1}$ 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333
$r_{1,i,1}$ -0.3333 -0.3333 -0.3333 -0.3333 -0.3333 0.6667 0.6667 0.6667 0.6667 0.6667 -0.3333 -0.3333 -0.3333 -0.3333

以$r_{1,i,1}$拟合一颗回归树,(以6为分裂点),可计算得到叶子结点

$x_i$ 6 12 14 18 20 65 31 40 1 2 100 101 65 54
$f_{m,k}(x_i)=f_{1,1}(x_i)$ -0.2499 -0.2499 -0.2499 -0.2499 -0.2499 -0.2499 -0.2499 -0.2499 2 2 -0.2499 -0.2499 -0.2499 -0.2499

综上

然后再拟合第三个类别(类别2)的第一颗树,过程也是重复上述步骤,所以这里就不再重复了。在拟合完所有类别的第一颗树后就开始拟合第二颗树。反复进行,直到训练了$M$轮。