Datawhale-集成学习Day6-XGBoost
1. 前置知识——泰勒公式
学过高等数学的话,我们就可以知道泰勒公式。这是一个很美妙的公式,其最大的贡献就是可以通过多项式来表示其他函数。也就是说,我们可以将一些不规则的函数转化为一个无限项的多项式。
带有Peano余项的泰勒公式:
f
(
x
)
=
f
(
x
0
)
+
f
‘
(
x
0
)
(
x
−
x
0
)
+
f
‘
‘
(
x
0
)
2
!
(
x
−
x
0
)
2
+
⋯
+
f
(
n
)
(
x
0
)
n
!
(
x
−
x
0
)
n
+
o
(
(
x
−
x
0
)
n
)
f(x)=f(x_0)+f^`(x_0)(x-x_0)+{{f^{``}(x_0)} \over {2!}}(x-x_0)^2 + \cdots + {{f^{(n)}(x_0)} \over {n!}}(x-x_0)^n+o((x-x_0)^n)
f(x)=f(x0)+f‘(x0)(x−x0)+2!f‘‘(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n+o((x−x0)n)
其中
o
(
(
x
−
x
0
)
n
)
o((x-x_0)^n)
o((x−x0)n)表示为
(
x
−
x
0
)
n
(x-x_0)^n
(x−x0)n的高阶无穷小。在一定情况下可以忽略。
带有拉格朗日余项的泰勒公式:
f
(
x
)
=
f
(
x
0
)
+
f
‘
(
x
0
)
(
x
−
x
0
)
+
f
‘
‘
(
x
0
)
2
!
(
x
−
x
0
)
2
+
⋯
+
f
(
n
)
(
x
0
)
n
!
(
x
−
x
0
)
n
+
R
n
(
x
)
f(x)=f(x_0)+f^`(x_0)(x-x_0)+{{f^{``}(x_0)} \over {2!}}(x-x_0)^2 + \cdots + {{f^{(n)}(x_0)} \over {n!}}(x-x_0)^n+R_n(x)
f(x)=f(x0)+f‘(x0)(x−x0)+2!f‘‘(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n+Rn(x)
其中:
R
n
(
x
)
=
f
(
n
+
1
)
(
ζ
)
(
n
+
1
)
!
(
x
−
x
0
)
n
+
1
R_n(x)={f^{(n+1)}(\zeta) \over (n+1)!}(x-x_0)^{n+1}
Rn(x)=(n+1)!f(n+1)(ζ)(x−x0)n+1
两者的区别:一般来说,我们想要研究函数的整体性质的时候可以使用Peano余项的泰勒公式,当我们想要研究函数的局部性质的时候我们可以选择使用带有拉格朗日余项的泰勒公式。
2. XGBoost
在前面的文章中,我们介绍了提升树和GBDT。但是在GBDT中,我们并没有说loss和punish项该如何设置。而在XGBoost中,陈天奇大佬设计了一种计算损失的方式。
首先,如果我们想要模型不仅对已知数据具有很好的训练效果,还想要模型有很好的泛化效果的话。我们就需要控制模型的复杂度。一般来说,过于复杂的模型,对已知数据的拟合效果效果很好,但是会造成过拟合。因此我们需要控制模型的复杂度,不仅需要很好的拟合效果,还不能造成过拟合。所以,我们将目标函数设置为:
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)
其中,前面一项是整个模型的损失,后面一项是惩罚项,用来控制模型的复杂度。
根据GBDT的思想,我们使用前向分布算法来优化模型。假设
T
1
⋯
T
n
−
1
T_1 \cdots T_{n-1}
T1⋯Tn−1棵树已经训练完毕。那么,我们在后面的训练中将不再训练这前n-1棵树。然后,第n棵树可以表示为:
f
n
(
x
)
=
f
n
−
1
(
x
)
+
T
n
(
x
;
θ
)
f_{n}(x) = f_{n-1}(x) + T_n(x; \theta)
fn(x)=fn−1(x)+Tn(x;θ)
因此:损失函数:
L
n
(
ϕ
)
=
∑
i
l
(
y
i
,
f
n
(
x
i
)
)
+
∑
t
n
Ω
(
T
t
)
=
∑
i
l
(
y
i
,
f
n
(
x
i
)
)
+
Ω
(
f
n
)
+
∑
t
n
−
1
Ω
(
T
t
)
=
∑
i
l
(
y
i
,
f
n
−
1
(
x
i
)
+
T
n
(
x
;
θ
)
)
+
Ω
(
T
n
)
+
∑
t
n
−
1
Ω
(
T
t
)
\mathcal{L}_n(\phi)=\sum_i l(y_i, f_n(x_i)) + \sum_t^n \Omega(T_t) \\ =\sum_i l(y_i, f_n(x_i)) + \Omega(f_n) + \sum_t^{n-1} \Omega(T_t) \\ =\sum_i l(y_i, f_{n-1}(x_i)+T_n(x; \theta)) + \Omega(T_n) + \sum_t^{n-1} \Omega(T_t)
Ln(ϕ)=i∑l(yi,fn(xi))+t∑nΩ(Tt)=i∑l(yi,fn(xi))+Ω(fn)+t∑n−1Ω(Tt)=i∑l(yi,fn−1(xi)+Tn(x;θ))+Ω(Tn)+t∑n−1Ω(Tt)
因为前n-1棵树已经训练完成,所以最后一项为常数,可以不用考虑。
对损失函数展开二阶泰勒:
L
n
≃
∑
i
=
1
[
l
(
y
i
,
f
n
−
1
(
x
i
)
)
+
g
i
T
n
(
x
i
)
+
1
2
h
i
T
n
2
(
x
i
)
]
+
Ω
(
T
n
)
\mathcal{L}_n \simeq \sum_{i=1}\left[l\left(y_{i}, f_{n-1}(xi)\right)+g_{i} T_{n}\left(\mathrm{x}_{i}\right)+\frac{1}{2} h_{i} T_{n}^{2}\left(\mathrm{x}_{i}\right)\right]+\Omega\left(T_{n}\right)
Ln≃i=1∑[l(yi,fn−1(xi))+giTn(xi)+21hiTn2(xi)]+Ω(Tn)
其中:
g
i
=
∂
l
(
y
i
,
f
n
−
1
(
x
i
)
)
∂
f
n
−
1
(
x
i
)
h
i
=
∂
2
l
(
y
i
,
f
n
−
1
(
x
i
)
)
∂
2
f
n
−
1
(
x
i
)
g_{i}={\partial \mathcal{l}(y_i, f_{n-1}(x_i)) \over \partial f_{n-1}(x_i)}\\ h_{i}={\partial^2 \mathcal{l}(y_i, f_{n-1}(x_i)) \over \partial^2 f_{n-1}(x_i)}
gi=∂fn−1(xi)∂l(yi,fn−1(xi))hi=∂2fn−1(xi)∂2l(yi,fn−1(xi))
而且,因为前n-1棵树已经确定,所以损失也是确定的。损失中的第一项,已为常数,因此也可以消去。
此时,剩余的就是:
L
n
=
∑
i
=
1
[
g
i
T
n
(
x
i
)
+
1
2
h
i
T
n
2
(
x
i
)
]
+
Ω
(
T
n
)
\mathcal{L}_n = \sum_{i=1}\left[g_{i} T_{n}\left(\mathrm{x}_{i}\right)+\frac{1}{2} h_{i} T_{n}^{2}\left(\mathrm{x}_{i}\right)\right]+\Omega\left(T_{n}\right)
Ln=i=1∑[giTn(xi)+21hiTn2(xi)]+Ω(Tn)
然后就是定义惩罚项,惩罚项表示的是模型的复杂度:
Ω
(
f
n
)
=
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
\Omega\left(f_{n}\right) = \gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2}
Ω(fn)=γT+21λj=1∑Twj2
其中,T是决策树的叶子节点的个数。KaTeX parse error: Undefined control sequence: \w at position 1: \̲w̲_j^2是叶子节点j的输出。
综合一下后:
L
n
=
∑
i
=
1
[
g
i
T
n
(
x
i
)
+
1
2
h
i
T
n
2
(
x
i
)
]
+
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
q
(
x
i
)
+
1
2
(
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
]
+
γ
T
\mathcal L_n = \sum_{i=1}\left[g_{i} T_{n}\left(\mathrm{x}_{i}\right)+\frac{1}{2} h_{i} T_{n}^{2}\left(\mathrm{x}_{i}\right)\right] + \gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} \\ = \sum_{j=1}^{T}[(\sum _{i \in I_j}g_i)w_{q(x_i)} + {1 \over 2}(\sum _{i \in I_j} h_i + \lambda)w_j^2] + \gamma T
Ln=i=1∑[giTn(xi)+21hiTn2(xi)]+γT+21λj=1∑Twj2=j=1∑T[(i∈Ij∑gi)wq(xi)+21(i∈Ij∑hi+λ)wj2]+γT
我们可以看出,这是一个关于
w
w
w的二次式。
然后,我们可以选用精确贪心算法,来选择分裂的节点。