正如随机森林是决策树模型在bagging框架上的集成,我们同样可以在boosting框架上采用决策树为基学习器,比如基于AdaBoost框架或Gradient Boosting框架。
鉴于AdaBoost算法可视为Gradient Boosting算法的一种特殊情况,所以本文直接介绍更泛化的梯度提升树(Gradient Boosting Decision Tree),并将其具体化到不同的损失函数中。
一、GBDT基本理论
1.1 Gradient Boosting算法回顾
再集成学习(三)Gradient Boosting算法中我们通过分离变量,将每轮的损失函数表示子学习器
g
(
x
)
g(x)
g(x)和权重系数
α
\alpha
α两个变量的优化目标:
arg min
α
,
g
L
(
G
m
)
=
arg min
α
,
g
1
N
∑
i
=
1
N
L
(
∑
t
=
1
m
−
1
α
t
g
t
(
x
i
)
+
α
g
(
x
i
)
,
y
i
)
\argmin\limits_{\alpha,g}L(G_{m})=\argmin\limits_{\alpha,g}\frac{1}{N}\sum\limits_{i=1}^NL(\sum_{t=1}^{m-1}\alpha_tg_t(x_i)+\alpha g(x_i),y_i)
α,gargminL(Gm)=α,gargminN1i=1∑NL(t=1∑m−1αtgt(xi)+αg(xi),yi)在函数空间内,对上式进行一阶泰勒展开,可得:
arg min
α
,
g
L
(
G
m
)
=
arg min
α
,
g
1
N
∑
i
=
1
N
(
L
(
∑
t
=
1
m
−
1
α
t
g
t
(
x
i
)
,
y
i
)
+
∂
L
(
∑
t
=
1
m
−
1
α
t
g
t
(
x
i
)
,
y
i
)
∂
∑
t
=
1
m
−
1
α
t
g
t
(
x
i
)
∗
α
g
(
x
i
)
)
\argmin\limits_{\alpha,g}L(G_{m})=\argmin\limits_{\alpha,g}\frac{1}{N}\sum\limits_{i=1}^N(L(\sum_{t=1}^{m-1}\alpha_tg_t(x_i),y_i)+\frac{\partial L(\sum_{t=1}^{m-1}\alpha_tg_t(x_i),y_i)}{\partial \sum_{t=1}^{m-1}\alpha_tg_t(x_i)}*\alpha g(x_i))
α,gargminL(Gm)=α,gargminN1i=1∑N(L(t=1∑m−1αtgt(xi),yi)+∂∑t=1m−1αtgt(xi)∂L(∑t=1m−1αtgt(xi),yi)∗αg(xi))对比梯度下降公式,可得当前轮的优化策略:
(1)以
−
∂
L
(
G
m
−
1
(
x
)
)
∂
G
m
−
1
(
x
)
-\frac{\partial L({G{_{m-1}(x))}}}{\partial G_{m-1(x)}}
−∂Gm−1(x)∂L(Gm−1(x)),即损失函数负梯度方向为目标,优化子学习器
g
(
x
)
g(x)
g(x)
(2)以样本损失函数为目标,优化权重参数
α
\alpha
α
1.2 决策树的另一种解读
在从决策树到XgBoost(一)决策树模型中曾经指出,决策树模型可视为一系列If-else"决策路径的组合。因此对于一棵树,其模型的参数包括两部分:树的结构(既决策路径)和叶子节点的结果(即决策结果)。
因为每一个叶子节点对应唯一一条决策路径。令整个决策映射为 q ( x ) q(x) q(x),对应决策路径 j j j的映射为 q j ( x ) = I ( x ∈ j ) q_j(x)=I(x\in j) qj(x)=I(x∈j),对应叶子节点上的结果为 w j w_j wj,叶子节点的总数为 T T T。此时,决策树模型可写作: g ( x ) = w q ( x ) = ∑ j = 1 T w j q j ( x ) = ∑ j = 1 T w j I ( x ∈ j ) g(x)=w_{q(x)}=\sum_{j=1}^Tw_jq_j(x)=\sum_{j=1}^Tw_jI(x\in j) g(x)=wq(x)=j=1∑Twjqj(x)=j=1∑TwjI(x∈j)
1.3 将决策树应用到Gradient Boosting框架中的理解
当将决策树应用到Gradient Boosting框架中时,又将如何理解每轮模型更新时的优化目标 g ( x ) g(x) g(x)和 α \alpha α呢?
(1)泛化的讲,
g
(
x
)
g(x)
g(x)是将损失函数负梯度值作为新的目标函数来训练新一轮的子学习器。那在GBDT中,就是将损失函数负梯度值作为新的目标函数来训练一个新的子树。
(2)泛化的讲,
α
\alpha
α是将子学习器的结果进行权重调整。那在GBDT中,就是将子树中叶子节点的结果进行大小的改变
注意到在1.2中,可以将决策树写作每个决策路径和叶子结果的和。对于每一个训练或测试样本,其推断时的决策路径和结果是唯一的。所以
α
g
(
x
)
=
α
∑
j
=
1
T
w
j
I
(
x
∈
j
)
=
∑
j
=
1
T
α
w
j
I
(
x
∈
j
)
=
∑
j
=
1
T
w
^
j
I
(
x
∈
j
)
\begin{aligned} \alpha g(x)&=\alpha \sum_{j=1}^Tw_jI(x\in j)\\&= \sum_{j=1}^T\alpha w_jI(x\in j)\\ &= \sum_{j=1}^T \hat w_j I(x\in j)\end{aligned}
αg(x)=αj=1∑TwjI(x∈j)=j=1∑TαwjI(x∈j)=j=1∑Tw^jI(x∈j)这意味着什么?意味着当Gradient Boosting的框架选决策树作为基学习器时,可以将
g
(
x
)
g(x)
g(x)和
α
\alpha
α的优化思路进一步改进为如下两步:
(1)以损失函数负梯度值目标函数,确定新一轮子树
g
(
x
)
g(x)
g(x)的结构(决策路径和样本划分)
(2)以总模型
G
(
x
)
G(x)
G(x)的最小损失函数为目标,确定子树
g
(
x
)
g(x)
g(x)中各叶子节点的结果
w
j
w_j
wj
无论用决策树来解决分类或回归问题,各叶子节点中的结果值均为一个固定数值(如分类标识、分类概率值或回归平滑值),因此对于上面的第(2)步,每个叶子节点的最终值均为一个固定数值。
1.4 GBDT算法流程
在GBDT的实际使用中,基本都采用基于CART树的实现。通过选择合适的定义连续可导的损失函数,可以解决回归和分类问题。
GBDT算法的基本流程如下:
(1)初始化学习器
g
0
(
x
)
g_0(x)
g0(x),一般可取
g
0
(
x
)
=
arg
min
g
(
w
,
q
)
∑
i
=
1
N
L
(
g
(
x
i
)
,
y
i
)
=
arg
min
g
(
w
,
q
)
∑
i
=
1
N
L
(
∑
j
=
1
J
q
j
(
x
i
)
,
y
i
)
g_0(x)=\arg\min_{g(w,q)} \sum_{i=1}^NL(g(x_i),y_i)=\arg\min_{g(w,q)} \sum_{i=1}^NL(\sum_{j=1}^J q_j(x_i),y_i)
g0(x)=argg(w,q)mini=1∑NL(g(xi),yi)=argg(w,q)mini=1∑NL(j=1∑Jqj(xi),yi)
(2) 对于迭代轮数
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M:
a) 计算各样本的损失负梯度方向:
r
m
i
=
−
∂
L
(
G
m
−
1
(
x
i
)
,
y
i
)
∂
G
m
−
1
(
x
i
)
r_{mi}=-\frac{\partial L(G_{m-1}(x_i),y_i)}{\partial G_{m-1}(x_i)}
rmi=−∂Gm−1(xi)∂L(Gm−1(xi),yi)b) 以
(
x
i
,
r
m
i
)
(x_i,r_{mi})
(xi,rmi)为样本,确定一颗新的CART树结构
q
m
q_m
qm,
c) 对上述子CART树,计算出每个叶子节点中的最佳结果值:
w
m
j
=
arg
min
w
∑
i
∈
I
m
j
L
(
G
m
−
1
(
x
i
)
+
w
,
y
i
)
w_{mj}=\arg\min_w\sum_{i\in I_{mj}}L(G_{m-1}(x_i)+w,y_i)
wmj=argwmini∈Imj∑L(Gm−1(xi)+w,yi)上式中,
I
m
j
=
{
i
∣
q
(
x
i
)
=
j
}
I_{mj}=\{i|q(x_i)=j\}
Imj={i∣q(xi)=j}表示上述CART树中某个叶子节点
j
j
j上的训练样本集合
d)更新总的模型:
G
m
(
x
)
=
G
m
−
1
(
x
)
+
∑
j
=
1
J
m
w
m
j
q
m
(
x
)
G_m(x)=G_{m-1}(x)+\sum_{j=1}^{J_m} w_{mj}q_m(x)
Gm(x)=Gm−1(x)+j=1∑Jmwmjqm(x)
(3)最终得到的总模型为: G M ( x ) = g 0 ( x ) + ∑ m = 1 M ∑ j = 1 J m w m j q m ( x ) G_M(x)=g_0(x)+\sum_{m=1}^M\sum_{j=1}^{J_m}w_{mj}q_m(x) GM(x)=g0(x)+m=1∑Mj=1∑Jmwmjqm(x)
二、将GBDT用于回归和分类问题
通过将损失函数定义为不同的损失函数(参见机器学习中常见的损失函数),即可将GBDT算法使用到各类实际问题。
2.1 GBDT回归算法
以平方损失函数为例,介绍GBDT在回归问题中使用,此外还可以使用绝对值损失、Huber损失和Quantile损失等。
此时GBDT算法的几个显著特点在于:
(1)
g
0
g_{0}
g0可直接取训练样本的均值代替;
(2)损失函数为
(
G
(
x
)
−
y
)
2
(G(x)-y)^2
(G(x)−y)2,此时样本
x
i
x_i
xi的负梯度值为
2
(
y
−
G
(
x
)
)
2(y-G(x))
2(y−G(x)),即为前序总模型预测结果值与真实值的残差值(忽略倍数,因为可合并到后续节点结果的优化)。因此,每轮子树的优化过程可视为:
a) 基于样本的残差值
(
x
i
,
y
i
−
G
m
−
1
(
x
i
)
)
(x_i,y_i-G_{m-1}(x_i))
(xi,yi−Gm−1(xi)),得到子树
g
m
(
x
)
g_m(x)
gm(x)的结构;
b)对于子树中每组样本而言,取其总平方损失最小(包括前序学习器和当前子树)的值为该节点的结果值
2.2 GBDT分类算法
2.2.1 二分类问题
对于二分类问题,当其损失函数取指数损失函数时,可退化为Adaboost算法。另一种被广泛采用的损失函i数为类似于逻辑回归中的对数似然损失函数: L ( g ( x ) , y ) = log ( 1 + exp − y g ( x ) ) L(g(x),y)=\log(1+\exp^{-yg(x)}) L(g(x),y)=log(1+exp−yg(x))对应的负梯度值为: r m i = y i 1 + exp − y i g m ( x ) r_{mi}=\frac{y_i}{1+\exp^{-y_ig_m(x)}} rmi=1+exp−yigm(x)yi根据该值取确定每轮更新中子树的结构,而该子树各叶子节点的最佳结果值为: w m j = arg min w ∑ i ∈ I m j log ( 1 + exp − y i ( G m − 1 ( x i ) + w ) ) w_{mj}=\arg\min_w\sum_{i\in I_{mj}}\log(1+\exp^{-y_i(G_{m-1}(x_i)+w)}) wmj=argwmini∈Imj∑log(1+exp−yi(Gm−1(xi)+w))此值难以优化,因此常用下值替代: w m j = ∑ i ∈ I m j r m i ∑ i ∈ I m j ∣ r m i ∣ ( 1 − ∣ r m i ∣ ) w_{mj}=\frac{\sum\limits_{i\in I_{mj}}r_{mi}}{\sum\limits_{i\in I_{mj}}|r_{mi}|(1-|r_{mi}|)} wmj=i∈Imj∑∣rmi∣(1−∣rmi∣)i∈Imj∑rmi
2.2.2 多分类问题
对于多分类问题,假设为
K
K
K类,采用交叉熵损失函数:
L
(
g
(
x
)
,
y
)
=
−
∑
k
=
1
K
y
k
log
p
k
(
x
)
L(g(x),y)=-\sum_{k=1}^Ky_k\log p_k(x)
L(g(x),y)=−k=1∑Kyklogpk(x)其中
y
k
y_k
yk仅在当前样本所属分类时为1,其他均为0,预测值属于类
k
k
k的概率为:
p
k
(
x
)
=
exp
(
g
(
k
)
(
x
)
)
∑
l
=
1
K
exp
(
g
(
l
)
(
x
)
)
p_k(x)=\frac{\exp(g^{(k)}(x))}{\sum\limits_{l=1}^K\exp(g^{(l)}(x))}
pk(x)=l=1∑Kexp(g(l)(x))exp(g(k)(x))上式中
g
(
l
)
(
x
)
g^{(l)}(x)
g(l)(x)为映射到类
l
l
l的函数。
其第
m
m
m轮第
i
i
i个样本对应类别
l
l
l函数的负梯度值为:
r
m
i
l
=
=
y
i
l
−
p
l
,
m
−
1
(
x
i
)
r_{mil=}=y_{il}-p_{l,m-1}(x_i)
rmil==yil−pl,m−1(xi)即负梯度值为样本
i
i
i对应类别
l
l
l的真实概率与前
t
−
1
t-1
t−1轮预测概率之差。
根据该值进行每轮子树的决策树。对于该子树每个叶子节点的最佳结果则为:
w
m
j
l
=
arg
min
w
∑
i
∈
I
m
j
L
(
(
G
m
−
1
(
x
i
)
+
w
)
,
y
i
)
w_{mjl}=\arg\min_{w}\sum_{i \in I_{mj}}L((G_{m-1}(x_i)+w),y_i)
wmjl=argwmini∈Imj∑L((Gm−1(xi)+w),yi)
上式难以直接优化,常用下式替代:
w
m
j
l
=
K
−
1
K
∑
i
∈
I
m
j
l
r
m
i
l
∑
i
∈
I
m
j
l
∣
r
m
i
l
∣
(
1
−
∣
r
m
i
l
∣
)
w_{mjl}=\frac{K-1}{K}\frac{\sum\limits_{i\in I_{mjl}}r_{mil}}{\sum\limits_{i\in I_{mjl}}|r_{mil}|(1-|r_{mil}|)}
wmjl=KK−1i∈Imjl∑∣rmil∣(1−∣rmil∣)i∈Imjl∑rmil
三、GBDT的正则化
若不对以决策树为基学习器的集成算法加以正则化,则极易过拟合。GBDT的常见正则化策略包括:
(1)对子树的剪枝,具体做法可参照从决策树到XgBoost(一)决策树模型、
(2)子采样算法。每棵子树的学习过程中通过不放回采样的方式采集子样。
(3)加法模型中,对每个子学习器加以一定的衰减系数(shrinkage),从而避免子学习器学习过度。衰减系数 v v v的取值范围为 0 < v ≤ 1 0<v\le 1 0<v≤1,其作为模型的超参数,与子树的个数 M M M强相关,所以在调参时需联合调整。