7.1 XGBoost LightGBM

我们在 上篇笔记 中看到了 boosting 的基本思想, 以及和树模型结合后的 GBDT 模型. XGBoost 和 LightGBM 是对此的工程优化.

1 XGBoost

XGBoost 是大规模并行 boosting tree 的工具.

1.1 数学原理

1.1.1 目标函数

回到 GBDT 的基本假设: 由 k 个基模型构成的加法算式 y^i=t=1kft(xi) 以及损失函数 L=i=1nl(yi,y^i).
在损失函数中我们加入正则项 Ω, 目标函数变为 O(t)=i=1nl(yi,y^it)+i=1tΩ(fi)=i=1nl(yi,y^it1+ft(xi))+i=1tΩ(fi).
(这里我们使用了 Boosting 加法模型的基本假设: y^it=y^it1+ft(xi)). 根据 Taylor公式, O(t)=i=1n[l(yi,y^it1)+gift(xi)+12hift2(xi)]+i=1tΩ(fi). 这里自变量是 y^it1. 假设 l 是平方损失函数, 即 l(yi,y^it1+ft(xi))=(y^it1+ft(xi)yi)2, 则应用 Taylor 公式, 展开后为 gi=y^t1(y^t1yi)2=2(y^t1yi),hi=2(y^t1)2(y^t1yi)2=2.
在第 t 步, y^it1 已知, 所以 l(yi,y^it1) 是常数, 因此最后的目标函数就是

+i=1tΩ(fi).

根据这个目标函数得到每一步的 f(x), 即可组合出整体模型.

1.1.2 基于决策树的目标函数

现在将基模型引入 决策树. 记为 ft(x)=wq(x), x 为样本, q(x) 代表 x 所在的叶子节点. 记树的叶子数为 T, 每个叶子节点权重为 w, 则可定义 (1.1) 的正则项为 Ω(ft)=γT+12λj=1Twj2.
代入 (1.1): O(t)=j=1T[(iIjgi)wj+12(iIjhi+λ)wj2]+λT, 这里 Ij={i|q(xi)=j} 为第 j 个叶子节点的样本集合. 简记 Gj=iIjgi,Hj=iIjhi, 则目标函数变为 O(t)=j=1T[Gjwj+12(Hj+λ)wj2]+λT. 这里 Gj,Hj 是前 t1 步得到的结果可以视为常数; 对 wj 求导, 得到 wj=GjHj+λ, 则目标函数为

(1.2)O(t)=12j=1TGj2Hj+λ+γT.

1.1.3 树的划分

  1. 贪心算法: 在第 t 步, 训练一棵决策树; 首先它是一棵深度为 0 的树, 然后枚举可用特征. 对每个特征, 将样本对应的值升序排列, 线性扫描来决定最佳分裂点, 记录分裂收益, 选取收益最大的特征和分裂点, 以此类推. 这样, 分裂前的目标函数为 O1=12[(GL+GR)2HL+HR+λ]+λ, 分裂后为 O2=12[GL2HL+λ+GR2HR+λ]+2λ, 则分裂后的收益为
\mathrm{Gain}=\frac{1}{2}\left[\frac{G_{L}^{2}}{H_{L}+\lambda}+\frac{G_{R { #2} }}{H_{R}+\lambda}-\frac{(G_{L}+G_{R})^{2}}{H_{L}+H_{R}+\lambda}\right]-\gamma.

只需从左到右扫描一次, 就可以计算每个分割方案的收益.
2. 近似算法: 缓解贪心算法的内存读写压力. 对每个特征, 首先根据特征分布的分位数提出候选划分点, 然后将连续特征映射到这些候选点划分的桶中, 最后找到所有区间的最佳分裂点. 候选切分点有两种策略:
- Global (per tree): 每次学树前提出候选切分点, 每次分裂都采用这种分割; 需要更多的候选点.
- Local (per split): 每次分裂前重新提出候选切分点, 需要更多的计算步骤.

切分点近似算法

  • 对每个特征 k: 依据分位数得到候选集合 Sk={sk1,,skl}. 依据 Global 或 Local 策略.
  • 对每个特征的候选集合, 将样本映射到该特征对应候选点集构成的分桶区间中, 即 sk,vxjk>sk,v1. 对每个桶统计 G,H 值, 然后寻找最佳分裂点. 也即 Gkvj{j|sk,vxjk>sk,v1}gj,Hkvj{j|sk,vxjk>sk,v1}hj.

1.1.4 加权分位数

1.2 优缺点

2 LightGBM

主要用于解决 GBDT 在海量数据时遇到的问题, 内存占用显著更少.

2.1 数学原理

2.1.1 单边梯度抽样算法 GOSS

[1]
GBDT 中, 梯度反映了样本的权重, 梯度越小则模型拟合的约好(已经接近最好, 减小变得平缓). 所以, 只需要关注梯度高的样本, 来减小计算量.
为此, GOSS 对梯度小的样本进行随机抽样, 并引入常数进行总体样本数据分布的平衡.

具体而言, 首先对梯度的绝对值排序, 取前 a% 大的样本, 和总体样本的 b%. 在计算增益时, 乘上 1ab 来放大梯度小的样本的权重.

2.1.2 直方图算法

也即 特征离散化, 将连续的特征变为 k 个离散特征, 这样分裂时复杂度从 O(n) 下降到 O(k).

2.1.3 互斥特征捆绑算法 EFB

[2]

这是为了解决高维特征的稀疏性. 用互斥率表示两个特征的互斥程度(是否同时取非零值). 我们关心如何找到可以绑定的特征, 以及绑定后特征值如何确定. 这里使用 贪心法 来解决 NP-Hard 的加权无向图的图着色算法:

时间复杂度是 O(#feature2). 进一步优化为: 根据非零值的计数排序而非节点的度.

接下来给出特征合并算法, 它为了确保原始的特征能从合并的特征中分离出来, 为此平移每个特征的取值范围使它们互不相交然后合并在一起. [3]

特性 XGBoost LightGBM 说明
决策树生长策略 Level-wise (按层生长) Leaf-wise (按叶子生长) Leaf-wise 在分裂次数相同时能更快降低误差,获得更高精度,但更容易过拟合
切分点查找算法 预排序算法 直方图算法 直方图算法无需存储排序数据,内存消耗小,计算速度更快
并行策略 特征并行 & 数据并行 特征并行 & 数据并行 (优化) LightGBM 采用 Reduce Scatter 机制,通信成本远低于 XGBoost
类别特征处理 需手动编码 (如 One-Hot) 可直接处理 LightGBM 内置高效类别特征处理算法,无需手动编码且效果通常更好

  1. Gradient-based One-Side Sampling ↩︎

  2. Exclusive Feature Bundling ↩︎

  3. 例如 A[0,10],B[0,20], 则 B 平移到 [10,30], 合并为 [0,30]. ↩︎