← 返回模块
Q2.6.2.3beta 可读 · 未来付费内容校验中内容版本 2026-05-26

梯度提升与 XGBoost / LightGBM

2.6.2 · 树模型与核方法 · 数学与统计能力

上海某私募的因子研究员把上一节的 500 棵随机森林训完,沪深300 + 中证500 上的样本外准确率 57%——比单棵深树的 51% 上了 6 个点。她把 max_features 从 sqrt(p) 调到 p/3、把树数加到 2000,准确率纹丝不动停在 57.2%——bagging 的方差红利已经吃干净了。PM 在因子复盘会上一句话:「方差降到底了,把偏差再压下去。」她把代码改了三行:RandomForestClassifier 换成 lgb.LGBMClassifier,加上 learning_rate=0.05、max_depth=6,挂上 early_stopping_rounds=50。等模型训完,样本外准确率 61%,信息比率(information ratio, IR)从 0.10 跳到 0.16——4 个点的纯偏差红利。这 4 个点从哪来?为什么是 LightGBM 而不是再加 1500 棵树?本节把「装袋(bagging)是降方差、提升(boosting)是降偏差」这条对立结构拆成一段算理。

一、前向分步加法模型与负梯度方向

提升方法的源头是 Freund-Schapire (1997) 的 AdaBoost——对错分样本重新加权后迭代。Friedman (2001) 把这条思路抽象成​​前向分步加法模型​​(forward-stage-wise additive model):把最终模型写成一族基学习器的累加,每一步只新拟合一项,前 m1m-1 项冻结。

Fm(x)=Fm1(x)+ηhm(x),FM(x)=m=1Mηhm(x)F_m(x) = F_{m-1}(x) + \eta \cdot h_m(x), \quad F_M(x) = \sum_{m=1}^{M} \eta \cdot h_m(x)

这相当于在函数空间里做贪心梯度下降——把当前集成 Fm1F_{m-1} 看作函数空间里的一个点,沿哪个方向走?答案是负梯度。对样本损失 L(yi,F(xi))L(y_i, F(x_i)) 关于 F(xi)F(x_i) 求偏导、带入当前点,得到​​伪残差​​(pseudo-residual)

rim=[L(yi,F(xi))F(xi)]F=Fm1r_{im} = -\left[\dfrac{\partial L(y_i, F(x_i))}{\partial F(x_i)}\right]_{F = F_{m-1}}

把第 mm 棵基学习器拟合到伪残差上:在样本 {(xi,rim)}i=1n\{(x_i, r_{im})\}_{i=1}^{n} 上跑一遍 CART,得到 hmh_mη\eta(学习率,learning rate)是步长,与 2.5.2 那节梯度下降里的 α\alpha 同义——只是这里的「梯度」是函数,而不是 Rp\mathbb{R}^p 里的向量。

二、两个具体损失

把骨架特化到具体损失,直觉立刻清晰。

​平方损失​ L=12(yF)2L = \tfrac{1}{2}(y - F)^2:伪残差化简为 rim=yiFm1(xi)r_{im} = y_i - F_{m-1}(x_i)——即普通残差。「拟合负梯度」与「拟合残差」同义,CN 教材常称​​残差拟合​​;本节统一用​​负梯度拟合​​以适配更一般的损失。

​对数损失 / 二元交叉熵​ L=yF+log(1+eF)L = -y F + \log(1 + e^F):求一次偏导得 rim=yiσ(Fm1(xi))r_{im} = y_i - \sigma(F_{m-1}(x_i)),即​​概率残差​​——「真实标签 0/1」减去「当前模型预测的概率」。任何可导损失都可套这套机器:Huber、Quantile、Cox 风险回归共用一段代码,只换 objective 字符串。

三、产线化:正则化与早停

把这个 30 行的玩具拿到由动量(momentum)、价值、质量、分析师修正构成的 30 维因子模型(factor model)面板上,你会立刻撞见两件事:训练误差能压到任意低,但样本外误差先降后升——典型过拟合。​​正则化​​是把玩具变成产线模型的关键。按权重从高到低列五颗:

  • ​收缩 / 学习率​ η\eta:典型 0.01–0.1;η=1\eta = 1 等价于不收缩,立刻过拟合。
  • ​轮数 MM​​​:典型 500–5000,与 η\eta 成反比——「小 η\eta + 大 MM」泛化更好,「大 η\eta + 小 MM」收敛快但偏差残留。
  • ​树形约束​​:max_depth(典型 3–8)、min_samples_per_leaf,控制每棵 hmh_m 的容量。
  • ​行 / 列子采样​​:Friedman (2002) 称为​​随机梯度提升​​,LightGBM 默认 feature_fraction = 0.8。
  • ​叶权 L1 / L2 惩罚​​:12λjwj2\tfrac{1}{2}\lambda \sum_j w_j^2,直接进 XGBoost 的目标函数(下一节)。

​早停​​(early stopping)是 η\eta-vs-MM 权衡的标准解药:在留出的验证集上监控损失,连续 50 轮无改善即停。

​图 1​​:沪深300 因子面板上的验证损失 vs 提升轮数 MM,三条曲线对应学习率 η{0.01,0.1,1.0}\eta \in \{0.01,\,0.1,\,1.0\}η=1.0\eta = 1.0 在 ~20 轮处过拟合反弹;η=0.1\eta = 0.1 在 ~200 轮处反弹;η=0.01\eta = 0.01 在 ~3000 轮处反弹。早停虚线钉在每条曲线的最低点——这正是「U 型」的几何画像。

Formula Explorer

V(M, \eta) = V_0 \cdot \exp(-\eta M) + \alpha \cdot (\eta M)^2

四、XGBoost 的目标函数与二阶展开

Chen & Guestrin (2016, 陈天奇) 的 XGBoost 把第 mm 步的目标函数显式写出,做二阶 Taylor 展开,​​闭式​​解出最优叶权与分裂增益。正则化目标为

Lm=i=1n ⁣(yi,Fm1(xi)+hm(xi))+Ω(hm),Ω(hm)=γT+12λj=1Twj2\mathcal{L}_m = \sum_{i=1}^{n} \ell\!\left(y_i,\, F_{m-1}(x_i) + h_m(x_i)\right) + \Omega(h_m), \quad \Omega(h_m) = \gamma T + \tfrac{1}{2}\lambda \sum_{j=1}^{T} w_j^2

其中 TT = 叶节点数、wjw_j = 第 jj 个叶节点的输出权重、γ\gamma 惩罚叶数(等价剪枝)、λ\lambda 惩罚叶权大小。在 Fm1F_{m-1} 处对 \ell 做二阶 Taylor 展开,记 gi=FFm1g_i = \partial_F \ell|_{F_{m-1}}hi=F2Fm1h_i = \partial_F^2 \ell|_{F_{m-1}}:

Lmi=1n[gihm(xi)+12hihm(xi)2]+Ω(hm)\mathcal{L}_m \approx \sum_{i=1}^{n} \left[ g_i \cdot h_m(x_i) + \tfrac{1}{2} h_i \cdot h_m(x_i)^2 \right] + \Omega(h_m)

固定树的结构(每个叶节点上落了哪些样本),设第 jj 个叶节点收集到的样本下标集为 IjI_jGj=iIjgiG_j = \sum_{i \in I_j} g_iHj=iIjhiH_j = \sum_{i \in I_j} h_i,目标函数解耦成 TT 个一元二次型 Gjwj+12(Hj+λ)wj2G_j w_j + \tfrac{1}{2}(H_j + \lambda) w_j^2。逐叶最小化即得

wj=GjHj+λ,Gain=12[GL2HL+λ+GR2HR+λ(GL+GR)2HL+HR+λ]γw_j^* = -\dfrac{G_j}{H_j + \lambda}, \quad \mathrm{Gain} = \tfrac{1}{2}\left[\dfrac{G_L^2}{H_L + \lambda} + \dfrac{G_R^2}{H_R + \lambda} - \dfrac{(G_L + G_R)^2}{H_L + H_R + \lambda}\right] - \gamma

后者就是 XGBoost 评估分裂的「增益」准则——只要 Gain >0> 0 就分,否则停。比 CART 的 Gini 增益多了两件:λ\lambda 起到岭式正则的作用、γ\gamma 提供一道复杂度惩罚的硬阈值。

五、玩具示例与练习

Exercise

给定 5 行回归数据 y=(3,5,7,9,11)y = (3, 5, 7, 9, 11)、特征 x=(1,2,3,4,5)x = (1, 2, 3, 4, 5),初始集成 F0=yˉ=7F_0 = \bar{y} = 7,学习率 η=0.1\eta = 0.1

  1. 在平方损失下算出伪残差向量 r1r_1
  2. xx 上拟合一棵深度 1 的桩(stump),最优切点 x3x \le 3 vs x>3x > 3,写出两侧的叶值。
  3. 更新到 F1(x)=F0+ηh1(x)F_1(x) = F_0 + \eta \cdot h_1(x),算样本残差平方和(RSS)并验证 RSS 严格下降。
提示
第 1 步直接用平方损失的伪残差恒等式 ri1=yiF0r_{i1} = y_i - F_0:yy 减去常数 77,即得 r1=(4,2,0,2,4)r_1 = (-4, -2, 0, 2, 4)。零均值是巧合,因为 F0=yˉF_0 = \bar{y}
提示
桩的叶值是落入叶的样本伪残差的均值:左叶 (42+0)/3=2(-4 - 2 + 0)/3 = -2,右叶 (2+4)/2=3(2 + 4)/2 = 3F1F_1 在左三点 =7+0.1×(2)=6.8= 7 + 0.1 \times (-2) = 6.8、在右两点 =7+0.1×3=7.3= 7 + 0.1 \times 3 = 7.3。RSS 从 (yi7)2=40\sum (y_i - 7)^2 = 40 降到 (yiF1(xi))2=35.6\sum (y_i - F_1(x_i))^2 = 35.6——严格下降,但比一棵深度 5 的单树要慢得多,因为我们刻意走的是「弱学习器 + 小步长」。

Exercise

  1. 写出对数损失 L(y,F)=yF+log(1+eF)L(y, F) = -y F + \log(1 + e^F) 下的伪残差 rimr_{im},化简后验证它等于 yiσ(Fm1(xi))y_i - \sigma(F_{m-1}(x_i))
  2. 用 2–3 句话解释:为什么「小 η\eta + 大 MM」典型上比「大 η\eta + 小 MM」泛化更好?
提示
先把 LLFF 求一次偏导:L/F=y+eF/(1+eF)=y+σ(F)\partial L / \partial F = -y + e^F / (1 + e^F) = -y + \sigma(F);再取负号即得 rim=yiσ(Fm1(xi))r_{im} = y_i - \sigma(F_{m-1}(x_i)),与平方损失「真实减预测」的结构一致——只是把恒等链接换成了 sigmoid 链接。
提示
把每一轮提升类比为梯度下降的一步:大 η\eta 等价于大步长,容易越过最小值且对单棵树的拟合噪声过度敏感,验证 U 型曲线的底部被抬高;小 η\eta + 大 MM 在函数空间里走小碎步,平均掉单棵树的噪声——与神经网络「小学习率 + 长训练」泛化更好的现象同源。

六、XGBoost / LightGBM / CatBoost 的实践默认

三个产线实现,定位略不同:

  • ​XGBoost​​(Chen & Guestrin 2016):精确(exact)与近似(approximate)分裂查找两套引擎,​​加权分位数草图​​(weighted quantile sketch)处理大样本;默认 η=0.3\eta = 0.3、max_depth = 6。Kaggle 表格赛十年统治者。
  • ​LightGBM​​(Ke et al. 2017):​​直方图分裂​​(histogram-based splits)、​​叶向生长​​(leaf-wise growth)、GOSS(基于梯度的单边采样)与 EFB(互斥特征捆绑)三件套,内存与时间各降一个量级。是当下 CN 私募 alpha 模型的事实基线,比 XGBoost 快 3–10 倍,信息比率层面持平。
  • ​CatBoost​​(Prokhorenkova et al. 2018):​​有序提升​​(ordered boosting)与原生类别变量处理,在高基数类别特征(行业代码、概念板块)上免去 one-hot 展开;训练略慢。

任选其一,模型骨架交付后还有两件事必须留到 2.6.5「量化金融中的机器学习」单独处理:T+1 结算下的​​滚动 / 隔离样本切分​​,以及 Alpha 衰减(alpha decay)如何让今天最优的早停轮数明天就失效。最终评判标准——夏普比率(Sharpe ratio)与信息比率——并不在本节这套机器里,而在样本外回测里:本节交付工具,不是终点。

七、过渡:从树到核

到这里你已经能把上一节的随机森林切换成 LightGBM 早停管线,把 4 个点的偏差红利吃到手里。整段算理只用了树这一个假设类——递归分割构造的分段常数函数。下一课要把假设类 H\mathcal{H} 从「树」换成「再生核希尔伯特空间(RKHS)中的函数」:同样的「线性预测 + 凸损失 + 正则化」骨架不变,但非线性来自一个完全不同的原语——核函数把 xx 隐式映射到一个可能无限维的特征空间,再在那个空间里做线性预测。换一个非线性发动机,继续。