首先给出论文链接
xgb是哪一种集成方式?
boosting, 也就是不放回采样,迭代学习错误样本,最终使损失最小。既然是迭代学习错误样本,就会有误差值,xgb 是怎样逼近误差? 泰勒二项展开式,也就是高频考点,但是仅仅如此,还不足以了解 xgb。
损失函数部分
决策树
y
^
i
=
ϕ
(
x
i
)
=
∑
k
=
1
K
f
k
(
x
i
)
,
f
k
∈
F
\hat{y}_{i}=\phi\left(\mathbf{x}_{i}\right)=\sum_{k=1}^{K} f_{k}\left(\mathbf{x}_{i}\right), \quad f_{k} \in \mathcal{F}
y^i=ϕ(xi)=∑k=1Kfk(xi),fk∈F
where
F
=
{
f
(
x
)
=
w
q
(
x
)
}
(
q
:
R
m
→
T
,
w
∈
R
T
)
\mathcal{F}=\left\{f(\mathbf{x})=w_{q(\mathbf{x})}\right\}\left(q: \mathbb{R}^{m} \rightarrow T, w \in \mathbb{R}^{T}\right)
F={f(x)=wq(x)}(q:Rm→T,w∈RT)
每次预测,都有 K 棵决策数来参与当前的运算,这里q表示将示例映射到的每个树的结构对应的叶索引。T是叶节点的数量
树。每个
f
k
f_{k}
fk对应一个独立的树结构Q和叶权重w,
w
i
w_{i}
wi表示第 i 个叶子的权重。
损失函数
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(ϕ)=∑il(y^i,yi)+∑kΩ(fk)
where
Ω
(
f
)
=
γ
T
+
1
2
λ
∥
w
∥
2
\Omega(f)=\gamma T+\frac{1}{2} \lambda\|w\|^{2}
Ω(f)=γT+21λ∥w∥2
这里 Ω ( f ) \Omega(f) Ω(f) 是树的正则项, T 是树中叶子的数量, w 是节点的权重,这里是一个很强的技巧,就是把约束性加入损失函数中,使用梯度下降学习出最佳的参数。
泰勒展开式出场
L ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) ( 1 ) \mathcal{L}^{(t)}=\sum_{i=1}^{n} l\left(y_{i}, \hat{y}_{i}^{(t-1)}+f_{t}\left(\mathbf{x}_{i}\right)\right)+\Omega\left(f_{t}\right) (1 ) L(t)=i=1∑nl(yi,y^i(t−1)+ft(xi))+Ω(ft)(1)
这个了解 boosting算法的都可以看懂,不再赘述,使用二阶泰勒展开式来缩小误差,如下:
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
)
(
2
)
\mathcal{L}^{(t)} \simeq \sum_{i=1}^{n}\left[l\left(y_{i}, \hat{y}^{(t-1)}\right)+g_{i} f_{t}\left(\mathbf{x}_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(\mathbf{x}_{i}\right)\right]+\Omega\left(f_{t}\right) (2 )
L(t)≃i=1∑n[l(yi,y^(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)(2)
where
g
i
=
∂
y
^
(
t
−
1
)
l
(
y
i
,
y
^
(
t
−
1
)
)
g_{i}=\partial_{\hat{y}(t-1)} l\left(y_{i}, \hat{y}^{(t-1)}\right)
gi=∂y^(t−1)l(yi,y^(t−1)) and
h
i
=
∂
y
^
(
t
−
1
)
2
l
(
y
i
,
y
^
(
t
−
1
)
)
h_{i}=\partial_{\hat{y}^{(t-1)}}^{2} l\left(y_{i}, \hat{y}^{(t-1)}\right)
hi=∂y^(t−1)2l(yi,y^(t−1)),因
l
(
y
i
,
y
^
(
t
−
1
)
)
l\left(y_{i}, \hat{y}^{(t-1)}\right)
l(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
)
(
3
)
\tilde{\mathcal{L}}^{(t)}=\sum_{i=1}^{n}\left[g_{i} f_{t}\left(\mathbf{x}_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(\mathbf{x}_{i}\right)\right]+\Omega\left(f_{t}\right) (3 )
L~(t)=i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)(3)
因为是树模型来预测,所有的结果最后要通过叶子节点的计算分数来表示,则树到叶子节点可以表示为
f
t
=
∑
T
w
j
f_{t} = \sum_{T}w_{j}
ft=∑Twj 。这里定义叶子节点集合中,叶子 j 为
I
j
=
{
i
∣
q
(
x
i
)
=
j
}
I_{j}=\left\{i \mid q\left(\mathbf{x}_{i}\right)=j\right\}
Ij={i∣q(xi)=j}, 扩展以上公式如下:
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
(
4
)
\begin{aligned} \tilde{\mathcal{L}}^{(t)} &=\sum_{i=1}^{n}\left[g_{i} f_{t}\left(\mathbf{x}_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(\mathbf{x}_{i}\right)\right]+\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} \\ &=\sum_{j=1}^{T}\left[\left(\sum_{i \in I_{j}} g_{i}\right) w_{j}+\frac{1}{2}\left(\sum_{i \in I_{j}} h_{i}+\lambda\right) w_{j}^{2}\right]+\gamma T \end{aligned} (4)
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(4)
通过式子,可以计算出最优x 与 最优解:
w
j
∗
=
−
∑
i
∈
I
j
g
i
∑
i
∈
I
j
h
i
+
λ
(
5
)
w_{j}^{*}=-\frac{\sum_{i \in I_{j}} g_{i}}{\sum_{i \in I_{j}} h_{i}+\lambda} (5 )
wj∗=−∑i∈Ijhi+λ∑i∈Ijgi(5)
L ~ ( t ) ( q ) = − 1 2 ∑ j = 1 T ( ∑ i ∈ I j g i ) 2 ∑ i ∈ I j h i + λ + γ T ( 6 ) \tilde{\mathcal{L}}^{(t)}(q)=-\frac{1}{2} \sum_{j=1}^{T} \frac{\left(\sum_{i \in I_{j}} g_{i}\right)^{2}}{\sum_{i \in I_{j}} h_{i}+\lambda}+\gamma T (6 ) L~(t)(q)=−21j=1∑T∑i∈Ijhi+λ(∑i∈Ijgi)2+γT(6)
以上公式,可以表示为计算该树权重公式,计算如图所示:
如何防止过拟合策略?
-
在损失函数中, Ω ( f ) = γ T + 1 2 λ ∥ w ∥ 2 \Omega(f)=\gamma T+\frac{1}{2} \lambda\|w\|^{2} Ω(f)=γT+21λ∥w∥2, T 是该树的叶子数量,w是叶子对应的权重
-
列采样,在实验中表面,列采样(特征采样)比行采样更可以防止过拟合,还可以加速计算速度
XGB是如何寻找节点,用了哪些优化策略?
XGB 定义了自己的切分方式:
Gain
=
1
2
[
G
L
2
H
L
+
λ
+
G
R
2
H
R
+
λ
−
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
]
−
γ
\text { Gain }=\frac{1}{2}\left[\frac{G_{L}^{2}}{H_{L}+\lambda}+\frac{G_{R}^{2}}{H_{R}+\lambda}-\frac{\left(G_{L}+G_{R}\right)^{2}}{H_{L}+H_{R}+\lambda}\right]-\gamma
Gain =21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ
如何切分?
- 精确贪心算法
- 类似 cart 划分, 需要遍历所有特征下的每个取值,当数据量增大时,很慢
-
近似算法
XGB和lightGBM在节点分裂时候的区别?
xgb是level-wise,lgb是leaf-wise,level-wise指在树分裂的过程中,同一层的非叶子节点,只要继续分裂能够产生正的增益就继续分裂下去,而leaf-wise更苛刻一点,同一层的非叶子节点,仅仅选择分裂增益最大的叶子节点进行分裂。
XGB 与 LGB 区别
xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是xgboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,带来了不必要的开销。 leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。
lightgbm使用了基于histogram的决策树算法,这一点不同与xgboost中的 exact 算法,histogram算法在内存和计算代价上都有不小优势。
内存:直方图算法的内存消耗为(data* features * 1Bytes)(因为对特征分桶后只需保存特征离散化之后的值),而xgboost的exact算法内存消耗为:(2 * data * features* 4Bytes),因为xgboost既要保存原始feature的值,也要保存这个值的顺序索引,这些值需要32位的浮点数来保存。
计算:预排序算法在选择好分裂特征计算分裂收益时需要遍历所有样本的特征值,时间为(#data),而直方图算法只需要遍历桶就行了,时间为(#bin)