GBDT与xgboost
1. 泰勒公式
定义:泰勒公式是一个用函数在某点的信息描述其附近取值的公式。 局部有效性
基本形式: f(x) = ∑∞n=0f(n)(x0)n!(x−x0)n f ( x ) = ∑ n = 0 ∞ f ( n ) ( x 0 ) n ! ( x − x 0 ) n
- 一阶泰勒展开: f(x)≈f(x0)+f′(x0)(x−x0) f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 )
- 二阶泰勒展开: f(x)≈f(x0)+f′(x0)(x−x0)+f′′(x0)(x−x0)22 f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ″ ( x 0 ) ( x − x 0 ) 2 2
- 迭代形式:假设
xt=xt−1+Δx
x
t
=
x
t
−
1
+
Δ
x
,将
f(xt)
f
(
x
t
)
在
xt−1
x
t
−
1
处进行泰勒展开:
f(xt)=f(xt−1+Δx)≈f(xt−1)+f′(xt−1)Δx+f′′(xt−1)Δx22(1)(2) (1) f ( x t ) = f ( x t − 1 + Δ x ) (2) ≈ f ( x t − 1 ) + f ′ ( x t − 1 ) Δ x + f ″ ( x t − 1 ) Δ x 2 2
2. 梯度下降法(Gradient Descend Method)
在机器学习任务中, 需要最小化损失函数 L(θ) L ( θ ) , 其中 θ θ 是要求解的模型参数。 梯度下降法常用来求解这种无约束最优化问题, 它是一种迭代方法: 选取初值 θ0 θ 0 , 不断迭代, 更新 θ θ 的值, 进行损失函数的极小化。
- 迭代公式: θ=θt−1+Δθ θ = θ t − 1 + Δ θ
将 L(θt) L ( θ t ) 在 θt−1 θ t − 1 处进行一阶泰勒展开:
L(θt)=L(θt−1+Δθ)≈L(θt−1)+L′(θt−1)Δθ(3)(4) (3) L ( θ t ) = L ( θ t − 1 + Δ θ ) (4) ≈ L ( θ t − 1 ) + L ′ ( θ t − 1 ) Δ θ要使得 L(θt)<L(θt−1) L ( θ t ) < L ( θ t − 1 ) ,可使: Δθ=−αL′(θt−1) Δ θ = − α L ′ ( θ t − 1 ) ,则: θt=θt−1−αL′(θt−1) θ t = θ t − 1 − α L ′ ( θ t − 1 )
这里 α α 是步长,可通过 line search 确定,但一般直接赋一个小的数。
3. 牛顿法(Newton’s Method)
将 L(θt) L ( θ t ) 在 θt−1 θ t − 1 处进行二阶泰勒展开:
L(θt)=L(θt−1+Δθ)≈L(θt−1)+L′(θt−1)Δθ+L′′(θt−1)Δθ22(5)(6) (5) L ( θ t ) = L ( θ t − 1 + Δ θ ) (6) ≈ L ( θ t − 1 ) + L ′ ( θ t − 1 ) Δ θ + L ″ ( θ t − 1 ) Δ θ 2 2
为了简化分析过程,假设参数是标量(即 θ θ 只有一维),则可将一阶和二阶导数分别记为 g g 和 :
L(θt)≈L(θt−1)+gΔθ+hΔθ22 L ( θ t ) ≈ L ( θ t − 1 ) + g Δ θ + h Δ θ 2 2要使得 L(θt) L ( θ t ) 极小,即让 gΔθ+hΔθ22 g Δ θ + h Δ θ 2 2 极小,可令: ∂(gΔθ+hΔθ22)∂Δθ=0 ∂ ( g Δ θ + h Δ θ 2 2 ) ∂ Δ θ = 0
求得 Δθ=−gh Δ θ = − g h ,故: θt=θt−1+Δθ=θt−1−gh θ t = θ t − 1 + Δ θ = θ t − 1 − g h
参数 θ θ 推广到向量形式,迭代公式: θt=θt−1−H−1g θ t = θ t − 1 − H − 1 g
这里 H H 是海森矩阵
4. 从参数空间到函数空间
- GBDT 在函数空间中利用梯度下降法进行优化
- XGBoost 在函数空间中用牛顿法进行优化
注:实际上GBDT泛指所有梯度提升树算法, 包括XGBoost, 它也是GBDT的一种变种, 这里为了区分它们, GBDT特指“Greedy Function Approximation: A Gradient Boosting Machine” 里提出的算法, 它只用了一阶导数信息。
5. Gradient Boosting Tree 算法原理
- Friedman于论文” Greedy Function Approximation…”中最早提出GBDT
其模型 定义为加法模型:
F(x;w)=∑t=0Tαtht(x;wt)=∑t=0Tft(x;wt) F ( x ; w ) = ∑ t = 0 T α t h t ( x ; w t ) = ∑ t = 0 T f t ( x ; w t )
其中, x x 为输入样本, 为分类回归树, w w 是分类回归树的参数, 是每棵树的权重。通过最小化损失函数求解最优模型:
F∗=argminF∑i=0NL(yi,F(xi;w)) F ∗ = a r g min F ∑ i = 0 N L ( y i , F ( x i ; w ) )
NP难问题 -> 通过贪心法, 迭代求局部最优解
6. 详解 XGBoost
6.1 模型函数形式
给定数据集
D={(Xi,yi)}
D
=
{
(
X
i
,
y
i
)
}
,XGBoost进行 additive training, 学习K棵树, 采用以下函数对样本进行预测:
这里 F F 是假设空间, 是回归树(CART):
q(x) q ( x ) 表示将样本 x x 分到了某个叶子节点上, 是叶子节点的分数(leaf score),所以 wq(x) w q ( x ) 表示回归树对样本的预测值
- 例子:预测一个人是否喜欢电脑游戏
回归树的预测输出是实数分数, 可以用于回归、 分类、 排序等任务中。 对于回归问题, 可以直接作为目标值, 对于分类问题, 需要映射成概率, 比如采用逻辑函数: σ(x)=11+e−z σ ( x ) = 1 1 + e − z
6.2 目标函数
- 参数空间中的目标函数:
误差函数可以是square loss, logloss等, 正则项可以是L1正则,L2正则等。
Ridge Regression(岭回归) :
∑ni=1(yi−θTxi)2+λ||θ||2
∑
i
=
1
n
(
y
i
−
θ
T
x
i
)
2
+
λ
|
|
θ
|
|
2
LASSO:
∑ni=1(yi−θTxi)2+λ||θ||1
∑
i
=
1
n
(
y
i
−
θ
T
x
i
)
2
+
λ
|
|
θ
|
|
1
6.3 正则项
XGBoost的目标函数(函数空间)
L(ϕ)=∑il(yi^,yi)+∑kΩ(fk) L ( ϕ ) = ∑ i l ( y i ^ , y i ) + ∑ k Ω ( f k )
正则项对每棵回归树的复杂度进行了惩罚相比原始的GBDT, XGBoost的目标函数多了正则项, 使得学习出来的模型更加不容易过拟合。
- 有哪些指标可以衡量树的复杂度?
树的深度, 内部节点个数, 叶子节点个数(T), 叶节点分数(w)…
XGBoost采用的:
Ω(f)=γT+12λ||w||2 Ω ( f ) = γ T + 1 2 λ | | w | | 2
对叶子节点个数进行惩罚, 相当于在训练过程中做了剪枝
6.4 误差函数的二阶泰勒展开
第 t t 次迭代后, 模型的预测等于前 次的模型预测加上第 t t 棵树的预测:
此时目标函数可写作:
L(t)=∑inl(yi^(t−1)+ft(xi),yi)+Ω(ft) L ( t ) = ∑ i n l ( y i ^ ( t − 1 ) + f t ( x i ) , y i ) + Ω ( f t )
公式中 yi y i , yi^(t−1) y i ^ ( t − 1 ) 都已知, 模型要学习的只有第 t t 棵树将误差函数在 yi^(t−1) y i ^ ( t − 1 ) 处进行二阶泰勒展开:
L(t)≃∑i=1n[l(yi,y^(t−1))+gift(xi)+12hif2t(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 )
公式中, gi=∂y^(t−1)l(yi,y^(t−1))hi=∂2y^(t−1)l(yi,y^(t−1)) g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) )将公式中的常数项去掉, 得到:
L˜(t)=∑i=1n[gift(xi)+12hif2t(xi)]+Ω(ft) L ~ ( t ) = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t )把 ft f t , Ω(ft) Ω ( f t ) 写成树结构的形式, 即把下式代入目标函数中
f(x)=wq(x)Ω(f)=γT+12λ||w||2 f ( x ) = w q ( x ) Ω ( f ) = γ T + 1 2 λ | | w | | 2得到:
L˜(t)=∑i=1n[gift(xi)+12hif2t(xi)]+Ω(ft)=∑i=1n[giwq(xi)+12hiw2q(x)]+γT+λ12∑j=1Tw2j(7)(8) (7) L ~ ( t ) = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) (8) = ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x ) 2 ] + γ T + λ 1 2 ∑ j = 1 T w j 2
上面第一个 ∑ ∑ 是对样本累加,第二个 ∑ ∑ 是对叶节点累加,如何统一起来呢?定义每个叶节点 j j 上的样本集合为:
则目标函数可以写成按叶节点累加的形式:
L˜(t)=∑j=1T⎡⎣(∑i∈Ijgi)wj+12(∑i∈Ijhi+λ)w2j⎤⎦+γT=∑j=1T[Gjwj+12(Hj+λ)w2j]+γT(9)(10) (9) L ~ ( t ) = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T (10) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T如果确定了树的结构(即 q(x) q ( x ) 确定) , 为了使目标函数最小, 可以令其导数为 0, 解得每个叶节点的最优预测分数为:
w∗j=− GjHj+λ w j ∗ = − G j H j + λ
代入目标函数, 得到最小损失为:
L˜∗=− 12∑j=1TG2jHj+λ+γT L ~ ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T
6.5 回归树的学习策略
- 当回归树的结构确定时, 我们前面已经推导出其最优的叶节点分数以及对应的最小损失值, 问题是怎么确定树的结构?
暴力枚举所有可能的树结构, 选择损失值最小的 - NP难问题
贪心法, 每次尝试分裂一个叶节点, 计算分裂前后的增益, 选择增益最大的
- 分裂前后的增益怎么计算?
ID3算法采用信息增益
C4.5算法采用信息增益比
CART采用Gini系数
XGBoost呢?
6.6 XGBoost 的打分函数
G2jHj+λ G j 2 H j + λ 衡量了每个叶子节点对总体损失的的贡献, 我们希望损失越小越好, 则其值越大越好。
因此, 对一个叶子节点进行分裂, 分裂前后的增益定义为:
Gain G a i n 的值越大, 分裂后 L L 减小越多。 所以当对一个叶节点分割时, 计算所有候选(feature,value)对应的 gain, 选取 gain 最大的进行分割