xgboost 笔记整理
1.XGBoost 目标函数
O b j = ∑ i = 1 n l ( y i , y ^ i ) + ∑ k = 1 K Ω ( f k ) \mathcal{Obj}=\sum_{i=1}^{n} l\left(y_{i}, \hat{y}_{i}\right)+\sum_{k=1}^{K} \Omega\left(f_{k}\right) Obj=i=1∑nl(yi,y^i)+k=1∑KΩ(fk)
由训练损失和正则化项组成
y ^ i \hat{y}_{i} y^i 是第 i 个样本 x i {x}_{i} xi 的预测值,对应是每棵树打分的累加和
y ^ i = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y}_{i}=\sum_{k=1}^{K} f_{k}\left(x_{i}\right), \quad f_{k} \in \mathcal{F} y^i=k=1∑Kfk(xi),fk∈F
2. 学习第 k 颗树
假设第 t 次迭代要训练的树模型是 f t ( x ) {f}_{t}(x) ft(x) ,那么
y ^ i ( t ) = ∑ k = 1 t f k ( x i ) = y ^ i ( t − 1 ) + f t ( x i ) \hat{y}_{i}^{(t)}=\sum_{k=1}^{t} f_{k}\left(x_{i}\right)=\hat{y}_{i}^{(t-1)}+f_{t}(x_{i}) y^i(t)=k=1∑tfk(xi)=y^i(t−1)+ft(xi)
(第 t 次训练的结果 = 前 t-1 颗树的结果 + 第 t 颗树的结果)
注意:对于第 t 次迭代来说,当前优化的目标是第 t 颗树,因此前 t - 1 颗数的预测结果可认为是常量
将上式代入目标函数中,可以得到
O b j ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) + c o n s t \mathcal{Obj}^{(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) + const Obj(t)=i=1∑nl(yi,y^i(t−1)+ft(xi))+Ω(ft)+const
此处对正则项进行了拆分,由于前 t - 1 颗树的结构已经确定,因此前 t - 1 颗树的复杂度可以用一个常数表示
∑ k = 1 t Ω ( f k ) = Ω ( f t ) + ∑ k = 1 t − 1 Ω ( f k ) = Ω ( f t ) + c o n s t \sum_{k=1}^{t} \Omega\left(f_{k}\right)=\Omega\left(f_{t}\right)+\sum_{k=1}^{t-1} \Omega\left(f_{k}\right)=\Omega\left(f_{t}\right)+{const} k=1∑tΩ(fk)=Ω(ft)+k=1∑t−1Ω(fk)=Ω(ft)+const
3. 泰勒公式展开
泰勒公式是将一个在 x = x0 处具有n阶导数的函数 f ( x ) f(x) f(x) 利用关于 ( x − x 0 ) (x-x0) (x−x0) 的n次多项式来逼近函数的方法
泰勒二阶展开公式:
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
f ( x ) f(x) f(x) 对应于损失函数 → l ( y i , y ^ i ( t − 1 ) ) \to l(y_{i}, \hat{y}_{i}^{(t-1)}) →l(yi,y^i(t−1))
x x x 对应于前 t-1 颗树 → y ^ i ( t − 1 ) \to \hat{y}_{i}^{(t-1)} →y^i(t−1)
Δ x \Delta {x} Δx对应于当前训练的第t颗树 → f t ( x ) \to f_{t}(x) →ft(x)
那么对 x 求偏导,即对前t-1颗树求偏导
定义损失函数 l l l 关于 y ^ i ( t − 1 ) \hat{y}_{i}^{(t-1)} y^i(t−1) 的一阶偏导 g i g_{i} gi, 二阶偏导 h i h_{i} hi
g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) , h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) ) g_{i}=\partial_{\hat{y}^{(t-1)}} l\left(y_{i}, \hat{y}^{(t-1)}\right), h_{i}=\partial_{\hat{y}^{(t-1)}}^{2} l\left(y_{i}, \hat{y}^{(t-1)}\right) gi=∂y^(t−1)l(yi,y^(t−1)),hi=∂y^(t−1)2l(yi,y^(t−1))
将损失函数 l l l 进行泰勒二阶展开
l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) = l ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) l\left(y_{i}, \hat{y}_{i}^{(t-1)}+f_{t}\left(x_{i}\right)\right)=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) l(yi,y^i(t−1)+ft(xi))=l(yi,y^i(t−1))+gift(xi)+21hift2(xi)
将展开的损失函数,代入第 t 次迭代的目标函数
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
去除第 t 次迭代的常数项 (前 t-1 次损失函数、前 t-1 次正则项,常数项对优化不起作用)
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)
接下来分别对未知变量 f t ( x ) f_{t}(x) ft(x) 、 Ω ( f t ) \Omega\left(f_{t}\right) Ω(ft) 进行定义
4. 定义一颗树 f t ( x ) f_{t}(x) ft(x)
f t ( x ) = w q ( x ) , w ∈ R T , q : R d → { 1 , 2 , ⋯ , T } f_{t}(x)=w_{q(x)}, \quad w \in \mathbf{R}^{T}, q: \mathbf{R}^{d} \rightarrow\{1,2, \cdots, T\} ft(x)=wq(x),w∈RT,q:Rd→{1,2,⋯,T}
-
w: 从节点到权重的映射,长度为T的一维向量,T表示该树有 T个叶子节点,向量中每个数代表着对应叶子节点的权重
例: w1 = 3 (表示第1个叶子节点权重为3)
-
q(x): q代表着一颗树的结构(分段函数的区间),输出为[1,T],q(x) 表示将输入样本 x i ∈ R d x_{i} \in \mathbf{R}^{d} xi∈Rd 被树 q 预测后,落入的节点
例:q(x2) = 1 (表示输入样本 x2 在当前树的预测叶子节点为 1, 结合上述w的例子, f t ( x 2 ) = w q ( x 2 ) = w 1 = 3 f_{t}(x_{2})=w_{q(x_{2})}=w_{1}=3 ft(x2)=wq(x2)=w1=3)
5. 定义树的复杂度 Ω ( f t ) \Omega\left(f_{t}\right) Ω(ft)
Ω ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega\left(f_{t}\right)=\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} Ω(ft)=γT+21λj=1∑Twj2
-
γ \gamma γ : 叶子节点正则项,作用于叶子节点的个数
-
λ \lambda λ : 权值正则项,作用于叶子节点对应的权值
-
T: 叶子节点的数量
-
w j w_{j} wj: 第 t 颗树的第 j 个叶子节点权值
6. 叶子节点归组
将所有训练样本,按照叶子节点进行归组 I j = { i ∣ q ( x i ) = j } I_{j}=\left\{i \mid q\left(x_{i}\right)=j\right\} Ij={i∣q(xi)=j}
例:共有5个样本,3个叶子节点,其中落入第 1 个叶子节点的是 x1, 落入第 2 个叶子节点的是 x2, 落入第 3 个叶子节点的是 x3、x4、x5,那么 I 1 ∈ x 1 , I 2 ∈ x 2 , I 3 ∈ x 3 , x 4 , x 5 I_{1} \in x_{1}, I_{2} \in x_{2}, I_{3} \in x_{3},x_{4},x_{5} I1∈x1,I2∈x2,I3∈x3,x4,x5
利用归组后的样本,对目标函数进行改写:
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 + λ 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} Obj^{(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}\right) w_{j}^{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+λ21j=1∑Twj2=j=1∑T⎣⎡⎝⎛i∈Ij∑gi⎠⎞wj+21⎝⎛i∈Ij∑hi+λ⎠⎞wj2⎦⎤+γT
到这一步,已将所有落到同一个叶子节点的样本进行归组,目标函数化简成对所有叶子节点进行求累加和。
即从样本上的遍历,转换成在叶子节点上的遍历。
继续对导数进行定义:
G j = ∑ i ∈ I j g i H j = ∑ i ∈ I j h i \begin{aligned} G_{j}=\sum_{i \in I_{j}} g_{i} \\ H_{j}=\sum_{i \in I_{j}} h_{i} \end{aligned} Gj=i∈Ij∑giHj=i∈Ij∑hi
-
G j G_{j} Gj: 叶子节点 j 所包含的样本的一阶偏导累加和,常量
-
H j H_{j} Hj: 叶子节点 j 所包含的样本的二阶偏导累加和,常量
继续将 G j , H j G_{j}, H_{j} Gj,Hj 代入 O b j ( t ) Obj^{(t)} Obj(t) 进行化简
O b j ( t ) = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T \begin{aligned} Obj^{(t)} &=\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\\ &=\sum_{j=1}^{T}\left[G_{j} w_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) w_{j}^{2}\right]+\gamma T \end{aligned} Obj(t)=j=1∑T⎣⎡⎝⎛i∈Ij∑gi⎠⎞wj+21⎝⎛i∈Ij∑hi+λ⎠⎞wj2⎦⎤+γT=j=1∑T[Gjwj+21(Hj+λ)wj2]+γT
7. 求解最优值
根据高中知识,对于二次函数
y = a x 2 + b x + c y=a x^{2}+b x+c y=ax2+bx+c
其顶点坐标为
( − b 2 a , 4 a c − b 2 4 a ) (-\frac{b}{2a} ,\frac{4ac-b^{2}}{4a} ) (−2ab,4a4ac−b2)
那么,对于目标函数
O b j ( t ) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T Obj^{(t)} = \sum_{j=1}^{T}\left[G_{j} w_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) w_{j}^{2}\right]+\gamma T Obj(t)=j=1∑T[Gjwj+21(Hj+λ)wj2]+γT
其每个叶子节点 j 都是相对独立的一个部分,将其从中抽取出来,
G j w j + 1 2 ( H j + λ ) w j 2 G_{j} w_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) w_{j}^{2} Gjwj+21(Hj+λ)wj2
套入一元二次函数最值求解的公式
可以得到
w j ∗ = − b 2 a = − G j H j + λ w_{j}^{*}= -\frac{b}{2a} =-\frac{G_{j}}{H_{j}+\lambda} wj∗=−2ab=−Hj+λGj
第 t 颗树的最小损失
O b j ( t ) = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T O b j^{(t)}=-\frac{1}{2} \sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma T Obj(t)=−21j=1∑THj+λGj2+γT
上式可用作一个评分函数来衡量树结构的质量。分数越小,代表整个树的结构越好,这个评分类似于评价决策树的杂质评分,只是它是为更广泛的目标函数而推导的。
8. 分裂准则
一个节点到底该不该分裂,要看分裂后对比于分裂前的目标函数到底有没有减小
用分裂前的目标函数值减去分裂后的目标函数值,(注意目标函数的符号,为负号,不要将式子看成分裂后-分裂前)
I L I_L IL为每次分裂时分到左子树上的样本, I R I_R IR为每次分裂时分到右子树上的样本,有 I = I L ∪ I R I = I_L \cup I_R I=IL∪IR 。则在该次分裂后损失的减小量为:
G a i n = 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 + λ ] − γ Gain=\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 Gain=21[∑i∈ILhi+λ(∑i∈ILgi)2+∑i∈IRhi+λ(∑i∈IRgi)2−∑i∈Ihi+λ(∑i∈Igi)2]−γ
此处 γ \gamma γ 的作用相当于是一个阈值,即限定 Gain 只有大于 γ \gamma γ 时,才进行分裂,起到预剪枝的作用。
-
Gain > 0: 分裂后比分裂前的损失要小,因此可以进行分裂;
-
Gain < 0: 分裂后比分裂前的损失要大,因此不推荐分裂。
9. 最优点查找策略
- 精确贪心算法:对所有特征的所有可能的点全部进行遍历,贪心的每一步选择当前最优的划分节点
I n p u t : I , 当 前 节 点 的 实 例 集 I n p u t : d , 特 征 维 度 g a i n ← 0 G ← ∑ i ∈ I g i , H ← ∑ i ∈ I h i f o r k = 1 t o m d o G L ← 0 , H L ← 0 f o r j i n s o t r e d ( I , b y x j k ) d o G L ← G L + g i , H L ← H L + h i G R ← G − G L , H R ← H − H L s c o r e ← m a x ( s c o r e , G L 2 H L + λ + G R 2 H R + λ − G 2 H + λ ) e n d e n d \begin{aligned} &Input: I,当前节点的实例集\\ &Input: d,特征维度\\ &gain \gets 0\\ &G \gets \sum_{i\in I}g_{i} , H \gets \sum_{i\in I}h_{i}\\ &for \ k = 1 \ to \ m \ do\\ &\qquad G_{L} \gets 0, H_{L} \gets 0\\ &\qquad for \ j \ in \ sotred(I,by \ x_{jk}) \ do\\ &\qquad \qquad G_L \gets G_L+g_i,H_L \gets H_L+h_i\\ &\qquad \qquad G_R \gets G-G_L,H_R \gets H-H_L\\ &\qquad \qquad score \gets max(score, \frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{G^2}{H+\lambda})\\ &\qquad end\\ &end \end{aligned} Input:I,当前节点的实例集Input:d,特征维度gain←0G←i∈I∑gi,H←i∈I∑hifor k=1 to m doGL←0,HL←0for j in sotred(I,by xjk) doGL←GL+gi,HL←HL+hiGR←G−GL,HR←H−HLscore←max(score,HL+λGL2+HR+λGR2−H+λG2)endend
-
近似分裂算法贪心算法:对每个特征,只考察分位点,减少计算复杂度
有2中模式:
-
Global:学习每棵树前,提出候选切分点,在学习每棵树前,提前计算分位数,后续直接用即可
-
Local:每次分裂前,重新提出候选切分点
-