2. xgboost模型
L
(
t
)
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
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,y^i(t−1)+ft(xi))+Ω(ft)
损失函数二阶泰勒展开
L
(
t
)
=
∑
i
=
1
n
[
l
(
y
i
,
y
^
(
t
−
1
)
)
+
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
L^{(t)} = \sum_{i=1}^n [ l(y_i, \hat y^{(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,y^(t−1))+gift(xi)+21hift2(xi)]+Ω(ft),其中
g
i
=
∂
y
^
(
t
−
1
)
l
(
y
i
,
y
^
(
t
−
1
)
)
g_i = \partial_{\hat y^{(t-1)}}l(y_i, \hat y^{(t-1)})
gi=∂y^(t−1)l(yi,y^(t−1)),
h
i
=
∂
y
^
(
t
−
1
)
2
l
(
y
i
,
y
^
(
t
−
1
)
)
h_i = \partial^2_{\hat y^{(t-1)}}l(y_i, \hat y^{(t-1)})
hi=∂y^(t−1)2l(yi,y^(t−1))
去掉当中的常数项
L
(
t
)
=
∑
i
=
1
n
[
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
L^{(t)} = \sum_{i=1}^n [ g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) ] + \Omega(f_t)
L(t)=i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)
将正则化项展开
L
(
t
)
=
∑
i
=
1
n
[
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
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
L^{(t)} = \sum_{i=1}^n [ g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) ] + \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_j + \frac{1}{2} (\sum_{i \in I_j} h_i + \lambda)w_j^2 ] + \gamma T
L(t)=i=1∑n[gift(xi)+21hift2(xi)]+γT+21λj=1∑Twj2=j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2]+γT
其中
I
j
=
{
i
∣
q
(
x
i
)
=
j
}
I_j = \{i |q(x_i) = j \}
Ij={i∣q(xi)=j} 表示一个叶子节点 j;
q
(
x
i
)
=
j
q(x_i)=j
q(xi)=j 表示一个样本
x
i
x_i
xi经过树结构
q
(
x
)
q(x)
q(x)到达了叶子节点
j
j
j
那么对于任何一个固定的树结构
q
(
x
)
q(x)
q(x),我们都能够得到叶子节点的最优的权重
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
L
(
t
)
(
q
)
=
−
1
2
∑
j
=
1
T
(
∑
i
∈
I
j
g
i
)
2
∑
i
∈
I
j
h
i
+
λ
+
γ
T
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 } + \gamma T
L(t)(q)=−21j=1∑T∑i∈Ijhi+λ(∑i∈Ijgi)2+γT
这个损失函数有多种用途,例如用来做节点的切分
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
+
λ
]
+
γ
T
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 T
Lsplit=21[∑i∈ILhi+λ(∑i∈ILgi)2+∑i∈IRhi+λ(∑i∈IRgi)2−∑i∈Ihi+λ(∑i∈Igi)2]+γT
2.3 xgboost避免过拟合的方法
- 加入了正则化项
- Shrinkage: 将新加入的树,增加一个缩放因子
η
\eta
η
- 减小了单棵树的影响,将优化空间给了未来增加的树
- Column Subsampling: 列采样,类似于随机森林当中的技术(除了避免过拟合以外,还能够并行加速计算)
3. 如何加速寻找切分点
- Basic Exact greedy algorithm: 基本的节点分裂算法,需要遍历每一个特征的每一个位置,去计算最优的切分点
- quantile strategy(分位点策略): 改进的切分方法:对每个特征选择一些候选的分割点,根据特征分布百分比
- global proposal: 在数据初始化的时候,就将每个特征的分位点固定下来,每次分裂的时候使用同样的分位点
- 优点:步骤少,但是需要更多的分位点,才能达到比较好的效果
- local proposal: 在每次切分的时候都重新定义候选切分点集合,对更深的树比较合理
- global proposal: 在数据初始化的时候,就将每个特征的分位点固定下来,每次分裂的时候使用同样的分位点
- weighted Quantile Sketch: 这里没看懂
- Sparsity-aware Split Finding(能加速50倍左右): 有可能有多种原因造成的数据稀疏,在该值缺失时,分到一个默认的方向,这个方向是算法自己学到的
4. 系统设计
- 4.1 Column Block for Parallel Learning,每个block当中的feature值是排序的,这个的好处特别多
- 4.2 Cache-aware Access: 这一块也不是很懂,不过大意是,block过小影响并行化效率,block过大导致缓存失效
- 4.3 Blocks for Out-of-core Computation: 如何使用外存
- Block Compression: 块数据压缩
- Block Sharding: 块数据分片,将一块数据分散到多块硬盘,读取的时候可以同时读取,增加吞吐量
问题
- 树的梯度如何计算?一阶梯度,二阶梯度