以下内容均为个人理解,如有错误,欢迎指出
什么是XGBoost
以下内容摘自一文读懂机器学习大杀器XGBoost原理
XGBoost是boosting算法的其中一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器(为什么是弱分类器待会会解释)。因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器。对于回归问题,所用到的树模型则是CART回归树模型。
本文讲解的是回归类的XGBoost
CART回归树模型可查看我之前的文章机器学习——决策树(ID3、C4.5、CART)
XGBoost的推导过程
XGBoost的目标函数
K个学习器的目标函数为
O
b
j
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
)
+
∑
k
=
1
K
Ω
(
f
k
)
Obj=\sum_{i=1}^nl(y_i,\hat y_i)+\sum_{k=1}^K \Omega(f_k)
Obj=i=1∑nl(yi,y^i)+k=1∑KΩ(fk)
目标函数由损失函数和正则项构成,
O
b
j
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
)
Obj=\sum_{i=1}^nl(y_i,\hat y_i)
Obj=∑i=1nl(yi,y^i)为损失函数,用于衡量预测值与真实值之间的差距,
y
i
y_i
yi为真实值,
y
^
i
\hat y_i
y^i为预测值,依据自己的需要定义损失函数
l
(
y
i
,
y
^
i
)
l(y_i,\hat y_i)
l(yi,y^i),i表示第几个样本,
∑
k
=
1
K
Ω
(
f
k
)
\sum_{k=1}^K \Omega(f_k)
∑k=1KΩ(fk)为正则化项,正则化项包含两部分——叶子节点个数与叶子节点的值,即
Ω
(
f
k
)
=
γ
T
k
+
λ
1
2
∣
∣
w
k
∣
∣
2
\Omega(f_k)=\gamma T_k+\lambda \frac{1}{2}||w_k||^2
Ω(fk)=γTk+λ21∣∣wk∣∣2
T
k
T_k
Tk表示第k个学习器的叶子节点的个数,
w
k
w_k
wk表示第k个学习器的叶子节点的分数,
γ
、
λ
\gamma、\lambda
γ、λ为事先指定的值
模型学习与训练误差
符号表
符号名 | 含义 |
---|---|
y ^ i ( i ) \hat y_i^{(i)} y^i(i) | 前i个学习器在第i个样本上的预测值之和 |
f i ( x i ) f_i(x_i) fi(xi) | 第i个学习器在第i个样本上的残差预测值 |
O b j ( t ) Obj^{(t)} Obj(t) | 加入第t个学习器后的目标函数值 |
XGBoost是集成学习的一种算法,从定义可知,其将许多弱分类器集成在了一起,它将多棵树的得分累加得到最终的预测得分,其过程如下:
第i个学习器拟合前i-1个学习器拟合的误差,例如二维坐标上的第i个样本为(1,9),前i-1个学习器的拟合值为7,则对于第i个样本,第i个学习器需要拟合的值为2,即对于第i个学习器,第i个样本变为(1,2),正是因为不断通过新的学习器拟合误差,所以XGBoost在训练样本上的误差会不断降低,基于此,我们将加入第t个学习器后的目标函数变为
O
b
j
t
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
)
)
+
∑
k
=
1
K
Ω
(
f
k
)
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
+
c
o
n
s
t
(
式
1.0
)
\begin{aligned} Obj^{t}=&\sum_{i=1}^n l(y_i,\hat y_i^{(t)})+\sum_{k=1}^K \Omega(f_k) =& \sum_{i=1}^n l(y_i,\hat y_i^{(t-1)}+f_t(x_i))+\Omega(f_t)+const(式1.0) \end{aligned}
Objt=i=1∑nl(yi,y^i(t))+k=1∑KΩ(fk)=i=1∑nl(yi,y^i(t−1)+ft(xi))+Ω(ft)+const(式1.0)
const为常数,由于前
t
−
1
t-1
t−1个学习器的正则项已知,故为常数,
y
i
y_i
yi表示第i个样本的真实值,
y
^
i
(
t
−
1
)
\hat y_i^{(t-1)}
y^i(t−1)表示前
t
−
1
t-1
t−1个学习器在第i个样本上的预测值之和,对于
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
l(y_i,\hat y_i^{(t-1)}+f_t(x_i))
l(yi,y^i(t−1)+ft(xi)),由于
y
i
y_i
yi是常数,在正式训练以前,
y
^
i
(
t
−
1
)
\hat y_i^{(t-1)}
y^i(t−1)的值是一个变量,故我们可设
f
(
y
^
i
(
t
−
1
)
)
=
l
(
y
i
,
y
^
i
(
t
−
1
)
)
f(\hat y_i^{(t-1)})=l(y_i,\hat y_i^{(t-1)})
f(y^i(t−1))=l(yi,y^i(t−1)),若将
f
t
(
x
i
)
f_t(x_i)
ft(xi)看为
Δ
y
^
i
(
t
−
1
)
\Delta \hat y_i^{(t-1)}
Δy^i(t−1),则
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
l(y_i,\hat y_i^{(t-1)}+f_t(x_i))
l(yi,y^i(t−1)+ft(xi))可表示为
f
(
y
^
i
(
t
−
1
)
+
Δ
y
^
i
(
t
−
1
)
)
f(\hat y_i^{(t-1)}+\Delta \hat y_i^{(t-1)})
f(y^i(t−1)+Δy^i(t−1)),我们对其进行二阶泰勒展开(泰勒展开请自行google,为什么进行泰勒展开原因后面解释),二阶泰勒展开式长这样
f
(
x
+
Δ
x
)
≈
f
(
x
)
+
f
′
(
x
)
Δ
x
+
1
2
f
′
′
(
x
)
Δ
x
2
f(x+\Delta x)\approx f(x)+f'(x)\Delta x+\frac{1}{2}f''(x)\Delta x^2
f(x+Δx)≈f(x)+f′(x)Δx+21f′′(x)Δx2
基于此,式1.0可表示为
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
k
)
+
c
o
n
s
t
(
式
1.1
)
Obj^{(t)}\approx \sum_{i=1}^n[l(y_i,\hat y_i^{t-1})+g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Omega(f_k)+const (式1.1)
Obj(t)≈i=1∑n[l(yi,y^it−1)+gift(xi)+21hift2(xi)]+Ω(fk)+const(式1.1)
其中
g
i
=
∂
l
(
y
i
,
y
^
i
t
−
1
)
∂
y
^
i
t
−
1
h
i
=
∂
2
l
(
y
i
,
y
^
i
t
−
1
)
∂
(
y
^
i
t
−
1
)
2
g_i=\frac{\partial l(y_i,\hat y_i^{t-1})}{\partial \hat y_i^{t-1}}\\ h_i=\frac{\partial^2 l(y_i,\hat y_i^{t-1})}{\partial (\hat y_i^{t-1})^2}
gi=∂y^it−1∂l(yi,y^it−1)hi=∂(y^it−1)2∂2l(yi,y^it−1)
一般情况下,
l
(
y
i
,
y
^
i
)
l(y_i,\hat y_i)
l(yi,y^i)为凸函数(想一想均方误差),所以
h
i
>
0
h_i>0
hi>0,对于CART决策树,每一个样本最终会落到其中一个叶子节点上,我们用
w
q
(
x
i
)
2
w_{q(x_i)}^2
wq(xi)2表示第i个样本所处的叶子,在此基础上,代入正则项,假设第t个决策树具有T个叶子节点,则式1.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
k
)
+
c
o
n
s
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
(
式
1.2
)
\begin{aligned} Obj^{(t)}\approx & \sum_{i=1}^n[l(y_i,\hat y_i^{t-1})+g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Omega(f_k)+const\\ = & \sum_{i=1}^n[g_iw_{q(x_i)}+\frac{1}{2}h_iw_{q(x_i)}^2]+\gamma T+\lambda \frac{1}{2}\sum_{j=1}^T w_j^2(式1.2) \end{aligned}
Obj(t)≈=i=1∑n[l(yi,y^it−1)+gift(xi)+21hift2(xi)]+Ω(fk)+consti=1∑n[giwq(xi)+21hiwq(xi)2]+γT+λ21j=1∑Twj2(式1.2)
将
∑
i
=
1
n
[
g
i
w
q
(
x
i
)
+
1
2
h
i
w
q
(
x
i
)
2
]
\sum_{i=1}^n[g_iw_{q(x_i)}+\frac{1}{2}h_iw_{q(x_i)}^2]
∑i=1n[giwq(xi)+21hiwq(xi)2]展开,将位于同一个叶子节点上的样本合并在一起,用
I
j
I_j
Ij表示落在叶子点j上面样本的集合,则式1.2可变为
O
b
j
(
t
)
≈
∑
j
=
1
T
[
∑
i
ϵ
I
i
g
i
w
j
+
1
2
(
∑
i
ϵ
I
j
h
i
+
λ
)
w
j
2
]
+
γ
T
(
式
1.3
)
Obj^{(t)}\approx \sum_{j=1}^T[ \sum_{i\epsilon I_i} g_i w_j+\frac{1}{2}(\sum_{i\epsilon I_j}h_i+\lambda)w_j^2]+\gamma T(式1.3)
Obj(t)≈j=1∑T[iϵIi∑giwj+21(iϵIj∑hi+λ)wj2]+γT(式1.3)
由于
h
j
>
0
,
λ
>
0
h_j>0,\lambda>0
hj>0,λ>0,所以式1.3是一个凸函数,设
G
j
=
∑
i
ϵ
I
j
g
i
,
H
j
=
∑
i
ϵ
I
j
h
i
G_j=\sum_{i\epsilon I_j}g_i,H_j=\sum_{i\epsilon I_j}h_i
Gj=∑iϵIjgi,Hj=∑iϵIjhi,则式1.3可表示为
O
b
j
(
t
)
≈
∑
j
=
1
T
[
G
j
w
j
+
1
2
(
H
j
+
λ
)
w
j
2
]
+
γ
T
(
式
1.4
)
Obj^{(t)}\approx \sum_{j=1}^T[G_jw_j+\frac{1}{2}(H_j+\lambda)w_j^2]+\gamma T(式1.4)
Obj(t)≈j=1∑T[Gjwj+21(Hj+λ)wj2]+γT(式1.4)
对
w
j
w_j
wj求导置为0可得
w
j
∗
=
−
G
j
H
j
+
λ
w_j^*=-\frac{G_j}{H_j+\lambda}
wj∗=−Hj+λGj
将其代入式1.4可得
O
b
j
=
−
1
2
∑
j
=
1
T
G
j
2
H
j
+
λ
+
γ
T
(
式
1.5
)
Obj=-\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma T(式1.5)
Obj=−21j=1∑THj+λGj2+γT(式1.5)
现在回头看看我们为什么使用泰勒展开式进行推导,可以看到整个推导过程都未涉及到损失函数的具体值,只是假定损失函数为凸函数(一般都是凸函数),因此使用泰勒展开式推导的式1.5对于不同的损失函数具有通用性
对于式1.5的计算,我们来举一个例子,假定现在有五个样本,求加入第t个CART回归决策树决后式1.5的值,我们可以计算出每个样本在t-1个CART回归决策树上的
g
i
、
h
i
g_i、h_i
gi、hi,则有
到这里,我们把目标函数推导完了,也知道针对某一个新加入的具体的CART决策树后如何计算式1.5,那么接下来,CART决策树如何生成?XGBoost的作者给出了两种方案,此处只介绍其中一个,该方案使用贪心策略,与CART回归决策树的分裂方式类似,只是将基尼指数改为了下式
对于某个节点,每次选择能使Gain最高的特征与特征划分点(例如有样本在第j个特征上的取值为1,2,3,4,5,假设特征划分点为3.5,则第j个特征取值为1,2,3的样本被分到左子树,4,5被分到右子树)进行划分,为什么说这是贪心策略呢?
对于某一个节点来说,由于 ( G L + G H ) 2 H L + H R + λ 、 γ \frac{(G_L+G_H)^2}{H_L+H_R+\lambda}、\gamma HL+HR+λ(GL+GH)2、γ是常数,Gain最大,意味着在所有划分方案中,此时对应的 − 1 2 [ G L 2 H L + λ + G R 2 H R + λ ] + γ -\frac{1}{2}[\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}]+\gamma −21[HL+λGL2+HR+λGR2]+γ最小,即对于某个节点,不同的分裂方式,式1.5有不同的取值,我们取其中的最小,并用其对应的方案进行分裂,最终满足某个临界条件,此时停止分裂,每个叶子节点的取值为 − G j H j + λ -\frac{G_j}{H_j+\lambda} −Hj+λGj,那么临界条件是什么呢?这个方案比较多,具体而言
- 当引入的分裂带来的增益小于设定阀值的时候,我们可以忽略掉这个分裂,所以并不是每一次分裂loss function整体都会增加的,有点预剪枝的意思,阈值参数为(即正则项里叶子节点数T的系数);
- 当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,避免树太深导致学习局部样本,从而过拟合;
- 当样本权重和小于设定阈值时则停止建树。什么意思呢,即涉及到一个超参数-最小的样本权重和min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样。大意就是一个叶子节点样本太少了,也终止同样是防止过拟合;
- 貌似看到过有树的最大数量的…
以上内容摘自通俗理解kaggle比赛大杀器xgboost
这几个参数在Python的XGBoost包上也有,接下来,我们解释一下为什么XGBoost要使用弱分类器
XGBoost为什么要使用弱分类器
我们知道集成学习中的Bagging的基学习器是强学习器,Boosting的基学习器是弱学习器,同样是决策树,Bagging的决策树深度将大于Boosting,这一节,我们将从一定条件下对此进行简单解释,在此之前,先理解什么是机器学习中的偏差,什么是方差
偏差:模型的预测结果与真实结果之间的差距
方差:即模型的泛化能力,方差大的模型,对于不同的测试数据产生的结果差别较大,即对训练数据拟合过高,方差小的模型,对于不同测试数据产生的结果差别不大,一般来说,弱学习器的泛化能力较强,对于决策树来说,由于叶子节点较少,对于不同的测试数据,产生的结果自然差距不大,假设这个决策树只有五种结果(五个叶子),与具有几百种结果的决策树相比,对于不同测试数据产生的结果自然差距不大
在本节集成学习的讨论中,我们有以下假设
- 我们用期望来侧面反映偏差,若测试数据的期望与预测数据的期望近似,我们就认为模型的偏差小
- 基模型的权重 γ i \gamma_i γi、方差 δ i 2 \delta_i^2 δi2以及两两之间的相关系数 ρ i \rho_i ρi相等,分别用 γ 、 δ 2 、 ρ \gamma、\delta^2、\rho γ、δ2、ρ表示
- Boosting的各个基学习器之间的相关系数 ρ = 1 \rho=1 ρ=1
由于Bagging与Boosting都是将基学习器用线性方式组成,假设有m个基础学习器,第i个学习器的输出用
f
i
f_i
fi表示,第i个学习器的权重用
γ
i
\gamma_i
γi表示,则集成学习器的输出
F
F
F可近似表示为
F
=
∑
i
=
1
m
γ
i
f
i
F=\sum_{i=1}^m \gamma_if_i
F=i=1∑mγifi
对于n分类任务,可以把一个基分类器的输出想成一个n维向量,每一个维度表示一个类别,样本属于该类别,则置为1,某则置为0,此时上式可看成是这些向量的加权和,之所以用近似,是因为分类任务最终的输出将是一个有n-1个维度取值为0,只有一个维度取值为1的n维向量,我们假定上式近似代表这个向量,即某个维度取值近似1,其余维度近似0的向量
推导过程将会用到以下公式
E
(
A
X
)
=
A
E
(
X
)
E
(
∑
i
=
1
n
X
i
)
=
∑
i
=
1
n
E
(
X
i
)
V
a
r
(
∑
i
=
1
n
X
i
)
=
∑
i
=
1
n
∑
j
=
1
n
C
o
v
(
X
i
,
X
j
)
=
∑
i
=
1
n
V
a
r
(
X
i
)
+
2
∑
1
≤
i
<
≤
n
C
o
v
(
X
i
,
X
j
)
V
a
r
(
A
X
)
=
A
2
V
a
r
(
X
)
相
关
系
数
ρ
=
C
o
v
(
X
i
,
X
j
)
V
a
r
(
X
i
)
V
a
r
(
X
j
)
\begin{aligned} E(AX)=&AE(X)\\ E(\sum_{i=1}^n X_i)=&\sum_{i=1}^n E(X_i)\\ Var(\sum_{i=1}^n X_i)=&\sum_{i=1}^n\sum_{j=1}^nCov(X_i,X_j)=\sum_{i=1}^n Var(X_i)+2\sum_{1\leq i<\leq n}Cov(X_i,X_j)\\ Var(AX)=&A^2Var(X)\\ 相关系数\rho=&\frac{Cov(X_i,X_j)}{\sqrt {Var(X_i)} \sqrt {Var(X_j)}} \end{aligned}
E(AX)=E(i=1∑nXi)=Var(i=1∑nXi)=Var(AX)=相关系数ρ=AE(X)i=1∑nE(Xi)i=1∑nj=1∑nCov(Xi,Xj)=i=1∑nVar(Xi)+21≤i<≤n∑Cov(Xi,Xj)A2Var(X)Var(Xi)Var(Xj)Cov(Xi,Xj)
集成学习输出的期望与方差可表示为
E
(
F
)
=
E
(
∑
i
=
1
m
γ
i
f
i
)
=
γ
∑
i
=
1
m
E
(
f
i
)
(
式
2.1
)
V
a
r
(
F
)
=
V
a
r
(
∑
i
=
1
m
γ
i
f
i
)
=
∑
i
=
1
m
V
a
r
(
γ
i
f
i
)
+
∑
i
̸
=
j
γ
i
γ
j
C
o
v
(
X
i
,
X
j
)
=
∑
i
=
1
m
γ
i
2
V
a
r
(
f
i
)
+
∑
i
̸
=
j
γ
i
γ
j
C
o
v
(
X
i
,
X
j
)
=
m
γ
2
δ
2
+
(
m
2
−
m
)
γ
2
ρ
δ
2
(
对
相
关
系
数
的
计
算
公
式
进
行
变
形
,
自
己
与
自
己
的
相
关
系
数
为
1
)
=
m
2
γ
2
δ
2
ρ
+
m
γ
2
δ
2
(
1
−
ρ
)
(
式
2.2
)
\begin{aligned} E(F)=&E(\sum_{i=1}^m \gamma_i f_i)\\ =&\gamma \sum_{i=1}^m E(f_i)(式2.1)\\ Var(F)=&Var(\sum_{i=1}^m \gamma_i f_i)\\ =&\sum_{i=1}^m Var(\gamma_i f_i)+\sum_{i\not=j}\gamma_i \gamma_jCov(X_i,X_j)\\ =&\sum_{i=1}^m \gamma_i^2Var(f_i)+\sum_{i\not=j}\gamma_i \gamma_jCov(X_i,X_j)\\ =&m\gamma^2 \delta^2+(m^2-m)\gamma^2 \rho \delta^2(对相关系数的计算公式进行变形,自己与自己的相关系数为1)\\ =&m^2\gamma^2\delta^2\rho+m\gamma^2\delta^2(1-\rho)(式2.2) \end{aligned}
E(F)==Var(F)=====E(i=1∑mγifi)γi=1∑mE(fi)(式2.1)Var(i=1∑mγifi)i=1∑mVar(γifi)+i̸=j∑γiγjCov(Xi,Xj)i=1∑mγi2Var(fi)+i̸=j∑γiγjCov(Xi,Xj)mγ2δ2+(m2−m)γ2ρδ2(对相关系数的计算公式进行变形,自己与自己的相关系数为1)m2γ2δ2ρ+mγ2δ2(1−ρ)(式2.2)
Bagging的偏差与方差
对于Bagging,我们假定使用均值赋权法(即m个学习器的权重为
1
m
\frac{1}{m}
m1),则期望与方差为
E
(
F
)
=
γ
∑
i
=
1
m
E
(
f
i
)
=
1
m
∗
m
∗
E
(
f
i
)
=
E
(
f
i
)
V
a
r
(
F
)
=
m
2
1
m
2
δ
2
ρ
+
m
1
m
2
δ
2
(
1
−
ρ
)
=
δ
2
ρ
+
δ
2
(
1
−
ρ
)
m
\begin{aligned} E(F)=&\gamma \sum_{i=1}^m E(f_i)\\ =&\frac{1}{m}*m*E(f_i)\\ =&E(f_i)\\ Var(F)=&m^2\frac{1}{m^2}\delta^2\rho+m \frac{1}{m^2} \delta^2 (1-\rho)\\ =& \delta^2 \rho+\frac{\delta^2(1-\rho)}{m} \end{aligned}
E(F)===Var(F)==γi=1∑mE(fi)m1∗m∗E(fi)E(fi)m2m21δ2ρ+mm21δ2(1−ρ)δ2ρ+mδ2(1−ρ)
由此可见,Bagging模型的期望与基学习器类似,因此,基学习器常常为强学习器,此时Bagging的偏差将较小,为了降低方差,我们常常会增加基学习器的个数m
Boosting的偏差与方差
Boosting的基学习器在同一训练集上进行训练,并且基学习器之间是串型结构,对于一个训练样本,某个学习器的输出越高,意味着位于其后的学习器的输出越低,各个学习器之间的线性相关性较强,而Bagging的基学习器在具有重叠的不同训练集上进行训练,并且基学习器之间是并型结构,对于一个训练样本,某个学习器的输出越高,并不意味着其他学习器的输出越低,各个学习器之间的线性相关性较弱,而
ρ
\rho
ρ用于度量两个维度之间的线性相关性,因此,我们假定Boosting的
ρ
=
1
\rho=1
ρ=1,则有
E
(
F
)
=
γ
∗
∑
i
=
1
m
E
(
f
i
)
V
a
r
(
F
)
=
m
2
∗
γ
2
∗
δ
2
\begin{aligned} E(F)=&\gamma*\sum_{i=1}^mE(f_i)\\ Var(F)=&m^2*\gamma^2*\delta^2 \end{aligned}
E(F)=Var(F)=γ∗i=1∑mE(fi)m2∗γ2∗δ2
由此可见,Boosting的方差与基学习器的方差与个数直接挂钩,而期望为基学习器的期望之和,为了让Boosting的期望尽可能趋近于训练数据的期望,我们常常增加学习器的个数,但是,这会导致模型的方差不断上升,为了缓和上升的趋势,我们常使用弱学习器,基于此。XGBoost也是弱学习器