1. Main Work
1.1Tree Boosting with Loss function
假设给定一个数据集
D
D
D中有
n
n
n个样本,每个样本有
m
m
m维特征,通过训练数据集
D
D
D,我们得到
k
k
k棵树。这
k
k
k棵树累加的值就是我们的预测值。
y
^
i
=
∑
k
=
1
k
f
k
(
x
i
)
f
k
∈
F
\widehat{y}_i=\sum_{k=1}^kf_k(x_i)\qquad f_k\in\mathcal{F}
y
i=k=1∑kfk(xi)fk∈F
其中
f
k
(
x
i
)
f_k(x_i)
fk(xi)表示第
k
k
k棵树预测
x
i
x_i
xi,
F
\mathcal{F}
F表示树的集合
目标函数:
o
b
j
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
)
+
∑
k
=
1
k
Ω
(
f
k
)
obj=\sum_{i=1}^nl(y_i,\widehat{y}_i)+\sum_{k=1}^k\Omega(f_k)
obj=i=1∑nl(yi,y
i)+k=1∑kΩ(fk)
l
(
y
i
,
y
^
i
)
l(y_i,\widehat{y}_i)
l(yi,y
i)是损失函数,根据具体的问题,损失函数可以做不同的设定,回归是MSE,分类是交叉熵。
Ω
(
f
k
)
\Omega(f_k)
Ω(fk)是树的复杂度,也是正则项,减少过拟合。
Ω
(
f
k
)
=
γ
T
+
λ
∑
i
=
1
T
w
j
2
\Omega(f_k)=\gamma T+ \lambda\sum_{i=1}^Tw_j^2
Ω(fk)=γT+λi=1∑Twj2
T
T
T表示叶节点的个数,
w
j
2
w_j^2
wj2表示叶节点的值。
1.2Gradient Tree Boosting
对于损失函数我们可以将它预测值展开层
k
k
k棵树的预测值叠加的形式,在
t
t
t次迭代中,我们可以将树展开成:
y
i
=
∑
k
=
1
t
f
k
(
x
i
)
=
f
1
(
x
i
)
+
f
2
(
x
i
)
+
.
.
.
+
f
t
−
1
(
x
i
)
+
f
t
(
x
i
)
y_i=\sum_{k=1}^tf_k(x_i)=f_1(x_i)+f_2(x_i)+...+f_{t-1}(x_i)+f_t(x_i)
yi=k=1∑tfk(xi)=f1(xi)+f2(xi)+...+ft−1(xi)+ft(xi)
但我们训练第
k
k
k棵树的时候
o
b
j
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
k
−
1
)
+
f
k
(
x
i
)
)
+
∑
i
=
1
k
−
1
Ω
(
f
i
)
+
Ω
(
f
k
)
obj=\sum_{i=1}^nl(y_i,\widehat{y}_i^{(k-1)}+f_k(x_i))+\sum_{i=1}^{k-1}\Omega(f_i)+\Omega(f_k)
obj=i=1∑nl(yi,y
i(k−1)+fk(xi))+i=1∑k−1Ω(fi)+Ω(fk)
去除已知项,则
o
b
j
obj
obj:
o
b
j
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
k
−
1
)
+
f
k
(
x
i
)
)
+
Ω
(
f
k
)
obj=\sum_{i=1}^nl(y_i,\widehat{y}_i^{(k-1)}+f_k(x_i))+\Omega(f_k)
obj=i=1∑nl(yi,y
i(k−1)+fk(xi))+Ω(fk)
对上式进行二阶泰勒展开得到如下近似目标函数:
o
b
j
k
≈
∑
i
=
1
n
[
l
(
y
i
,
y
^
i
(
k
−
1
)
)
+
∂
y
^
(
k
−
1
)
l
(
y
i
,
y
^
i
(
k
−
1
)
)
f
k
(
x
i
)
+
1
2
∂
y
^
(
k
−
1
)
2
l
(
y
i
,
y
^
i
(
k
−
1
)
)
f
k
2
(
x
i
)
]
+
Ω
(
f
k
)
=
∑
i
=
1
n
[
l
(
y
i
,
y
^
i
(
k
−
1
)
)
+
g
i
f
k
(
x
i
)
+
1
2
h
i
f
k
2
(
x
i
)
]
+
Ω
(
f
k
)
obj_k \approx \sum_{i=1}^n[l(y_i, \widehat{y}_i^{(k-1)})+\partial_{\widehat{y}^{(k-1)}}l(y_i, \widehat{y}_i^{(k-1)})f_k(x_i)+\frac{1}{2}\partial_{\widehat{y}^{(k-1)}}^2l(y_i, \widehat{y}_i^{(k-1)})f_k^2(x_i)]+\Omega(f_k) \\ = \sum_{i=1}^n[l(y_i, \widehat{y}_i^{(k-1)})+g_if_k(x_i)+\frac{1}{2}h_if_k^2(x_i)]+\Omega(f_k)
objk≈i=1∑n[l(yi,y
i(k−1))+∂y
(k−1)l(yi,y
i(k−1))fk(xi)+21∂y
(k−1)2l(yi,y
i(k−1))fk2(xi)]+Ω(fk)=i=1∑n[l(yi,y
i(k−1))+gifk(xi)+21hifk2(xi)]+Ω(fk)
当前模型已知,也就是当前模型对训练数据的误差已知,为常量,对目标函数的优化没有影响,移除得到如下的目标函数:
o
b
j
k
=
∑
i
=
1
n
[
g
i
f
k
(
x
i
)
+
1
2
h
i
f
k
2
(
x
i
)
]
+
γ
T
+
λ
∑
i
=
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
obj_k = \sum_{i=1}^n[g_if_k(x_i)+\frac{1}{2}h_if_k^2(x_i)]+\gamma T+ \lambda\sum_{i=1}^Tw_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
objk=i=1∑n[gifk(xi)+21hifk2(xi)]+γT+λi=1∑Twj2=j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2]+γT
对
w
j
w_j
wj这个二元一次函数取最小值,所以:
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
o
b
j
∗
=
−
1
2
∑
j
=
1
T
(
∑
i
∈
I
j
g
i
)
2
∑
i
∈
I
j
h
i
+
λ
+
γ
T
obj^*=-\frac{1}{2} \sum_{j=1}^T \frac{ (\sum_{i \in I_j}g_i)^2}{\sum_{i \in I_j}h_i+\lambda}+\gamma T
obj∗=−21j=1∑T∑i∈Ijhi+λ(∑i∈Ijgi)2+γT
此时已知一棵树的形状的时候,就能够求出这棵树对应的
w
j
w_j
wj和
o
b
j
k
obj_k
objk,一个方法是把所有可能的树的形状全列出来,分别计算
o
b
j
k
(
i
)
obj_k^{(i)}
objk(i)。选择最小的那个
o
b
j
k
obj_k
objk返回对应的树形状。但是这么做存在一个问题,就是随着数据的增大,确定树的个数是指数级上升的,存在巨大的计算量。所以文章下面的部分就是考虑如何分裂树结构。选择合适的feature作为分割点,将数据分割到两边,用
o
b
j
k
o
l
d
−
o
b
j
k
n
e
w
obj_k^{old}-obj_k^{new}
objkold−objknew的最大值的那个特征作为split的条件:
O
b
j
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
+
λ
]
−
γ
Obj_{split}=\frac{1}{2}\bigg[\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}\bigg]-\gamma
Objsplit=21[∑i∈ILhi+λ(∑i∈ILgi)2+∑i∈IRhi+λ(∑i∈IRgi)2−∑i∈Ihi+λ(∑i∈Igi)2]−γ
2.split finding algorithms
2.1exact greedy algorithm
exact greedy algorithm是一种切分点查找算法,如Algorithm 1所示。该算法对于每一个feature,试图枚举出所有可能的切分点,并计算在每一个切分点上的增益,从而选择增益最好的切分点。在algorithm1中要枚举出所有的可能的切分点,算法是首先对所有训练数据对feature k的取值进行排序,这样就能轻易地枚举出所有的切分点。
2.2Approximate Algorithm
exact greedy algorithm很强大,但当训练数据量太大以至于无法完全读进内存或者运行在分布式计算资源上,就有问题了。所以论文总结了一种approximate algorithm, 如algorithm 2
algorithm2针对feature k先是根据特征分布的percentile列出了L个待选切分点(candidate splitting point),切分点值的集合
S
k
S_k
Sk,之后根据
O
b
j
s
p
l
i
t
Obj_{split}
Objsplit公式分别计算这些待选切分点的增益,选择增益最好的切分点。根据feature k大小不同——是在训练的一开始就对全部训练数据的feature k列出待选切分点还是对分到某个结点上的训练数据的feature k,approximate algorithm有两种变体——global、local.
2.3Sparsity-aware Split Finding
在实际场景中,数据缺失很常见,如果某实例点的特征值缺失,上述算法无法将该实例点分到任一子结点。对此论文提出了稀疏感知的切分点查找算法。原理大概是对于特征值缺失的实例点,分别将其分到左右子结点,计算增益,选择增益最好的划分方式作为该特征缺失情况下的默认划分。
参考
https://blog.csdn.net/w928485096/article/details/90107568
https://arxiv.org/pdf/1603.02754.pdf