XGBoost
XGBoost是大规模并行的boosting tree的工具,由陈天奇等人在2016年发布。
XGBoost是GBDT的工程实现,在解决问题的方法上有一定的差异,其最大的不同在于目标函数的定义。
首先,XGBoost的模型预测值还是:
y
^
i
=
∑
k
=
1
K
f
k
(
x
i
)
\hat{y}_i=\sum_{k=1}^{K}f_k(x_i)
y^i=∑k=1Kfk(xi)
损失函数表示为:
l
(
y
^
,
y
)
=
∑
i
l
(
y
^
i
,
y
i
)
l(\hat{y},y)=\sum_{i}l(\hat{y}_i,y_i)
l(y^,y)=∑il(y^i,yi)
注意,损失函数是指模型输出与真实值之间的偏差,目标函数有损失函数和正则化项组成,是最终的优化目标。
XGBoost中,模型的目标函数定义为:
L
(
ϕ
)
=
∑
i
l
(
y
^
i
,
y
i
)
+
∑
k
Ω
(
f
k
)
L(\phi)=\sum_{i}l(\hat{y}_i,y_i)+\sum_{k}\Omega(f_k)
L(ϕ)=∑il(y^i,yi)+∑kΩ(fk)
其中,
Ω
(
f
)
=
γ
T
+
1
2
λ
∣
∣
ω
∣
∣
2
\Omega(f)=\gamma{T}+\frac{1}{2}\lambda||\omega||^2
Ω(f)=γT+21λ∣∣ω∣∣2 是一个正则化项,主要作用是用来控制模型的复杂度,进而应该能够达到控制模型的方差的目的,后面我们会对这个正则化项进行详细介绍。
XGBoost是属于boosting家族的成员,让我们回到梯度提升树本身,先看XGBoost在第t轮模型得到的输出:
y
^
i
(
t
)
=
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
\hat{y}_i^{(t)}=\hat{y}_i^{(t-1)}+f_t(x_i)
y^i(t)=y^i(t−1)+ft(xi)
这里的
y
^
i
(
t
−
1
)
\hat{y}_i^{(t-1)}
y^i(t−1)在进行训练第t轮的模型
f
t
f_t
ft时是已经固定的,训练第t个基模型时的目标函数为:
L
(
t
)
=
∑
i
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
L^{(t)}=\sum_il(y_i,\hat{y}_i^{(t-1)}+f_t(x_i))+\Omega(f_t)
L(t)=∑il(yi,y^i(t−1)+ft(xi))+Ω(ft)------------(1)
XGBoost优化这个目标函数与Adaboost和GBDT都有一些不同,下面进行具体介绍,记住我们的目标,找到最优的
f
t
f_t
ft.
下面我们要对这个目标函数使用到二阶泰勒展式,这也是XGBoost在进行优化时与GBDT最大的不同之一 。首先我们先来回顾一下函数
f
(
x
)
f(x)
f(x)在
x
0
x_0
x0处的
n
n
n阶泰勒展式:
f
(
x
)
=
∑
i
=
0
n
f
(
i
)
(
x
0
)
i
!
(
x
−
x
0
)
i
)
+
R
n
(
x
)
f(x)=\sum_{i=0}^{n}\frac{f^{(i)}(x_0)}{i!}(x-x_0)^i)+R_n(x)
f(x)=∑i=0ni!f(i)(x0)(x−x0)i)+Rn(x)
f
(
x
+
Δ
x
)
f(x+\Delta{x})
f(x+Δx)在点
x
x
x处的二阶泰勒展开为:
f
(
x
+
Δ
x
)
=
f
(
x
)
+
f
′
(
x
)
Δ
x
+
1
2
f
′
′
(
x
)
Δ
x
2
f(x+\Delta{x})=f(x)+f^{'}(x)\Delta{x}+\frac{1}{2}f^{''}(x)\Delta{x}^2
f(x+Δx)=f(x)+f′(x)Δx+21f′′(x)Δx2
进一步,我们对上面的损失函数进行进行二阶泰勒展开:
L
(
t
)
≃
∑
i
=
1
n
[
l
(
y
i
,
y
^
i
(
t
−
1
)
)
+
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
∑
i
=
1
t
Ω
(
f
i
)
L^{(t)}\simeq\sum_{i=1}^{n}[l(y_i,\hat{y}_i^{(t-1)})+g_if_t(x_i)+\frac{1}{2}h_if_t^{2}(x_i)] +\sum_{i=1}^{t}\Omega(f_i)
L(t)≃∑i=1n[l(yi,y^i(t−1))+gift(xi)+21hift2(xi)]+∑i=1tΩ(fi) -----(2)
其中,
g
i
,
h
i
g_i, h_i
gi,hi 分别表示损失函数
l
(
y
i
,
y
^
i
(
t
−
1
)
l(y_i,\hat{y}_i^{(t-1)}
l(yi,y^i(t−1) 对
y
^
i
(
t
−
1
)
\hat{y}_i^{(t-1)}
y^i(t−1) 的一阶导数和二阶导数。并且要注意公式 (1) 和公式 (2) 中损失函数的区别,以回归问题中的平方损失函数为例:
l
(
y
i
,
y
^
i
(
t
−
1
)
)
=
∑
i
=
1
n
(
y
i
−
y
^
i
(
t
−
1
)
)
2
l(y_i,\hat{y}_i^{(t-1)})=\sum_{i=1}^{n}(y_i-\hat{y}_i^{(t-1)})^2
l(yi,y^i(t−1))=∑i=1n(yi−y^i(t−1))2
g
i
=
∂
(
y
i
−
y
^
i
(
t
−
1
)
)
2
∂
y
^
i
(
t
−
1
)
=
2
(
y
i
−
y
^
i
(
t
−
1
)
)
g_i=\frac{\partial(y_i-\hat{y}_i^{(t-1)})^2}{\partial\hat{y}_i^{(t-1)}}=2(y_i-\hat{y}_i^{(t-1)})
gi=∂y^i(t−1)∂(yi−y^i(t−1))2=2(yi−y^i(t−1))
h
i
=
∂
2
(
y
i
−
y
^
i
(
t
−
1
)
)
2
∂
(
y
^
i
(
t
−
1
)
)
2
=
2
h_i=\frac{\partial^2(y_i-\hat{y}_i^{(t-1)})^2}{\partial(\hat{y}_i^{(t-1)})^2}=2
hi=∂(y^i(t−1))2∂2(yi−y^i(t−1))2=2
因此,我们在进行第 t 轮迭代优化时,最重要的就是要求出目标函数对
y
^
i
(
t
−
1
)
\hat{y}_i^{(t-1)}
y^i(t−1) 的一阶和二阶偏导数
g
i
,
h
i
g_i, h_i
gi,hi。 并且第 t 轮迭代时,公式(2)中的
l
(
y
i
,
y
^
i
(
t
−
1
)
)
l(y_i,\hat{y}_i^{(t-1)})
l(yi,y^i(t−1))是一个常数,并不参与优化计算过程。
下面,我们再来看目标函数中的正则化项,XGBoost 相较于GBDT的一个不同就是XBGoost中显式的引入了这个正则化项用于控制模型的复杂度。具体的,这个正则化项表示为:
Ω
(
f
t
)
=
γ
T
+
1
2
λ
∑
j
=
1
T
W
j
2
\Omega(f_t)=\gamma{T}+\frac{1}{2}\lambda\sum_{j=1}^{T}W_j^2
Ω(ft)=γT+21λ∑j=1TWj2
其中,T是叶子节点的个数,代表了模型的复杂度,叶子个数越少,模型越简单。
我们用
q
(
x
)
q(x)
q(x)表示样本所在的节点,
w
(
q
)
w(q)
w(q)表示叶子节点的取值,
w
q
(
x
)
w_{q(x)}
wq(x)表示每个样本的取值(预测值),
I
j
I_j
Ij表示第j个叶子节点的样本集合。
进一步,我们将公式(2)表示为:
L
(
t
)
=
∑
i
=
1
n
(
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
)
+
Ω
(
f
t
)
L^{(t)}=\sum_{i=1}^{n}(g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i))+\Omega(f_t)
L(t)=∑i=1n(gift(xi)+21hift2(xi))+Ω(ft)--------(3)
=
∑
i
=
1
n
(
g
i
w
q
(
x
i
)
+
1
2
h
i
w
q
2
(
x
i
)
)
+
γ
T
+
1
2
λ
∑
j
=
1
T
W
j
2
=\sum_{i=1}^{n}(g_iw_q(x_i) + \frac{1}{2}h_iw_q^2(x_i))+\gamma{T}+\frac{1}{2}\lambda\sum_{j=1}^{T}W_j^2
=∑i=1n(giwq(xi)+21hiwq2(xi))+γT+21λ∑j=1TWj2 --------(4)
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
i
+
1
2
(
(
∑
i
∈
I
j
h
i
)
+
λ
)
w
j
2
]
+
γ
T
=\sum_{j=1}^{T}[(\sum_{i\in{I_j}}g_i)w_i+\frac{1}{2}((\sum_{i\in{I_j}}h_i)+\lambda)w_j^2]+\gamma{T}
=∑j=1T[(∑i∈Ijgi)wi+21((∑i∈Ijhi)+λ)wj2]+γT----------(5)
=
∑
j
=
1
T
[
G
j
w
i
+
1
2
(
H
j
+
λ
)
w
j
2
]
+
γ
T
=\sum_{j=1}^{T}[G_jw_i+\frac{1}{2}(H_j+\lambda)w_j^2]+\gamma{T}
=∑j=1T[Gjwi+21(Hj+λ)wj2]+γT-----------(6)
基于式(4)遍历所有样本后,求每个哎呀你根本的损失函数,与公式(5)中遍历每个叶子节点的样本并计算损失函数是等价的。
公式(6)中,
G
j
,
H
j
G_j, H_j
Gj,Hj 是前 t-1 步得到的结果,视为常数,只有最后一棵树的节点
w
j
w_j
wj是不确定的,那么将目标函数对
w
j
w_j
wj求一阶导数,即我们要优化更新的就是这个
w
j
w_j
wj。
∂
L
(
t
)
∂
w
j
=
∑
j
=
1
T
[
G
j
w
i
+
1
2
(
H
j
+
λ
)
w
j
2
]
=
0
\frac{\partial{L^{(t)}}}{\partial{w_j}}=\sum_{j=1}^{T}[G_jw_i+\frac{1}{2}(H_j+\lambda)w_j^2]=0
∂wj∂L(t)=∑j=1T[Gjwi+21(Hj+λ)wj2]=0
进一步可以得到:
w
j
∗
=
−
G
j
H
j
+
λ
w_j^{*}=-\frac{G_j}{H_j+\lambda}
wj∗=−Hj+λGj----------(7)
公式(7)代入到公式(6)中得到:
L
(
t
)
=
∑
j
=
1
T
[
G
j
−
G
j
H
j
+
λ
+
1
2
(
H
j
+
λ
−
G
j
2
(
H
j
+
λ
)
2
)
]
+
γ
T
L^{(t)}=\sum_{j=1}^{T}[G_j\frac{-G_j}{H_j+\lambda}+\frac{1}{2}(H_j+\lambda\frac{-G_j^2}{(H_j+\lambda)^2})]+\gamma T
L(t)=∑j=1T[GjHj+λ−Gj+21(Hj+λ(Hj+λ)2−Gj2)]+γT
∑
j
=
1
T
=
[
−
G
j
2
H
j
+
λ
+
1
2
−
G
j
2
H
j
+
λ
]
+
γ
T
\sum_{j=1}^{T}=[-\frac{G_j^2}{H_j+\lambda}+\frac{1}{2}\frac{-G_j^2}{H_j+\lambda}]+\gamma T
∑j=1T=[−Hj+λGj2+21Hj+λ−Gj2]+γT
=
−
1
2
∑
j
=
1
T
G
j
2
H
j
+
λ
+
γ
T
=-\frac{1}{2}\sum_{j=1}^{T}\frac{G_j^2}{H_j+\lambda}+\gamma T
=−21∑j=1THj+λGj2+γT
这就是XGBoost中我们最终要优化的目标函数,也就是第 t 棵树的评估标准。
LightGBM
LightGBM是一个轻量级的GBDT算法,相较于XGBoost具有训练速度更快,内存占用较低的优点,适合在一些数据量相对较小的场合。