导读:
XGBoost被认为是各类赛事排名第一的算法
Ensenble是集成算法,分为两类:bagging和boosting
bagging:每个人都是专家(List of experts),容易过拟合;把多个拼接到一起,降低方差,即模型的稳定性
boosting:每个人都是普通人(List of weak learners),容易欠拟合
XGBoost
1.优势:
- 速度和表现可以超过大部分机器学习模型;
- 可以并行化计算
- 有大量可调节参数,例如 γ \gamma γ, λ \lambda λ
2.学习路径:
- 如何构造目标函数(Objective function)
- 如何近似目标函数(Objective function,优化,求最小/最大值)
- 如何引入树到目标函数,改造目标函数
- 如何使用贪心算法构造树
其中 从1到2使用了泰勒展开式
1.构造目标函数
假设有
K
K
K棵树:
y
i
^
=
∑
k
=
1
K
f
k
(
x
i
)
,
f
k
∈
F
(1)
\hat{y_{i}} = \sum_{k=1}^{K}f_{k}(x_{i}), f_{k} \in \mathcal{F} \tag{1}
yi^=k=1∑Kfk(xi),fk∈F(1)
目标函数:
O
b
j
=
∑
i
=
1
n
l
(
y
i
,
y
i
^
)
+
∑
k
=
1
K
Ω
(
f
k
)
(2)
Obj = \sum_{i=1}^{n}l(y_{i},\hat{y_{i}})+ \sum_{k=1}^{K}\Omega(f_{k}) \tag{2}
Obj=i=1∑nl(yi,yi^)+k=1∑KΩ(fk)(2)
Additive Training
- 第零个树的预测值: y i ^ ( 0 ) = 0 \hat{y_{i}}^{(0)} = 0 yi^(0)=0 ---------base case
- 第一个树的预测值: y i ^ ( 1 ) = f 1 ( x i ) = y i ^ ( 0 ) + f 1 ( x i ) \hat{y_{i}}^{(1)} = f_{1}(x_{i}) = \hat{y_{i}}^{(0)} + f_{1}(x_{i}) yi^(1)=f1(xi)=yi^(0)+f1(xi)
- 第二个树的预测值: y i ^ ( 2 ) = f 1 ( x i ) + f 2 ( x i ) = y i ^ ( 1 ) + f 2 ( x i ) \hat{y_{i}}^{(2)} = f_{1}(x_{i}) + f_{2}(x_{i}) = \hat{y_{i}}^{(1)} + f_{2}(x_{i}) yi^(2)=f1(xi)+f2(xi)=yi^(1)+f2(xi)
- 第三个树的预测值:
y
i
^
(
3
)
=
f
1
(
x
i
)
+
f
2
(
x
i
)
+
f
3
(
x
i
)
=
y
i
^
(
2
)
+
f
3
(
x
i
)
\hat{y_{i}}^{(3)} = f_{1}(x_{i}) + f_{2}(x_{i}) + f_{3}(x_{i}) = \hat{y_{i}}^{(2)} + f_{3}(x_{i})
yi^(3)=f1(xi)+f2(xi)+f3(xi)=yi^(2)+f3(xi)
…… - 第t个树的预测值: y i ^ ( t ) = ∑ k = 1 t f k ( x i ) = y i ^ ( t − 1 ) + f t ( x i ) \hat{y_{i}}^{(t)} = \sum_{k=1}^{t}f_{k}(x_{i}) = \hat{y_{i}}^{(t-1)} + f_{t}(x_{i}) yi^(t)=∑k=1tfk(xi)=yi^(t−1)+ft(xi)
训练第i棵树时,例如第2棵树 f 2 ( x i ) f_{2}(x_{i}) f2(xi),要拟合残差,即真实值和已有的预测之差: y i − y 1 ^ ( 1 ) y_{i} - \hat{y_{1}}^{(1)} yi−y1^(1)。
下面就是构造目标函数:
第
t
t
t轮的预测值为:
y
t
^
(
t
)
=
y
t
^
(
t
−
1
)
+
f
t
(
x
i
)
\hat{y_{t}}^{(t)} = \hat{y_{t}}^{(t-1)} + f_{t}(x_i)
yt^(t)=yt^(t−1)+ft(xi),其中
y
t
^
(
t
−
1
)
\hat{y_{t}}^{(t-1)}
yt^(t−1)为从第1…t-1棵树的预测结果,要训练第t棵树
f
t
(
x
i
)
f_{t}(x_i)
ft(xi)使得最终总的预测值
y
t
^
(
t
)
\hat{y_{t}}^{(t)}
yt^(t)与真实值
y
i
y_{i}
yi之间的差距要尽可能的小。故我们可以根据这一点构造目标函数。
目标函数
O
b
j
Obj
Obj
O
b
j
(
t
)
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
)
)
+
∑
i
=
1
t
Ω
(
f
i
)
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
−
f
t
(
x
i
)
)
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
(3)
Obj^{(t)} = \sum_{i=1}^{n}l(y_{i},\hat{y}_{i}^{(t)}) + \sum_{i=1}^{t} \Omega(f_{i}) \\ = \sum_{i=1}^{n}l(y_{i},\hat{y}_{i}^{(t-1)} - f_{t}(x_i)) + \Omega(f_{t}) + constant \tag{3}
Obj(t)=i=1∑nl(yi,y^i(t))+i=1∑tΩ(fi)=i=1∑nl(yi,y^i(t−1)−ft(xi))+Ω(ft)+constant(3)
第二项为每棵树的复杂度,即
∑
i
=
1
t
Ω
(
f
i
)
=
Ω
1
+
Ω
2
+
⋯
+
Ω
t
\sum_{i=1}^{t} \Omega(f_{i}) = \Omega_{1} + \Omega_{2} + \dots + \Omega_{t}
∑i=1tΩ(fi)=Ω1+Ω2+⋯+Ωt,其中前t-1棵树的复杂度已知,故可以看作常数,提出来。另外把
t
t
t时刻的预测值
y
t
^
(
t
)
\hat{y_{t}}^{(t)}
yt^(t)的表达式代入上式,并考虑平方误差损失函数(Square Loss),
l
l
l变为:
O
b
j
(
t
)
=
∑
i
=
1
n
(
y
i
−
(
y
^
i
(
t
−
1
)
−
f
t
(
x
i
)
)
)
2
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
(4)
Obj^{(t)} = \sum_{i=1}^{n}\left(y_{i}-(\hat{y}_{i}^{(t-1)} - f_{t}(x_i))\right)^{2} + \Omega(f_{t}) + constant \tag{4}
Obj(t)=i=1∑n(yi−(y^i(t−1)−ft(xi)))2+Ω(ft)+constant(4)
把所有不含
f
t
(
x
i
)
f_{t}(x_i)
ft(xi)的项(因为都是已知项,例如
y
i
2
y_{i}^{2}
yi2、
−
2
y
i
y
^
i
(
t
−
1
)
-2y_{i}\hat{y}_{i}^{(t-1)}
−2yiy^i(t−1)等等)都提出来,放到
c
o
n
s
t
a
n
t
constant
constant里,得:
O
b
j
(
t
)
=
∑
i
=
1
n
[
2
(
y
^
i
(
t
−
1
)
−
y
i
)
f
t
(
x
i
)
+
f
t
(
x
i
)
2
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
(5)
Obj^{(t)} = \sum_{i=1}^{n}\left[2(\hat{y}_{i}^{(t-1)} - y_{i})f_{t}(x_i)+f_{t}(x_i)^{2}\right] + \Omega(f_{t}) + constant \tag{5}
Obj(t)=i=1∑n[2(y^i(t−1)−yi)ft(xi)+ft(xi)2]+Ω(ft)+constant(5)
目标是最小化真实值
y
i
y_{i}
yi和前
t
t
t棵树的预测
y
^
i
(
t
)
\hat{y}_{i}^{(t)}
y^i(t)之差,
(
5
)
(5)
(5)式只是演示一下当是回归问题时应该怎么变换,下面还是回到最开始的
(
3
)
(3)
(3)式。
2.近似目标函数
利用泰勒展开式:
f
(
x
+
Δ
x
)
=
f
(
x
)
+
f
′
(
x
)
Δ
x
+
1
2
f
′
′
(
x
)
Δ
x
2
+
⋯
f(x+\Delta x) = f(x) + f^{\prime}(x)\Delta x + \frac{1}{2}f^{\prime\prime}(x)\Delta x^{2} + \cdots
f(x+Δx)=f(x)+f′(x)Δx+21f′′(x)Δx2+⋯
回到最开始的例子,即
(
3
)
(3)
(3)式:
O
b
j
(
t
)
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
Obj^{(t)} = \sum_{i=1}^{n}l(y_{i},\hat{y}_{i}^{(t-1)} + f_{t}(x_i)) + \Omega(f_{t}) + constant
Obj(t)=i=1∑nl(yi,y^i(t−1)+ft(xi))+Ω(ft)+constant
把
l
(
y
i
,
y
^
i
(
t
−
1
)
)
l(y_{i},\hat{y}_{i}^{(t-1)} )
l(yi,y^i(t−1))看做
f
(
x
)
f(x)
f(x),
f
t
(
x
i
)
f_{t}(x_i)
ft(xi)看做
Δ
x
\Delta x
Δx,上式利用泰勒展开为:
O
b
j
(
t
)
=
∑
i
=
1
n
[
l
(
y
i
,
y
^
i
(
t
−
1
)
)
+
∂
y
^
(
t
−
1
)
l
(
y
i
,
y
^
i
(
t
−
1
)
)
f
t
(
x
i
)
+
1
2
∂
y
^
(
t
−
1
)
2
l
(
y
i
,
y
^
i
(
t
−
1
)
)
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
(6)
Obj^{(t)} = \sum_{i=1}^{n} \left[ l(y_{i},\hat{y}_{i}^{(t-1)}) + \partial_{\hat{y}^{(t-1)}}l(y_{i},\hat{y}_{i}^{(t-1)}) f_{t}(x_i) + \frac{1}{2}\partial_{\hat{y}^{(t-1)}}^{2}l(y_{i},\hat{y}_{i}^{(t-1)}) f_{t}^{2}(x_i) \right] + \Omega(f_{t}) + constant \tag{6}
Obj(t)=i=1∑n[l(yi,y^i(t−1))+∂y^(t−1)l(yi,y^i(t−1))ft(xi)+21∂y^(t−1)2l(yi,y^i(t−1))ft2(xi)]+Ω(ft)+constant(6)
若把
∂
y
^
i
(
t
−
1
)
l
(
y
i
,
y
^
i
(
t
−
1
)
)
\partial_{\hat{y}_i^{(t-1)}} l(y_i,\hat{y}_i^{(t-1)})
∂y^i(t−1)l(yi,y^i(t−1))看作
g
i
g_i
gi,把
∂
y
^
i
(
t
−
1
)
2
l
(
y
i
,
y
^
i
(
t
−
1
)
)
\partial_{\hat{y}_i^{(t-1)}}^2 l(y_i,\hat{y}_i^{(t-1)})
∂y^i(t−1)2l(yi,y^i(t−1))看作
h
i
h_i
hi,并把常数项放到constant里,上式变为
O
b
j
(
t
)
≃
∑
i
=
1
n
[
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
(7)
Obj^{(t)} \simeq \sum_{i=1}^{n} [g_if_t(x_i) + \tfrac{1}{2}h_if_t^2(x_i)] + \Omega(f_t) + constant \tag{7}
Obj(t)≃i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)+constant(7)
下面推导如何表达树的复杂度
Ω
(
f
t
)
\Omega(f_{t})
Ω(ft)
3.如何引入树到目标函数,改造目标函数
重新定义一棵树,采用结果导向,
f
t
(
x
)
=
ω
q
(
x
)
,
ω
∈
R
T
,
q
:
R
d
→
{
1
,
2
,
.
.
.
,
T
}
f_{t}(x) = \omega_{q(x)},\omega \in R^{T}, q: R^{d} \rightarrow \{1,2,...,T\}
ft(x)=ωq(x),ω∈RT,q:Rd→{1,2,...,T}
输入的x是一个object,可能是boy,可能是gril,也可能是old man,函数q返回的是一个index,例如下图,输入x=boy,q(boy) = 1,即男孩的下标是1,男孩输入第一个叶子节点。q(gril) = 2,即女孩的下标是2,女孩输入第二个叶子节点,而
ω
\omega
ω返回的是预测值。故
ω
\omega
ω和
q
q
q是需要学出来的。
一共有以下几个参数需要学习:
1.参数T,即T个叶子节点;
2.
ω
\omega
ω,针对每个叶子节点的预测值,一个T维的向量;
3.
q
q
q,给定一个object,返回一个index
下面要针对每棵树,找到3个参数的最优值。
树的复杂度
Ω
(
f
t
)
=
γ
T
+
1
2
∑
j
=
1
T
ω
j
2
\Omega(f_{t}) = \gamma T + \frac{1}{2}\sum_{j=1}^{T} \omega_{j}^{2}
Ω(ft)=γT+21j=1∑Tωj2
上式中第一项为叶子节点的个数,
γ
\gamma
γ为此项权重,第二项为L2的正则,
λ
\lambda
λ为此项权重,两项相加为该树的复杂度,希望复杂度是越小越好。
如上图所示,计算该树的复杂度
Ω
\Omega
Ω,此时T=3,因为是3个叶子节点,叶子节点1的得分
ω
\omega
ω是+2,平方是4;叶子节点2的得分
ω
\omega
ω是0.1,平方是0.01,叶子节点3的得分
ω
\omega
ω是-1,平方是1,将它们3个加起来,得到该树的复杂度
4.使用贪心算法构造树
回到最开始的目标函数,
(
7
)
(7)
(7)式
O
b
j
(
t
)
≃
∑
i
=
1
n
[
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
(7)
Obj^{(t)} \simeq \sum_{i=1}^{n} [g_if_t(x_i) + \tfrac{1}{2}h_if_t^2(x_i)] + \Omega(f_t) + constant \tag{7}
Obj(t)≃i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)+constant(7)
其中
g
i
=
∂
y
^
i
(
t
−
1
)
l
(
y
i
,
y
^
i
(
t
−
1
)
)
g_{i} = \partial_{\hat{y}_i^{(t-1)}} l(y_i,\hat{y}_i^{(t-1)})
gi=∂y^i(t−1)l(yi,y^i(t−1)),
h
i
=
∂
y
^
i
(
t
−
1
)
2
l
(
y
i
,
y
^
i
(
t
−
1
)
)
h_{i} = \partial_{\hat{y}_i^{(t-1)}}^2 l(y_i,\hat{y}_i^{(t-1)})
hi=∂y^i(t−1)2l(yi,y^i(t−1)),分别代表一阶导数和二阶导数。
把
(
7
)
(7)
(7)式做如下变换,见下图所示
换一种定义的方式,按每个叶子节点中的元素集合可以定义为
I
j
=
{
i
∣
q
(
x
i
)
=
j
}
I_{j} = \{i|q(x_{i}) = j\}
Ij={i∣q(xi)=j},即把同一个叶子节点中的元素放到一起,例如
I
1
=
{
1
,
3
}
I_{1} = \{1,3\}
I1={1,3},
I
2
=
{
2
,
5
,
6
}
I_{2} = \{2,5,6\}
I2={2,5,6},
I
3
=
{
7
}
I_{3} = \{7\}
I3={7},
I
4
=
{
4
,
8
}
I_{4} = \{4,8\}
I4={4,8}
O
b
j
(
t
)
≃
∑
i
=
1
n
[
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
=
∑
i
=
1
n
[
g
i
ω
q
(
x
)
+
1
2
h
i
ω
q
(
x
)
2
]
+
γ
T
+
1
2
λ
∑
j
=
1
T
ω
j
2
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
ω
j
+
1
2
(
∑
i
∈
I
j
h
i
+
λ
)
ω
j
2
]
+
γ
T
(8)
Obj^{(t)} \simeq \sum_{i=1}^{n} \left[g_if_t(x_i) + \tfrac{1}{2}h_if_t^2(x_i) \right] + \Omega(f_t) \\ = \sum_{i=1}^{n} \left[g_i\omega_{q(x)} + \tfrac{1}{2}h_i \omega_{q(x)}^2 \right] + \gamma T + \frac{1}{2} \lambda \sum_{j = 1}^T \omega_j^2 \\ = \sum_{j=1}^{T} \left[(\sum_{i\in I_j}g_i)\omega_{j} + \tfrac{1}{2}(\sum_{i\in I_j}h_i + \lambda)\omega_{j}^2 \right] + \gamma T \tag{8}
Obj(t)≃i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)=i=1∑n[giωq(x)+21hiωq(x)2]+γT+21λj=1∑Tωj2=j=1∑T⎣⎡(i∈Ij∑gi)ωj+21(i∈Ij∑hi+λ)ωj2⎦⎤+γT(8)
通过第二个等号可以看出,原来是按每个样本累加的,现在先处理一个节点中的元素,再进行相加。即上式为按每个独立的叶子节点相加的二次方程。
5.求解新的目标函数
目标函数变成了二次方优化问题,此时由公式可得
a
r
g
m
i
n
x
G
x
+
1
2
H
x
2
=
x
=
−
b
2
a
−
G
H
,
m
i
n
x
G
x
+
1
2
H
x
2
=
−
1
2
G
2
H
argmin_{x} Gx+\dfrac{1}{2}Hx^2 \xlongequal{x=-\frac{b}{2a}} -\frac{G}{H},min_x \ Gx+\dfrac{1}{2}Hx^2=-\dfrac{1}{2}\dfrac{G^2}{H}
argminxGx+21Hx2x=−2ab−HG,minx Gx+21Hx2=−21HG2
其中
a
r
g
m
i
n
x
argmin_{x}
argminx表示当式子取值最小时此时的自变量x的取值,由二次方程求最小值公式可知,当
x
=
−
b
2
a
x = -\frac{b}{2a}
x=−2ab时,此时式子有最小值。
定义
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,
(
8
)
(8)
(8)式变为:
=
∑
j
=
1
T
[
G
j
ω
j
+
1
2
(
H
j
+
λ
)
ω
j
2
]
+
γ
T
= \sum_{j=1}^{T} \left[G_j\omega_{j} + \tfrac{1}{2}(H_j + \lambda)\omega_{j}^2 \right] + \gamma T
=j=1∑T[Gjωj+21(Hj+λ)ωj2]+γT
故最好的
ω
j
⋆
\omega_{j}^\star
ωj⋆和对应的损失函数值为:
ω
j
⋆
=
−
G
j
H
j
+
λ
O
b
j
=
−
1
2
∑
j
=
1
T
G
j
2
H
j
+
λ
+
γ
T
(9)
\omega_{j}^\star = -\dfrac{G_j}{H_j + \lambda}\quad Obj = -\dfrac{1}{2}\sum_{j = 1}^T \dfrac{G_{j}^2}{H_j + \lambda} + \gamma T \tag{9}
ωj⋆=−Hj+λGjObj=−21j=1∑THj+λGj2+γT(9)
6.叶子节点分裂方式
节点分裂的依据就可以参照上面的目标函数最终形式,来求分裂前后相差最大的特征,即最大化下式:
G
a
i
n
=
1
2
[
G
L
2
H
L
+
λ
+
G
R
2
H
R
+
λ
−
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
]
−
γ
Gain = \dfrac{1}{2}[\dfrac{G_{L}^2}{H_L + \lambda} + \dfrac{G_{R}^2}{H_R + \lambda} - \dfrac{(G_L + G_R)^2}{H_L + H_R + \lambda}] - \gamma
Gain=21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ