集成学习——Boosting
一、引言
在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型。但是,实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合多个弱监督模型以期得到一个更好更全面的强监督模型,它是基于这样一种思想:将多个监督模型的判断进行适当的结合,要比其中任何一个单独的监督模型要好,因为即便某一个弱监督模型得到了错误的判断,其他的弱监督模型也有可能将错误纠正回来。
根据弱学习器的生成方式,目前的集成学习方法大致可分为两大类:
- 序列化方法:各个弱学习器之间存在强依赖关系、必须串行化生成,以Boosting为代表;
- 并行化方法:各个弱学习器之间不存在强依赖关系、可同时生成,以Bagging为代表;
本文主要介绍Boosting方法,下图是Boosting方法的示意图。
Boosting方法是可以将弱学习器提升为强学习器的一类方法,它的工作机制是:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本进行调整,使得先前基学习器预测错误的训练样本在后续收到更多关注,然后基于调整后的样本分布来训练下一个基学习器,如此重复进行,直至基学习器数目达到事先指定的值
M
M
M,最终将这
M
M
M个基学习器进行加权结合。
二、前向分步算法
在详细介绍Boosting方法之前,我们首先介绍一下前向分步算法,因为大多数Boosting方法都可以看作是前向分步算法的特例。
具体来说,假设有加法模型
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(\mathbf{x}) = \sum_{m = 1}^M \beta_mb(\mathbf{x};\gamma_m)
f(x)=m=1∑Mβmb(x;γm)
其中,
b
(
x
;
γ
m
)
b(x;\gamma_m)
b(x;γm)为基函数,
γ
m
\gamma_m
γm为基函数的参数,
β
m
\beta_m
βm为基函数的系数。我们的目标是极小化损失函数
min
β
m
,
γ
m
∑
i
=
1
N
L
(
y
i
,
f
(
x
i
)
)
\min_{\beta_m,\gamma_m} \sum_{i = 1}^N L(y_i,f(\mathbf{x}_i))
βm,γmmini=1∑NL(yi,f(xi))
其中,
L
(
⋅
)
L(\cdot)
L(⋅)为损失函数。
由于
f
(
x
)
f(\mathbf{x})
f(x)是加法模型
f
2
(
x
)
=
f
1
(
x
)
+
β
b
(
x
;
γ
2
)
f
3
(
x
)
=
f
2
(
x
)
+
β
3
b
(
x
;
γ
3
)
.
.
.
f
m
(
x
)
=
f
m
−
1
(
x
)
+
β
m
b
(
x
;
γ
m
)
\begin{aligned} f_2(\mathbf{x}) &= f_1(\mathbf{x}) + \beta_b(\mathbf{x};\gamma_2) \\ f_3(\mathbf{x}) &= f_2(\mathbf{x}) + \beta_3b(\mathbf{x};\gamma_3) \\ ...\\ f_m(\mathbf{x}) &= f_{m - 1}(\mathbf{x}) + \beta_mb(\mathbf{x};\gamma_m) \end{aligned}
f2(x)f3(x)...fm(x)=f1(x)+βb(x;γ2)=f2(x)+β3b(x;γ3)=fm−1(x)+βmb(x;γm)
因此,前向分步算法的基本思路是:每步只学习一个基函数及其系数,逐步逼近目标函数,从而简化优化的复杂度。
前向分步算法的具体流程如下:
- 初始化 f 0 ( x ) = 0 f_0(\mathbf{x}) = 0 f0(x)=0;
- 对
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
a. 极小化损失函数
( β m , γ m ) = arg min β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) (\beta_m, \gamma_m) = \arg \min_{\beta, \gamma} \sum_{i=1}^N L(y_i, f_{m - 1}(\mathbf{x}_i) + \beta b(\mathbf{x}_i;\gamma) (βm,γm)=argβ,γmini=1∑NL(yi,fm−1(xi)+βb(xi;γ)
b.更新
f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_m(\mathbf{x}) = f_{m-1}(\mathbf{x}) + \beta_mb(\mathbf{x};\gamma_m) fm(x)=fm−1(x)+βmb(x;γm) - 得到加法模型
f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(\mathbf{x}) = f_M(\mathbf{x}) = \sum_{m = 1}^M \beta_mb(\mathbf{x};\gamma_m) f(x)=fM(x)=m=1∑Mβmb(x;γm)
这样,前向分步算法将同时求解所有的 β m \beta_m βm和 γ m \gamma_m γm的优化问题简化为逐次求解各个 β m \beta_m βm和 γ m \gamma_m γm的问题。
三、AdaBoost
AdaBoost算法是从弱学习算法出发,反复学习,得到一系列弱分类器(又称基本分类器),然后组合这些弱分类器,构成一个强分类器。它通过改变训练数据的概率分布(训练数据的权值分布),针对不同的的训练数据分布调用弱学习算法学习一系列弱分类器。那么,就有以下两个问题需要解决:
- 在每一轮如何改变训练数据的权值或是说概率分布;
- 如何将多个弱分类器组合成一个强分类器;
对于第一个问题,AdaBoost算法是这样解决的:提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些下载 到正确分类的数据,由于其权值增大而在下一轮的训练中得到更大的关注。而对于第二问题,AdaBoost算法采用加权多数表决的方法,即加大分类误差率小的弱分类器的权值,使其在表决中起到较大的作用,而减小分类误差率较大的弱分类器的权值,使其在表决种起到较小的作用。下面我们将详细介绍AdaBoost算法。
首先,给定二分类训练集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
}
T = \{ (\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), ..., (\mathbf{x}_N, y_N)\}
T={(x1,y1),(x2,y2),...,(xN,yN)}
其中
x
i
∈
R
n
\mathbf{x}_i \in \mathbb{R}^n
xi∈Rn表示实例,
y
i
∈
{
+
1
,
−
1
}
y_i \in \{+1, -1\}
yi∈{+1,−1}表示实例对应的标签。
AdaBoost方法的具体步骤如下:
- 初始化训练数据的权值分布
D 1 = ( w 11 , . . . , w 1 i , . . . , w 1 N ) , w 1 i = 1 N , i = 1 , 2 , . . . , N D_1=(w_{11}, ..., w_{1i}, ..., w_{1N}),w_{1i}=\frac{1}{N}, i = 1,2,...,N D1=(w11,...,w1i,...,w1N),w1i=N1,i=1,2,...,N - 对于
m
=
1
,
2
,
.
.
.
,
M
m = 1, 2, ..., M
m=1,2,...,M
a. 使用具有全职分布 D m D_m Dm的训练数据集学习,得到弱分类器
G m ( x ) G_m(\mathbf{x}) Gm(x)
b. 计算 G m ( x i ) G_m(\mathbf{x}^i) Gm(xi)在训练集上的分类误差率
ϵ m = ∑ i = 1 N w m i I ( G m ( x i ≠ y i ) ) \epsilon_m = \sum_{i = 1}^N w_{mi}I(G_m(\mathbf{x}^i \neq y_i)) ϵm=i=1∑NwmiI(Gm(xi=yi))
c. 计算弱分类器 G m ( x i ) G_m(\mathbf{x}^i) Gm(xi)的权重系数
α m = 1 2 log 1 − ϵ m ϵ m \alpha_m = \frac{1}{2} \log \frac{1-\epsilon_m}{\epsilon_m} αm=21logϵm1−ϵm
d. 更新训练数据集的权值分布
D m + 1 = ( w m + 1 , 1 , . . . , w m + 1 , i , . . . , w m + 1 , N ) w m + 1 , i = w m i Z m e x p ( − α m y i G m ( x i ) ) Z m = ∑ i = 1 N w m i e x p ( − α m y i G m ( x i ) ) ( 规 范 化 因 子 ) \begin{aligned} D_{m+1} &= (w_{m+1, 1}, ..., w_{m+1, i}, ..., w_{m+1, N}) \\ w_{m+1, i} &= \frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(\mathbf{x}^i)) \\ Z_m &= \sum_{i=1}^N w_{mi} exp(-\alpha_my_iG_m(\mathbf{x}^i)) (规范化因子) \end{aligned} Dm+1wm+1,iZm=(wm+1,1,...,wm+1,i,...,wm+1,N)=Zmwmiexp(−αmyiGm(xi))=i=1∑Nwmiexp(−αmyiGm(xi))(规范化因子) - 构建弱分类器的加权组合
f ( x ) = ∑ i = 1 M α m G m ( x ) f(\mathbf{x}) = \sum_{i=1}^M\alpha_mG_m(\mathbf{x}) f(x)=i=1∑MαmGm(x)
上述步骤中,
w
m
i
w_{mi}
wmi表示第
m
m
m轮第i个实例的权重,从其更新公式
w
m
+
1
,
i
=
w
m
i
Z
m
e
−
α
m
,
G
m
(
x
i
)
=
y
i
w
m
+
1
,
i
=
w
m
i
Z
m
e
α
m
,
G
m
(
x
i
)
≠
y
i
\begin{aligned} w_{m+1, i} &= \frac{w_{mi}}{Z_m}e^{-\alpha_m}, G_m(\mathbf{x}^i) = y_i \\ w_{m+1, i} &= \frac{w_{mi}}{Z_m}e^{\alpha_m}, G_m(\mathbf{x}^i) \neq y_i \end{aligned}
wm+1,iwm+1,i=Zmwmie−αm,Gm(xi)=yi=Zmwmieαm,Gm(xi)=yi
可以看出,如果上一轮训练中的某个实例被正确分类,那么它在下一轮训练中的权值将减小;如果上一轮训练中的某个实例被错误分类,那么它在下一轮训练中的权值将增大。
另外,上述步骤中, α m \alpha_m αm表示第 m m m个弱分类器前面的权重系数,即弱分类器 G m ( x ) G_m(\mathbf{x}) Gm(x)在最终强分类器中的重要程度。从其公式中可以看出,当 ϵ m ≤ 1 2 \epsilon_m \leq \frac{1}{2} ϵm≤21时, α m ≥ 0 \alpha_m \geq 0 αm≥0,并且随着 ϵ m \epsilon_m ϵm的减小而增大,所以分类误差率越小的弱分类器在最终分类器中的作用越大。
AdaBoost算法可以看作是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二分类学习算法。上述的这个定理的证明在此就不再赘述,具体可以参考李航的《统计学习方法》第8.2.3小节。
三、Boosting Tree
如果基函数是决策树,那么这种Boosting方法称为Boosting Tree。Boosting Tree可以表示为决策树的加法模型
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
θ
m
)
f_M(\mathbf{x}) = \sum_{m=1}^M T(\mathbf{x};\theta_m)
fM(x)=m=1∑MT(x;θm)
其中,
T
(
x
;
θ
m
)
T(\mathbf{x};\theta_m)
T(x;θm)表示决策树。
对于二类分类问题,只需将Adaboost算法中的基分类器二类分类树,即可得到二类分类问题的Boosting Tree。
对于回归问题,假设有回归树将输入空间划分为
J
J
J个互不相交的区域
R
1
,
R
2
,
.
.
.
,
R
J
R_1, R_2,...,R_J
R1,R2,...,RJ,并且在每个区域上确定输出的常量
c
j
c_j
cj,那么回归树可以表示为
T
(
x
;
θ
)
=
∑
j
=
1
J
c
j
I
(
x
∈
R
j
)
T(\mathbf{x};\theta) = \sum_{j=1}^J c_j I(\mathbf{x} \in R_j)
T(x;θ)=j=1∑JcjI(x∈Rj)
当损失函数采用MSE(平方误差损失函数)时,那么
L
(
y
,
f
m
(
x
)
)
=
[
y
−
f
m
−
1
(
x
)
−
T
(
x
;
θ
m
)
]
2
=
[
r
−
T
(
x
;
θ
m
)
]
2
\begin{aligned} L(y, f_{m}(\mathbf{x})) &= [y - f_{m-1}(\mathbf{x}) - T(\mathbf{x};\theta_m)]^2 \\ &= [r - T(\mathbf{x};\theta_m)]^2 \end{aligned}
L(y,fm(x))=[y−fm−1(x)−T(x;θm)]2=[r−T(x;θm)]2
其中,
r
r
r是当前模型拟合数据的残差。因此,回归问题的Boosting Tree算法只需简单地拟合当前模型地残差,其具体过程如下:
- 初始化 f 0 ( x ) = 0 f_0(\mathbf{x}) = 0 f0(x)=0;
- 对
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
a. 计算残差
r m i = y i − f m − 1 ( x i ) r_{mi} = y_i - f_{m-1}(\mathbf{x}_i) rmi=yi−fm−1(xi)
b. 拟合残差 r m i r_mi rmi学习一个回归树,得到 T ( x ; θ m ) T(\mathbf{x};\theta_m) T(x;θm)
c. 更新
f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(\mathbf{x}) = f_{m-1}(\mathbf{x}) + T(\mathbf{x};\theta_m) fm(x)=fm−1(x)+T(x;θm) - 得到回归问题的Boosting Tree
f M ( x ) = ∑ m = 1 M T ( x ; θ m ) f_M(\mathbf{x}) = \sum_{m=1}^M T(\mathbf{x};\theta_m) fM(x)=m=1∑MT(x;θm)
四、Gradient Boosting Decision Tree
当损失函数是平方误差损失函数或指数函数时,每一步优化很简单,但是对于一般的损失函数,优化就会变得比较复杂。Gradient Boosting算法就是针对这一问题提出的。
具体来说,我们希望在第
m
m
m步学习到的基本分类器
f
m
(
x
)
f_m(\mathbf{x})
fm(x)使得
L
(
y
,
f
m
−
1
(
x
)
+
f
m
(
x
)
)
L(y, f_{m-1}(\mathbf{x}) + f_{m}(\mathbf{x}))
L(y,fm−1(x)+fm(x))尽可能地在
L
(
y
,
f
m
−
1
(
x
)
)
L(y, f_{m-1}(\mathbf{x}))
L(y,fm−1(x))的基础上变得更小,因此,我们只需要使
L
(
y
,
f
m
−
1
(
x
)
+
f
m
(
x
)
)
L(y, f_{m-1}(\mathbf{x}) + f_{m}(\mathbf{x}))
L(y,fm−1(x)+fm(x))的值比
L
(
y
,
f
m
−
1
(
x
)
)
L(y, f_{m-1}(\mathbf{x}))
L(y,fm−1(x))小即可。那么,我们的目标函就变成:
max
[
L
(
y
,
f
m
−
1
(
x
)
)
−
L
(
y
,
f
m
−
1
(
x
)
+
f
m
(
x
)
)
]
\max[L(y, f_{m-1}(\mathbf{x})) - L(y, f_{m-1}(\mathbf{x}) + f_{m}(\mathbf{x}))]
max[L(y,fm−1(x))−L(y,fm−1(x)+fm(x))]
又因为在第
m
m
m轮,
f
m
−
1
(
x
)
f_{m-1}(\mathbf{x})
fm−1(x)已经确定,所以把它设为
c
o
n
s
t
const
const,那么
max
[
L
(
y
,
c
o
n
s
t
)
−
L
(
y
,
c
o
n
s
t
+
f
m
(
x
)
)
]
\max[L(y, const) - L(y, const+ f_{m}(\mathbf{x}))]
max[L(y,const)−L(y,const+fm(x))]
根据泰勒展开,有
L
(
y
,
c
o
n
s
t
+
f
m
(
x
)
)
≈
L
(
y
,
c
o
n
s
t
)
+
L
′
(
y
,
c
o
n
s
t
)
f
m
(
x
)
L(y, const+ f_{m}(\mathbf{x})) \approx L(y, const) + L'(y, const)f_{m}(\mathbf{x})
L(y,const+fm(x))≈L(y,const)+L′(y,const)fm(x)
若令
f
m
(
x
)
=
−
L
′
(
y
,
c
o
n
s
t
)
f_m(\mathbf{x})=-L'(y, const)
fm(x)=−L′(y,const),那么
L
(
y
,
c
o
n
s
t
+
f
m
(
x
)
)
≈
L
(
y
,
c
o
n
s
t
)
−
L
′
(
y
,
c
o
n
s
t
)
2
<
L
(
y
,
c
o
n
s
t
)
L(y, const+ f_{m}(\mathbf{x})) \approx L(y, const) - L'(y, const)^2 < L(y, const)
L(y,const+fm(x))≈L(y,const)−L′(y,const)2<L(y,const)
因此,在第 m m m轮,可以用损失函数的负梯度作为残差的近似值,拟合一个回归树。
GBDT的具体流程如下所示:
- 初始化
f 0 ( x ) = arg min c ∑ i = 1 N L ( y i , c ) f_0(\mathbf{x}) = \arg \min_c \sum_{i=1}^NL(y_i,c) f0(x)=argcmini=1∑NL(yi,c) - 对
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
a. 计算残差(负梯度)
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi} = -[\frac{\partial L(y_i, f(\mathbf{x}_i))}{\partial f(\mathbf{x}_i)}]_{f(\mathbf{x}) = f_{m-1}(\mathbf{x})} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
b. 拟合残差 r m i r_mi rmi学习一个回归树,得到第 m m m棵树的叶结点区域 R m j , j = 1 , 2 , . . . , J R_{mj}, j=1,2,...,J Rmj,j=1,2,...,J
c. 对 j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J,计算
c m j = arg min c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj} = \arg \min_c \sum_{\mathbf{x}_i \in R_{mj}} L(y_i,f_{m-1}(\mathbf{x}_i) + c) cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)
d. 更新
f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_m(\mathbf{x}) = f_{m-1}(\mathbf{x}) + \sum_{j=1}^J c_{mj} I(\mathbf{x} \in R_{mj}) fm(x)=fm−1(x)+j=1∑JcmjI(x∈Rmj) - 得到回归问题的Boosting Tree
f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) f_M(\mathbf{x}) = \sum_{m=1}^M \sum_{j=1}^J c_{mj} I(\mathbf{x} \in R_{mj}) fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
五、XGBoost
XGBoost全名叫(Extreme Gradient Boosting)极端梯度提升,是 GBDT的改进版,既可以用于分类也可以用于回归问题中。
XGBoost仍然是加法模型,它将
M
M
M个树(CART树)的结果进行求和,作为最终的预测值,即:
y
^
=
∑
m
=
1
M
f
m
(
x
)
,
f
m
∈
F
F
=
{
f
(
x
)
=
w
q
(
x
)
}
(
q
:
R
n
→
T
,
w
∈
R
T
)
\begin{aligned} \hat{y}= \sum_{m=1}^M f_m(\mathbf{x}),f_m \in \mathcal{F} \\ \mathcal{F} = \{ f(\mathbf{x}) = w_{q(\mathbf{x})}\} (q : \mathbb{R}^n \to T, w \in \mathbb{R}^T) \end{aligned}
y^=m=1∑Mfm(x),fm∈FF={f(x)=wq(x)}(q:Rn→T,w∈RT)
其中, F \mathcal{F} F是CART树的函数空间, q q q表示一棵树的结构,它将实例映射到对应的叶结点, T T T表示树的叶子结点的个数, w w w表示叶子结点的权重。
XGBoost的目标函数与GBDT相比,增加了正则化项,具体如下:
min
∑
i
=
1
N
L
(
y
i
,
y
^
i
)
+
∑
m
=
1
M
Ω
(
f
m
)
Ω
(
f
)
=
γ
T
+
1
2
λ
∣
∣
w
∣
∣
2
\begin{aligned} \min \sum_{i=1}^N L(y_i, \hat{y}_i) + \sum_{m=1}^M \Omega(f_m) \\ \Omega(f) = \gamma T +\frac{1}{2} \lambda||w||^2 \end{aligned}
mini=1∑NL(yi,y^i)+m=1∑MΩ(fm)Ω(f)=γT+21λ∣∣w∣∣2
上式的第一项是损失误差,第二项是正则项,控制树的复杂度,防止过拟合。
根据泰勒展开式:
f
(
x
+
Δ
x
)
≈
f
(
x
)
+
f
′
(
x
)
Δ
x
+
1
2
f
′
′
(
x
)
Δ
x
f(x+\Delta x) \approx f(x) + f'(x)\Delta x + \frac{1}{2} f''(x)\Delta x
f(x+Δx)≈f(x)+f′(x)Δx+21f′′(x)Δx
在第
m
m
m轮,目标函数可以改写成:
L
(
m
)
=
∑
i
=
1
N
L
(
y
i
,
y
^
i
(
m
−
1
)
+
f
m
(
x
i
)
)
+
γ
T
+
1
2
λ
∑
t
=
1
T
w
t
2
≈
∑
i
=
1
N
[
L
(
y
i
,
y
^
i
(
m
−
1
)
)
+
g
i
f
m
(
x
i
)
+
1
2
h
i
f
m
2
(
x
i
)
]
+
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
=
∑
i
=
1
N
[
g
i
f
m
(
x
i
)
+
1
2
h
i
f
m
2
(
x
i
)
]
+
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
+
c
o
n
s
t
\begin{aligned} L^{(m)} &= \sum_{i=1}^N L(y_i, \hat{y}_i^{(m-1)}+f_{m}(\mathbf{x}_i)) + \gamma T + \frac{1}{2} \lambda \sum_{t=1}^T w_t^2 \\ &\approx \sum_{i=1}^N [L(y_i,\hat{y}_i^{(m-1)}) + g_i f_m(\mathbf{x}_i) + \frac{1}{2} h_i f_m^2(\mathbf{x}_i)] + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2 \\ &= \sum_{i=1}^N [g_i f_m(\mathbf{x}_i) + \frac{1}{2} h_i f_m^2(\mathbf{x}_i)] + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2 + const \end{aligned}
L(m)=i=1∑NL(yi,y^i(m−1)+fm(xi))+γT+21λt=1∑Twt2≈i=1∑N[L(yi,y^i(m−1))+gifm(xi)+21hifm2(xi)]+γT+21λj=1∑Twj2=i=1∑N[gifm(xi)+21hifm2(xi)]+γT+21λj=1∑Twj2+const
其中,
g
i
=
∂
L
(
y
i
,
y
^
i
(
m
−
1
)
)
∂
y
^
i
(
m
−
1
)
h
i
=
∂
2
L
(
y
i
,
y
^
i
(
m
−
1
)
)
∂
y
^
i
(
m
−
1
)
\begin{aligned} g_i &= \frac{\partial L(y_i,\hat{y}_i^{(m-1)})}{\partial \hat{y}_i^{(m-1)}} \\ h_i &= \frac{\partial^2 L(y_i,\hat{y}_i^{(m-1)})}{\partial \hat{y}_i^{(m-1)}} \end{aligned}
gihi=∂y^i(m−1)∂L(yi,y^i(m−1))=∂y^i(m−1)∂2L(yi,y^i(m−1))
分别表示损失函数的一阶和二阶偏导数。
令
I
j
=
{
i
∣
q
(
x
i
)
=
j
}
I_j = \{ i | q(\mathbf{x}_i) = j \}
Ij={i∣q(xi)=j} 表示被分配到第
j
j
j个叶子结点上的实例集合,那么
L
(
m
)
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
j
+
(
1
2
∑
i
∈
I
j
h
i
)
w
j
2
]
+
+
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
+
c
o
n
s
t
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
j
+
(
1
2
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
]
+
+
γ
T
+
c
o
n
s
t
\begin{aligned} L^{(m)} &= \sum_{j=1}^T [(\sum_{i \in I_j} g_i) w_j + (\frac{1}{2} \sum_{i \in I_j} h_i) w_j^2] + + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2 + const \\ &= \sum_{j=1}^T [(\sum_{i \in I_j} g_i) w_j + (\frac{1}{2} \sum_{i \in I_j} h_i + \lambda) w_j^2] + + \gamma T + const \end{aligned}
L(m)=j=1∑T[(i∈Ij∑gi)wj+(21i∈Ij∑hi)wj2]++γT+21λj=1∑Twj2+const=j=1∑T[(i∈Ij∑gi)wj+(21i∈Ij∑hi+λ)wj2]++γT+const
令
G
j
=
∑
i
∈
I
j
g
i
G_j = \sum_{i \in I_j} g_i
Gj=∑i∈Ijgi,
H
j
=
∑
i
∈
I
j
h
i
H_j = \sum_{i \in I_j} h_i
Hj=∑i∈Ijhi,对
w
j
w_j
wj求偏导,令其导数为0:
∂
L
(
m
)
∂
w
j
=
G
j
+
(
H
j
+
λ
)
w
j
=
0
w
j
∗
=
−
G
j
H
j
+
λ
L
(
m
)
∗
=
−
1
2
∑
j
=
1
T
G
j
2
H
j
+
λ
+
γ
T
\begin{aligned} \frac{\partial L^{(m)}}{\partial w_j} &= G_j + (H_j + \lambda)w_j = 0 \\ w_j^* &= -\frac{G_j}{H_j+\lambda} \\ L^{(m)*} &= -\frac{1}{2} \sum_{j=1}^T \frac{G_j^2}{H_j+\lambda} + \gamma T \end{aligned}
∂wj∂L(m)wj∗L(m)∗=Gj+(Hj+λ)wj=0=−Hj+λGj=−21j=1∑THj+λGj2+γT
L ( m ) L^{(m)} L(m)代表了当我们指定一个树结构的时候,我们在目标函数上最多减少多少。一般把它叫做结构分数(structure score),可以认为它是类似Gini系数一样更加一般的对于树结构进行打分的函数。通过上式我们还可以看到,当树结构确定时,树的结构得分只与其一阶导数和二阶导数有关,得分越小,说明结构越好。
通常情况下,我们无法枚举所有可能的树结构然后选取最优的,所以我们选择用一种贪婪算法来代替:我们从单个叶结点开始,迭代分裂来给树添加结点。结点切分后的损失函数为:
L
s
p
l
i
t
=
1
2
[
G
L
2
H
L
+
λ
+
G
R
2
H
R
+
λ
−
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
]
−
γ
L_{split} = \frac{1}{2} [\frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{(G_L + G_R)^2}{H_L + H_R+\lambda} ] - \gamma
Lsplit=21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ
其中,前两项分别表示左子树和右子树的分数,第三项表示不分割可以拿到的分数,最后一项表示加入新叶子结点引入的复杂度代价,它的另一个作用是作为阈值,只有当分裂后的增益大于
γ
\gamma
γ时,才选择分裂,起到了预剪枝的作用。
上式用来评估切分后的增益,我们的目标是寻找一个特征及对应的值,使得切分后的损失减少得最大。具体流程如下图:
XGBoost在实际的应用过程中还增加了其它一些技巧,如
- 提前终止(Early Stopping)
通过观察模型在验证集上的错误率,如果它变化不大则可以提前结束训练,控制迭代轮数(即树的个数); - 收缩(Shrinkage)
从迭代的角度可以看成是学习率(learning rate),从集成的角度可以看成每棵树的权重 α \alpha α,它的大小经验上可以取0.1,它是对模型泛化性和训练时长的折中; - 抽样(Subsampling)
借鉴Bagging的思想,可以在每一轮树的构建中使用训练集中无放回抽样的样本,也可以对特征做抽样,模拟真实场景下的样本分布波动; - 参数放弃(Dropout)
模拟深度学习里随机放弃更新权重的方法,可以在每新增一棵树的时候拟合随机抽取的一些树的残差,相关方法可以参考:DART: Dropouts meet Multiple Additive Regression Trees
这里就不再赘述了。