XGBoost原理及其实战
XGBoost的思想
假设我们的数据集是 D = { ( x i , y i ) } ( ∣ D ∣ = n , x i ∈ R m , y i ∈ R ) \mathcal{D}=\left\{\left(\mathbf{x}_{i}, y_{i}\right)\right\}\left(|\mathcal{D}|=n, \mathbf{x}_{i} \in \mathbb{R}^{m}, y_{i} \in \mathbb{R}\right) D={(xi,yi)}(∣D∣=n,xi∈Rm,yi∈R)
STEP1:构造目标函数
假设有K棵树,则第i个样本的输出为
y
^
i
=
ϕ
(
x
i
)
=
∑
k
=
1
K
f
k
(
x
i
)
,
f
k
∈
F
\hat{y}_{i}=\phi\left(\mathrm{x}_{i}\right)=\sum_{k=1}^{K} f_{k}\left(\mathrm{x}_{i}\right), \quad f_{k} \in \mathcal{F}
y^i=ϕ(xi)=k=1∑Kfk(xi),fk∈F
其中,
F
=
{
f
(
x
)
=
w
q
(
x
)
}
(
q
:
R
m
→
T
,
w
∈
R
T
)
\mathcal{F}=\left\{f(\mathbf{x})=w_{q(\mathbf{x})}\right\}\left(q: \mathbb{R}^{m} \rightarrow T, w \in \mathbb{R}^{T}\right)
F={f(x)=wq(x)}(q:Rm→T,w∈RT)
因此,目标函数的构建为:
L
(
ϕ
)
=
∑
i
l
(
y
^
i
,
y
i
)
+
∑
k
Ω
(
f
k
)
\mathcal{L}(\phi)=\sum_{i} l\left(\hat{y}_{i}, y_{i}\right)+\sum_{k} \Omega\left(f_{k}\right)
L(ϕ)=i∑l(y^i,yi)+k∑Ω(fk)
其中, ∑ i l ( y ^ i , y i ) \sum_{i} l\left(\hat{y}_{i}, y_{i}\right) ∑il(y^i,yi)为loss function, ∑ k Ω ( f k ) \sum_{k} \Omega\left(f_{k}\right) ∑kΩ(fk)为正则化项。
STEP2: 迭代训练
我们给定初始解为 x i x_i xi, y ^ i ( 0 ) = 0 \hat{y}_i^{(0)} = 0 y^i(0)=0
则可以构造迭代序列为
y
^
i
(
K
)
=
y
^
i
(
K
−
1
)
+
f
K
(
x
i
)
\hat{y}_i^{(K)} = \hat{y}_i^{(K-1)} + f_K(x_i)
y^i(K)=y^i(K−1)+fK(xi)
其中,$ \hat{y}_i^{(K-1)} $ 为前K-1棵树的预测结果,$ f_K(x_i)$ 为第K棵树的预测结果。
将迭代序列代进目标函数得到
L
(
K
)
=
∑
i
=
1
n
l
(
y
^
i
(
K
−
1
)
+
f
K
(
x
i
)
,
y
i
)
+
∑
k
Ω
(
f
k
)
\mathcal{L}^{(K)}=\sum_{i=1}^{n} l\left( \hat{y}_{i}^{(K-1)}+f_{K}\left(\mathrm{x}_{i}\right) ,y_{i} \right)+\sum_{k} \Omega\left(f_{k}\right)
L(K)=i=1∑nl(y^i(K−1)+fK(xi),yi)+k∑Ω(fk)
注:一般的loss fuction 没有规定必须满足对称性,原教案这个地方的顺序要注意一下
同理,正则化项也可以写成迭代方程的形式
∑
k
Ω
(
f
k
)
=
∑
k
=
1
K
−
1
Ω
(
f
k
)
+
Ω
(
f
K
)
\sum_{k} \Omega\left(f_{k}\right) = \sum_{k=1} ^{K-1}\Omega\left(f_{k}\right)+\Omega\left(f_{K}\right)
k∑Ω(fk)=k=1∑K−1Ω(fk)+Ω(fK)
即 第
K
K
K棵树的复杂度是由前面的
K
−
1
K-1
K−1棵树累加再加上当前的复杂度得到的。
在模型构建到第K棵树的时候已经固定,无法改变,因此是一个已知的常数,可以在最优化的时候省去,故:
L
(
K
)
=
∑
i
=
1
n
l
(
y
^
i
(
K
−
1
)
+
f
K
(
x
i
)
,
y
i
)
+
Ω
(
f
K
)
\mathcal{L}^{(K)}=\sum_{i=1}^{n} l\left( \hat{y}_{i}^{(K-1)}+f_{K}\left(\mathrm{x}_{i}\right) ,y_{i} \right)+\Omega\left(f_{K}\right)
L(K)=i=1∑nl(y^i(K−1)+fK(xi),yi)+Ω(fK)
STEP3: 利用 T a y l o r Taylor Taylor展开近似loss function
我们对loss function对第
i
i
i个样本进行二阶泰勒展开,可以得到
l
(
y
i
,
y
^
i
(
K
−
1
)
+
f
K
(
x
i
)
)
l\left(y_{i}, \hat{y}_{i}^{(K-1)}+f_{K}\left(\mathrm{x}_{i}\right)\right)
l(yi,y^i(K−1)+fK(xi))
因为本质上loss function是个复合函数,所以一阶导数为
l
′
=
(
∂
y
^
(
K
−
1
)
l
(
y
i
,
y
^
(
t
−
1
)
)
)
f
K
(
x
i
)
l' = (\partial_{\hat{y}(K-1)} l\left(y_{i}, \hat{y}^{(t-1)}\right)) f_{K}\left(\mathrm{x}_{i}\right)
l′=(∂y^(K−1)l(yi,y^(t−1)))fK(xi)
本来应该有两项,但第一项
y
i
y_i
yi为标量,故导数为0.
二阶导数为
l
′
′
=
∂
2
l
(
y
i
,
y
^
(
K
−
1
)
)
∂
(
y
^
(
K
−
1
)
)
2
f
K
2
(
x
i
)
l'' =\frac{\partial^{2}l\left(y_{i}, \hat{y}^{(K-1)}\right)}{\partial {(\hat{y}^{(K-1)}})^2} f_{K}^{2} \left(\mathrm{x}_{i}\right)
l′′=∂(y^(K−1))2∂2l(yi,y^(K−1))fK2(xi)
所以,
L
(
K
)
≃
∑
i
=
1
n
[
l
(
y
i
,
y
^
(
K
−
1
)
)
+
g
i
f
K
(
x
i
)
+
1
2
h
i
f
K
2
(
x
i
)
]
+
Ω
(
f
K
)
\mathcal{L}^{(K)} \simeq \sum_{i=1}^{n}\left[l\left(y_{i}, \hat{y}^{(K-1)}\right)+g_{i} f_{K}\left(\mathrm{x}_{i}\right)+\frac{1}{2} h_{i} f_{K}^{2}\left(\mathrm{x}_{i}\right)\right]+\Omega\left(f_{K}\right)
L(K)≃i=1∑n[l(yi,y^(K−1))+gifK(xi)+21hifK2(xi)]+Ω(fK)
由于
∑
i
=
1
n
l
(
y
i
,
y
^
(
K
−
1
)
)
\sum_{i=1}^{n}l\left(y_{i}, \hat{y}^{(K-1)}\right)
∑i=1nl(yi,y^(K−1))在模型构建到第K棵树的时候已经固定,无法改变,因此是一个已知的常数,可以在最优化的时候省去,故:
L
~
(
K
)
=
∑
i
=
1
n
[
g
i
f
K
(
x
i
)
+
1
2
h
i
f
K
2
(
x
i
)
]
+
Ω
(
f
K
)
\tilde{\mathcal{L}}^{(K)}=\sum_{i=1}^{n}\left[g_{i} f_{K}\left(\mathbf{x}_{i}\right)+\frac{1}{2} h_{i} f_{K}^{2}\left(\mathbf{x}_{i}\right)\right]+\Omega\left(f_{K}\right)
L~(K)=i=1∑n[gifK(xi)+21hifK2(xi)]+Ω(fK)
STEP4:树的定义
由于模型复杂度
Ω
(
f
K
)
\Omega\left(f_{K}\right)
Ω(fK)
由叶子节点的个数以及节点函数值来构建,则:
Ω
(
f
K
)
=
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
\Omega\left(f_{K}\right) = \gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2}
Ω(fK)=γT+21λj=1∑Twj2
即这里采用
L
2
L_2
L2正则化,
T
T
T代表叶节点个数,
w
j
w_j
wj代表叶节点的预测值。第
K
K
K棵树的复杂度由叶节点个数和叶节点的预测值来衡量。叶节点越多树越复杂。
这里补充一下正则化的理论,参考文献为[机器学习中正则化项L1和L2的直观理解:https://blog.csdn.net/jinping_shi/article/details/52433975]
代入目标函数得到:
L
~
(
K
)
=
∑
i
=
1
n
[
g
i
f
K
(
x
i
)
+
1
2
h
i
f
K
2
(
x
i
)
]
+
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
j
+
1
2
(
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
]
+
γ
T
\begin{aligned} \tilde{\mathcal{L}}^{(K)} &=\sum_{i=1}^{n}\left[g_{i} f_{K}\left(\mathrm{x}_{i}\right)+\frac{1}{2} h_{i} f_{K}^{2}\left(\mathrm{x}_{i}\right)\right]+\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} \\ &=\sum_{j=1}^{T}\left[\left(\sum_{i \in I_{j}} g_{i}\right) w_{j}+\frac{1}{2}\left(\sum_{i \in I_{j}} h_{i}+\lambda\right) w_{j}^{2}\right]+\gamma T \end{aligned}
L~(K)=i=1∑n[gifK(xi)+21hifK2(xi)]+γT+21λj=1∑Twj2=j=1∑T⎣⎡⎝⎛i∈Ij∑gi⎠⎞wj+21⎝⎛i∈Ij∑hi+λ⎠⎞wj2⎦⎤+γT
由于我们的目标就是最小化目标函数,现在的目标函数化简为一个关于w的二次函数:
L
~
(
K
)
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
j
+
1
2
(
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
]
+
γ
T
\tilde{\mathcal{L}}^{(K)}=\sum_{j=1}^{T}\left[\left(\sum_{i \in I_{j}} g_{i}\right) w_{j}+\frac{1}{2}\left(\sum_{i \in I_{j}} h_{i}+\lambda\right) w_{j}^{2}\right]+\gamma T
L~(K)=∑j=1T[(∑i∈Ijgi)wj+21(∑i∈Ijhi+λ)wj2]+γT,根据二次函数求极值的公式:
y
=
a
x
2
b
x
c
y=ax^2 bx c
y=ax2bxc求极值,对称轴在
x
=
−
b
2
a
x=-\frac{b}{2 a}
x=−2ab,极值为
y
=
4
a
c
−
b
2
4
a
y=\frac{4 a c-b^{2}}{4 a}
y=4a4ac−b2,因此:
w
j
∗
=
−
∑
i
∈
I
j
g
i
∑
i
∈
I
j
h
i
+
λ
w_{j}^{*}=-\frac{\sum_{i \in I_{j}} g_{i}}{\sum_{i \in I_{j}} h_{i}+\lambda}
wj∗=−∑i∈Ijhi+λ∑i∈Ijgi
以及
L
~
(
K
)
(
q
)
=
−
1
2
∑
j
=
1
T
(
∑
i
∈
I
j
g
i
)
2
∑
i
∈
I
j
h
i
+
λ
+
γ
T
\tilde{\mathcal{L}}^{(K)}(q)=-\frac{1}{2} \sum_{j=1}^{T} \frac{\left(\sum_{i \in I_{j}} g_{i}\right)^{2}}{\sum_{i \in I_{j}} h_{i}+\lambda}+\gamma T
L~(K)(q)=−21j=1∑T∑i∈Ijhi+λ(∑i∈Ijgi)2+γT
STEP5:使用目标函数的变化来作为分裂节点的标准
分割节点的标准为
m
a
x
{
L
~
(
o
l
d
)
−
L
~
(
n
e
w
)
}
max\{\tilde{\mathcal{L}}^{(old)} - \tilde{\mathcal{L}}^{(new)} \}
max{L~(old)−L~(new)},即:
L
split
=
1
2
[
(
∑
i
∈
I
L
g
i
)
2
∑
i
∈
I
L
h
i
+
λ
+
(
∑
i
∈
I
R
g
i
)
2
∑
i
∈
I
R
h
i
+
λ
−
(
∑
i
∈
I
g
i
)
2
∑
i
∈
I
h
i
+
λ
]
−
γ
\mathcal{L}_{\text {split }}=\frac{1}{2}\left[\frac{\left(\sum_{i \in I_{L}} g_{i}\right)^{2}}{\sum_{i \in I_{L}} h_{i}+\lambda}+\frac{\left(\sum_{i \in I_{R}} g_{i}\right)^{2}}{\sum_{i \in I_{R}} h_{i}+\lambda}-\frac{\left(\sum_{i \in I} g_{i}\right)^{2}}{\sum_{i \in I} h_{i}+\lambda}\right]-\gamma
Lsplit =21[∑i∈ILhi+λ(∑i∈ILgi)2+∑i∈IRhi+λ(∑i∈IRgi)2−∑i∈Ihi+λ(∑i∈Igi)2]−γ
LightGBM
LightGBM是一款基于GBDT(梯度提升决策树)算法的分布式梯度提升框架,为了满足缩短模型计算时间的需求,LightGBM的设计思路主要集中在减小数据对内存与计算性能的使用,以及减少多机器并行计算时的通讯代价。
LightGBM可以看作是XGBoost的升级豪华版,在获得与XGBoost近似精度的同时,又提供了更快的训练速度与更少的内存消耗。正如其名字中的Light所蕴含的那样,LightGBM在大规模数据集上跑起来更加优雅轻盈。
LightGBM的主要优点:
- 简单易用。提供了主流的Python\C++\R语言接口,用户可以轻松使用LightGBM建模并获得相当不错的效果。
- 高效可扩展。在处理大规模数据集时高效迅速、高准确度,对内存等硬件资源要求不高。
- 鲁棒性强。相较于深度学习模型不需要精细调参便能取得近似的效果。
- LightGBM直接支持缺失值与类别特征,无需对数据额外进行特殊处理
LightGBM的主要缺点:
- 相对于深度学习模型无法对时空位置建模,不能很好地捕获图像、语音、文本等高维数据。
- 在拥有海量训练数据,并能找到合适的深度学习模型时,深度学习的精度可以遥遥领先LightGBM。