结合参考文献和参考博客,对XGBoost的一点点浅显的理解,如有错误,请随时指证,谢谢!
论文题目:
《XGBoost: A Scalable Tree Boosting System》
提升树算法就是将不同的树做加法模型, 在GBDT里面,基本树模型是CART树:
y
i
^
=
ϕ
(
x
i
)
=
∑
k
=
1
K
f
k
(
x
i
)
\hat{y_{i}}=\phi(x_{i})=\sum_{k=1}^{K}f_{k}(x_{i})
yi^=ϕ(xi)=k=1∑Kfk(xi)
GBDT的损失函数:
L
(
t
)
=
∑
i
=
1
n
l
(
y
i
,
y
i
^
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
\mathcal{L}^{(t)}=\sum_{i=1}^{n}l(y_{i}, \hat{y_{i}}^{(t-1)}+f_{t}(x_{i})) + \Omega(f_{t})
L(t)=i=1∑nl(yi,yi^(t−1)+ft(xi))+Ω(ft)
其中,正则项:
Ω
(
f
)
=
γ
T
+
1
2
∣
∣
w
∣
∣
2
\Omega(f)=\gamma T + \frac{1}{2}{||w||}^{2}
Ω(f)=γT+21∣∣w∣∣2
就是在前面 t − 1 t-1 t−1棵树的基础上,增加一棵树,使得总损失函数最小。
f t ( x i ) f_t(x_{i}) ft(xi)是什么?它其实就是 f t f_t ft的某个叶子节点的值,叶子节点的值是可以作为模型的参数的。
CART树的另一番定义:
F
=
f
(
x
)
=
ω
q
(
x
)
(
q
:
R
m
→
T
,
ω
∈
R
T
)
\mathcal{F}={f(x)=\omega_{q}(x)}(q:\mathbb{R}^{m}\rightarrow T, \omega \in {\mathbb {R}^{T}})
F=f(x)=ωq(x)(q:Rm→T,ω∈RT)
这里操作
q
q
q将样本
x
x
x从
m
m
m维空间映射成树
f
f
f的
T
T
T个叶子节点中的一个,即代表了树的结构,因此
ω
q
(
x
)
\omega_{q}(x)
ωq(x)和
f
(
x
)
f(x)
f(x)一样都是某个叶子节点的值。
在XGBoost论文中,正则化项
Ω
(
f
t
)
\Omega(f_{t})
Ω(ft)的具体形式是:
Ω
(
f
t
)
=
γ
T
+
1
2
λ
∑
j
=
1
T
ω
j
2
\Omega(f_{t})=\gamma T + \frac{1}{2}\lambda\sum_{j=1}^{T}\omega_{j}^{2}
Ω(ft)=γT+21λj=1∑Tωj2
将上式做二阶泰勒展开
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
)
]
+
Ω
(
f
t
)
\mathcal{L}^{(t)}\approx\sum_{i=1}^{n}[l(y_{i}, \hat{y_{i}}^{(t-1)}) + g_{i}f_{t}(x_{i}) + \frac{1}{2}h_{i}f_{t}^{2}(x_{i})] + \Omega(f_{t})
L(t)≈i=1∑n[l(yi,yi^(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)
其中:
g
i
=
∂
y
i
(
t
−
1
)
^
l
(
y
i
,
y
i
^
)
g_{i} = \partial_{\hat{y_{i}(t-1)}}l(y_{i}, \hat{y_{i}})
gi=∂yi(t−1)^l(yi,yi^)
g i = ∂ y i ( t − 1 ) ^ 2 l ( y i , y i ^ ) g_{i} = \partial_{\hat{y_{i}(t-1)}}^{2}l(y_{i}, \hat{y_{i}}) gi=∂yi(t−1)^2l(yi,yi^)
要特别注意这里是损失函数对前 t − 1 t-1 t−1棵树的预测结果取偏导。
将泰勒展开得到的公式变型,得到:
L
(
t
)
≈
∑
j
=
1
T
∑
i
∈
I
j
[
g
i
ω
j
+
1
2
h
i
ω
j
]
+
γ
T
+
∑
j
=
1
T
1
2
λ
ω
j
2
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
j
+
1
2
(
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
)
]
+
γ
T
\mathcal{L}^{(t)}\approx\sum_{j=1}^{T}\sum_{i\in I_{j}}[g_{i}\omega_{j} + \frac{1}{2}h_{i}\omega_{j}] + \gamma T + \sum_{j=1}^{T}\frac{1}{2}\lambda\omega_{j}^{2}\\ =\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
L(t)≈j=1∑Ti∈Ij∑[giωj+21hiωj]+γT+j=1∑T21λωj2=j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2)]+γT
对于确定的树结构
q
q
q,最佳叶节点值和对应的优化值容易得出(求关于
w
j
w_{j}
wj的偏导数):
ω
j
∗
=
−
∑
i
∈
I
j
g
i
∑
i
∈
I
j
h
i
+
λ
\omega_{j}^{*}=-\frac{\sum_{i\in I_{j}}g_{i}}{\sum_{i\in I_{j}}h_{i}+\lambda}
ωj∗=−∑i∈Ijhi+λ∑i∈Ijgi
L ~ ( t ) ( q ) = − 1 2 ∑ j = 1 T ( ∑ i ∈ I j g i ) 2 ∑ i ∈ I j h i + λ {\tilde{\mathcal{L}}^{(t)}(q)}=-\frac{1}{2}\sum_{j=1}^{T}\frac{(\sum_{i\in I_{j}}g_{i})^{2}}{\sum_{i\in I{j}}h_{i}+\lambda} L~(t)(q)=−21j=1∑T∑i∈Ijhi+λ(∑i∈Ijgi)2
优化值的大小可以类似决策树树的纯度一样用来衡量树的结构好坏的标准。XGBoost是用一种从单叶子节点开始的不断计算分割目标值是否变小的贪心算法来确定最优树结构,具体来说就是从单也是节点开始,一层一层的通过目标值的变化确定结构的好坏,贪心地永远选取使目标值最小的分割结构。CART树的分割,目标值减少的评价函数是:
L
s
p
l
i
t
=
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}_{split}=\frac{1}{2}[\frac{(\sum_{i\in I_{L}}g_{i})^{2}}{\sum_{i\in I_{L}}h_{i} + \lambda} + \frac{(\sum_{i\in I_{R}}g_{i})^{2}}{\sum_{i\in I_{R}}h_{i} + \lambda}-\frac{(\sum_{i\in I}g_{i})^{2}}{\sum_{i\in I}h_{i} + \lambda}] - \gamma
Lsplit=21[∑i∈ILhi+λ(∑i∈ILgi)2+∑i∈IRhi+λ(∑i∈IRgi)2−∑i∈Ihi+λ(∑i∈Igi)2]−γ
γ
\gamma
γ是模型参数,它的值越大,代表对切分后模型的下降幅度要求越高。
XGBoost运用到的两种防止过拟合的方法:Shrinkage 和 Column Subsampling。Shrinkage方法就是在每次迭代中对树的每个叶子结点的分数乘上一个缩减权重 η \eta η,这可以使得每一棵树的影响力不会太大,留下更大的空间给后面生成的树去优化模型。Column Subsampling类似于随机森林中的选取部分特征进行建树。其可分为两种,一种是按层随机采样,在对同一层内每个结点分裂之前,先随机选择一部分特征,然后只需要遍历这部分的特征,来确定最优的分割点。另一种是随机选择特征,则建树前随机选择一部分特征然后分裂就只遍历这些特征。一般情况下前者效果更好。
参考博客: