示例
我们要预测一家人对电子游戏的喜好程度,有年龄、性别、职业这些特征。根据之前训练出来的多棵树来对这些样本打分,如下图所示:
注意,上述分数是由训练所得。与GBDT类似,两棵树的结论累加起来便是最终结论。如果不考虑工程实现、解决问题上的一些差异,XGBoost与GBDT比较大的不同就是目标函数的定义:
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
)
+
constant
\begin{aligned} O b j^{(t)} &=\sum_{i=1}^{n} l\left(y_{i}, \hat{y}_{i}^{(t)}\right)+\sum_{i=1}^{t} \Omega\left(f_{i}\right) \\ &=\sum_{i=1}^{n} l\left(y_{i}, \hat{y}_{i}^{(t-1)}+f_{t}\left(x_{i}\right)\right)+\Omega\left(f_{t}\right)+\text { constant } \end{aligned}
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
上述公式由两部分组成:
- 损失函数:揭示训练误差
- 正则化项:惩罚复杂模型
推导
损失函数
前沿知识:泰勒展开式:
f
(
x
+
Δ
x
)
≃
f
(
x
)
+
f
′
(
x
)
Δ
x
+
1
2
f
′
′
(
x
)
Δ
x
2
f(x+\Delta x) \simeq f(x)+f^{\prime}(x) \Delta x+\frac{1}{2} f^{\prime \prime}(x) \Delta x^{2}
f(x+Δx)≃f(x)+f′(x)Δx+21f′′(x)Δx2
定义如下符号:
g
i
=
∂
l
(
y
i
,
y
i
^
(
t
−
1
)
)
∂
y
i
^
(
t
−
1
)
h
i
=
∂
2
l
(
y
i
,
y
i
^
(
t
−
1
)
)
∂
2
y
i
^
(
t
−
1
)
g_{i}=\frac{\partial \; l\left(y_{i}, \hat{y_i}^{(t-1)}\right)}{\partial \; {\hat{y_i}^{(t-1)}} } \\ h_{i}=\frac{\partial^2 \; l\left(y_{i}, \hat{y_i}^{(t-1)}\right)}{\partial^2 \; {\hat{y_i}^{(t-1)}} }
gi=∂yi^(t−1)∂l(yi,yi^(t−1))hi=∂2yi^(t−1)∂2l(yi,yi^(t−1))
因此:
O
b
j
(
t
)
≃
∑
i
=
1
n
[
l
(
y
i
,
y
^
i
(
t
−
1
)
)
+
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
+
constant
O b j^{(t)} \simeq \sum_{i=1}^{n}\left[l\left(y_{i}, \hat{y}_{i}^{(t-1)}\right)+g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\Omega\left(f_{t}\right)+\text { constant }
Obj(t)≃i=1∑n[l(yi,y^i(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)+ constant
对应关系如下:
- (1)式 x x x ⇔ \Leftrightarrow ⇔ (2)式 y i ^ ( t − 1 ) \hat{y_i}^{(t-1)} yi^(t−1)
- (1)式 Δ x \Delta x Δx ⇔ \Leftrightarrow ⇔ (2)式 f t ( x i ) f_{t}\left(x_{i}\right) ft(xi)
由于
y
i
^
(
t
−
1
)
\hat{y_i}^{(t-1)}
yi^(t−1) 是已知的,因此
l
(
y
i
,
y
^
i
(
t
−
1
)
)
l\left(y_{i}, \hat{y}_{i}^{(t-1)}\right)
l(yi,y^i(t−1)) 也是个常数项,可以合并到
c
o
n
s
t
a
n
t
constant
constant 去。将
c
o
n
s
t
a
n
t
constant
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
)
O b j^{(t)} \simeq \sum_{i=1}^{n}\left[g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\Omega\left(f_{t}\right)
Obj(t)≃i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)
正则化项
- q ( x ) q(x) q(x) 表示将样本 x x x 映射到某个叶子节点的编号上
- w w w 表示叶子节点的得分
注意,多个样本可以落到同一个叶子节点上,这时它们的得分是一样的。
XGBoost定义树的复杂度如下:
重新组织损失函数
由于
w
w
w 是我们要求的参数,因此将上述公式组织成关于
w
w
w 的函数:
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
w
q
(
x
i
)
+
1
2
h
i
w
q
(
x
i
)
2
]
+
γ
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
\begin{aligned} O b j^{(t)} & \simeq \sum_{i=1}^{n}\left[g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\Omega\left(f_{t}\right) \\ &=\sum_{i=1}^{n}\left[g_{i} w_{q\left(x_{i}\right)}+\frac{1}{2} h_{i} w_{q\left(x_{i}\right)}^{2}\right]+\gamma T+\lambda \frac{1}{2} \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}
Obj(t)≃i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)=i=1∑n[giwq(xi)+21hiwq(xi)2]+γT+λ21j=1∑Twj2=j=1∑T⎣⎡⎝⎛i∈Ij∑gi⎠⎞wj+21⎝⎛i∈Ij∑hi+λ⎠⎞wj2⎦⎤+γT
- I j = { i ∣ q ( x i ) = j } I_{j}=\left\{i \mid q\left(x_{i}\right)=j\right\} Ij={i∣q(xi)=j} 表示样本下标集合:这些样本可以落到下标为 j j j 的叶子节点
这样上式可以看作关于 w w w 的一元二次函数。
定义
G
j
=
∑
i
∈
I
j
g
i
H
j
=
∑
i
∈
I
j
h
i
G_{j}=\sum_{i \in I_{j}} g_{i} \quad H_{j}=\sum_{i \in I_{j}} h_{i}
Gj=∑i∈IjgiHj=∑i∈Ijhi ,上式继续简化为:
O
b
j
(
t
)
=
∑
j
=
1
T
[
1
2
(
H
j
+
λ
)
w
j
2
+
G
j
w
j
]
+
γ
T
Obj^{(t)} = \sum_{j=1}^T \left[ \frac{1}{2} (H_j + \lambda) w_j^2 + G_j w_j \right] + \gamma T
Obj(t)=j=1∑T[21(Hj+λ)wj2+Gjwj]+γT
当 w j = − G j H j + λ w_j = - \frac{G_j}{H_j + \lambda} wj=−Hj+λGj 时, O b j ( t ) Obj^{(t)} Obj(t) 取得最小: − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T -\frac{1}{2} \sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma T −21∑j=1THj+λGj2+γT
下图给个示例:
FAQ
1. 二阶泰勒展开的优势在哪儿?
PPT上是这样说的:
主要有如下两点理由:
- XGBoost是以mse为基础推导出来的,在mse的情况下,xgboost的目标函数展开就是一阶项+二阶项的形式,而其他类似logloss这样的目标函数不能表示成这种形式。为了后续推导的统一,所以将目标函数进行二阶泰勒展开,就可以直接自定义损失函数了,只要二阶可导即可,增强了模型的扩展性。
- 二阶信息能够让梯度收敛的更快,类似牛顿法比SGD收敛更快。一阶信息描述梯度变化方向,二阶信息可以描述梯度变化方向是如何变化的。
2. XGBoost与GBDT的区别
- 基分类器:XGBoost的基分类器不仅支持CART决策树,还支持线性分类器,此时XGBoost相当于带L1和L2正则化项的逻辑回归或者线性回归。
- 导数信息:XGBoost对损失函数做了二阶泰勒展开,GBDT只用了一阶导数信息,并且XGBoost还支持自定义损失函数,只要损失函数一阶、二阶可导。
- 正则项:XGBoost的目标函数加了正则项, 相当于预剪枝,使得学习出来的模型更加不容易过拟合。
- 列抽样:XGBoost支持列采样,与随机森林类似,用于防止过拟合。
- 缺失值处理:对树中的每个非叶子结点,XGBoost可以自动学习出它的默认分裂方向。如果某个样本该特征值缺失,会将其划入默认分支。
- 并行化:注意不是tree维度的并行,而是特征维度的并行。XGBoost预先将每个特征按特征值排好序,存储为块结构,分裂结点时可以采用多线程并行查找每个特征的最佳分割点,极大提升训练速度。
3. XGBoost为什么可以并行训练?
- XGBoost的并行,并不是说每棵树可以并行训练,XGB本质上仍然采用boosting思想,每棵树训练前需要等前面的树训练完成才能开始训练。
- XGBoost的并行,指的是特征维度的并行:在训练之前,每个特征按特征值对样本进行预排序,并存储为Block结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个block并行计算。
4. XGBoost如何防止过拟合?
- 目标函数添加正则项:叶子节点个数+叶子节点权重的L2正则化
- 列抽样:训练的时候只用一部分特征(不考虑剩余的block块即可)
- 子采样:每轮计算可以不使用全部样本,使算法更加保守
- shrinkage: 可以叫学习率或步长,为了给后面的训练留出更多的学习空间
5. XGBoost如何处理缺失值?
- 在特征 k k k 上寻找最佳分割点时,不会对该列特征缺失的样本进行遍历,而只对该列特征值为非缺失的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找分割点的时间开销。
- 在逻辑实现上,为了保证完备性,会将该特征值缺失的样本分别分配到左叶子结点和右叶子结点,两种情形都计算一遍后,选择分裂后增益最大的那个方向(左分支或是右分支),作为预测时特征值缺失样本的默认分支方向。
- 如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子结点。
6. XGBoost中的一棵树的停止生长条件
- 当新引入的一次分裂所带来的增益 G a i n < γ Gain < \gamma Gain<γ 时,放弃当前的分裂。
- 当树达到最大深度时,停止建树,因为树的深度太深容易出现过拟合。
- 当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值,也会放弃此次分裂。如果一个叶子节点包含的样本数量太少也会放弃分裂,防止树分的太细。
7. RF和GBDT的异同
- 相同点:都是由多棵树组成,最终结果由多棵树一起决定。
- 不同点:
- 集成学习:RF属于bagging思想,而GBDT是boosting思想
- 偏差-方差权衡:RF不断的降低模型的方差,而GBDT不断的降低模型的偏差
- 训练样本:RF每次迭代的样本是从全部训练集中有放回抽样形成的,而GBDT每次使用全部样本
- 并行性:RF的树可以并行生成,而GBDT只能顺序生成(需要等上一棵树完全生成)
- 最终结果:RF最终是多棵树进行多数表决(回归问题是取平均),而GBDT是加权融合
- 数据敏感性:RF对异常值不敏感,而GBDT对异常值比较敏感
- 泛化能力:RF不易过拟合,而GBDT容易过拟合
8. 比较LR和GBDT,说说什么情景下GBDT不如LR?
- LR是线性模型,可解释性强,很容易并行化,但学习能力有限,需要大量的人工特征工程。
- GBDT是非线性模型,具有天然的特征组合优势,特征表达能力强,但是树与树之间无法并行训练,而且树模型很容易过拟合。
当在高维稀疏特征的场景下,LR的效果一般会比GBDT好。具体示例见:12. 比较LR和GBDT,说说什么情景下GBDT不如LR
9. XGBoost中如何对树进行剪枝?
- 在目标函数中增加了正则项:使用叶子结点的数目和叶子结点权重的L2模的平方,控制树的复杂度。
- 在结点分裂时,定义了一个阈值,如果分裂后目标函数的增益小于该阈值,则不分裂。
- 当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值(最小样本权重和),也会放弃此次分裂。
- XGBoost 先从顶到底建立树直到最大深度,再从底到顶反向检查是否有不满足分裂条件的结点,进行剪枝。
10. XGBoost如何分裂节点?
从树深度0开始,每一节点都遍历所有的特征,比如年龄、性别等等,然后对于某个特征,先按照该特征里的值进行排序,然后线性扫描该特征进而确定最好的分割点,最后对所有特征进行分割后,我们选择所谓的增益Gain最高的那个特征。Gain的计算公式如下: