上海某私募的因子研究员把上一节的 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):把最终模型写成一族基学习器的累加,每一步只新拟合一项,前 m−1 项冻结。
Fm(x)=Fm−1(x)+η⋅hm(x),FM(x)=∑m=1Mη⋅hm(x)
这相当于在函数空间里做贪心梯度下降——把当前集成 Fm−1 看作函数空间里的一个点,沿哪个方向走?答案是负梯度。对样本损失 L(yi,F(xi)) 关于 F(xi) 求偏导、带入当前点,得到伪残差(pseudo-residual)
rim=−[∂F(xi)∂L(yi,F(xi))]F=Fm−1
把第 m 棵基学习器拟合到伪残差上:在样本 {(xi,rim)}i=1n 上跑一遍 CART,得到 hm。η(学习率,learning rate)是步长,与 2.5.2 那节梯度下降里的 α 同义——只是这里的「梯度」是函数,而不是 Rp 里的向量。
二、两个具体损失
把骨架特化到具体损失,直觉立刻清晰。
平方损失 L=21(y−F)2:伪残差化简为 rim=yi−Fm−1(xi)——即普通残差。「拟合负梯度」与「拟合残差」同义,CN 教材常称残差拟合;本节统一用负梯度拟合以适配更一般的损失。
对数损失 / 二元交叉熵 L=−yF+log(1+eF):求一次偏导得 rim=yi−σ(Fm−1(xi)),即概率残差——「真实标签 0/1」减去「当前模型预测的概率」。任何可导损失都可套这套机器:Huber、Quantile、Cox 风险回归共用一段代码,只换 objective 字符串。
三、产线化:正则化与早停
把这个 30 行的玩具拿到由动量(momentum)、价值、质量、分析师修正构成的 30 维因子模型(factor model)面板上,你会立刻撞见两件事:训练误差能压到任意低,但样本外误差先降后升——典型过拟合。正则化是把玩具变成产线模型的关键。按权重从高到低列五颗:
- 收缩 / 学习率 η:典型 0.01–0.1;η=1 等价于不收缩,立刻过拟合。
- 轮数 M:典型 500–5000,与 η 成反比——「小 η + 大 M」泛化更好,「大 η + 小 M」收敛快但偏差残留。
- 树形约束:max_depth(典型 3–8)、min_samples_per_leaf,控制每棵 hm 的容量。
- 行 / 列子采样:Friedman (2002) 称为随机梯度提升,LightGBM 默认 feature_fraction = 0.8。
- 叶权 L1 / L2 惩罚:21λ∑jwj2,直接进 XGBoost 的目标函数(下一节)。
早停(early stopping)是 η-vs-M 权衡的标准解药:在留出的验证集上监控损失,连续 50 轮无改善即停。
图 1:沪深300 因子面板上的验证损失 vs 提升轮数 M,三条曲线对应学习率 η∈{0.01,0.1,1.0}。η=1.0 在 ~20 轮处过拟合反弹;η=0.1 在 ~200 轮处反弹;η=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 把第 m 步的目标函数显式写出,做二阶 Taylor 展开,闭式解出最优叶权与分裂增益。正则化目标为
Lm=∑i=1nℓ(yi,Fm−1(xi)+hm(xi))+Ω(hm),Ω(hm)=γT+21λ∑j=1Twj2
其中 T = 叶节点数、wj = 第 j 个叶节点的输出权重、γ 惩罚叶数(等价剪枝)、λ 惩罚叶权大小。在 Fm−1 处对 ℓ 做二阶 Taylor 展开,记 gi=∂Fℓ∣Fm−1、hi=∂F2ℓ∣Fm−1:
Lm≈∑i=1n[gi⋅hm(xi)+21hi⋅hm(xi)2]+Ω(hm)
固定树的结构(每个叶节点上落了哪些样本),设第 j 个叶节点收集到的样本下标集为 Ij、Gj=∑i∈Ijgi、Hj=∑i∈Ijhi,目标函数解耦成 T 个一元二次型 Gjwj+21(Hj+λ)wj2。逐叶最小化即得
wj∗=−Hj+λGj,Gain=21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ
后者就是 XGBoost 评估分裂的「增益」准则——只要 Gain >0 就分,否则停。比 CART 的 Gini 增益多了两件:λ 起到岭式正则的作用、γ 提供一道复杂度惩罚的硬阈值。
五、玩具示例与练习
Exercise
给定 5 行回归数据 y=(3,5,7,9,11)、特征 x=(1,2,3,4,5),初始集成 F0=yˉ=7,学习率 η=0.1。
- 在平方损失下算出伪残差向量 r1。
- 在 x 上拟合一棵深度 1 的桩(stump),最优切点 x≤3 vs x>3,写出两侧的叶值。
- 更新到 F1(x)=F0+η⋅h1(x),算样本残差平方和(RSS)并验证 RSS 严格下降。
提示
第 1 步直接用平方损失的伪残差恒等式
ri1=yi−F0:
y 减去常数
7,即得
r1=(−4,−2,0,2,4)。零均值是巧合,因为
F0=yˉ。
提示
桩的叶值是落入叶的样本伪残差的均值:左叶
(−4−2+0)/3=−2,右叶
(2+4)/2=3。
F1 在左三点
=7+0.1×(−2)=6.8、在右两点
=7+0.1×3=7.3。RSS 从
∑(yi−7)2=40 降到
∑(yi−F1(xi))2=35.6——严格下降,但比一棵深度 5 的单树要慢得多,因为我们刻意走的是「弱学习器 + 小步长」。
Exercise
- 写出对数损失 L(y,F)=−yF+log(1+eF) 下的伪残差 rim,化简后验证它等于 yi−σ(Fm−1(xi))。
- 用 2–3 句话解释:为什么「小 η + 大 M」典型上比「大 η + 小 M」泛化更好?
提示
先把
L 对
F 求一次偏导:
∂L/∂F=−y+eF/(1+eF)=−y+σ(F);再取负号即得
rim=yi−σ(Fm−1(xi)),与平方损失「真实减预测」的结构一致——只是把恒等链接换成了 sigmoid 链接。
提示
把每一轮提升类比为梯度下降的一步:大
η 等价于大步长,容易越过最小值且对单棵树的拟合噪声过度敏感,验证 U 型曲线的底部被抬高;小
η + 大
M 在函数空间里走小碎步,平均掉单棵树的噪声——与神经网络「小学习率 + 长训练」泛化更好的现象同源。
六、XGBoost / LightGBM / CatBoost 的实践默认
三个产线实现,定位略不同:
- XGBoost(Chen & Guestrin 2016):精确(exact)与近似(approximate)分裂查找两套引擎,加权分位数草图(weighted quantile sketch)处理大样本;默认 η=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 从「树」换成「再生核希尔伯特空间(RKHS)中的函数」:同样的「线性预测 + 凸损失 + 正则化」骨架不变,但非线性来自一个完全不同的原语——核函数把 x 隐式映射到一个可能无限维的特征空间,再在那个空间里做线性预测。换一个非线性发动机,继续。