第 4 章 · 03 决策树与随机森林


文档摘要

第 4 章 · 03 决策树与随机森林 本节摘要:上节讲 SVM 用核技巧处理非线性,本节换一条完全不同的路——决策树。决策树用「if-else 规则」递归划分特征空间,天然捕捉非线性与交互效应,且可解释性极强(树本身就是规则),是另一种处理非线性的思路。但单棵决策树极不稳定——换一点数据,树的结构就大变。随机森林(Random Forest)通过 bagging(bootstrap aggregating)与特征随机把多棵不稳定树组合成稳健的强模型,同时提供特征重要性与OOB 评估。华泰人工智能系列第 4-5 篇系统测试了决策树与随机森林在 A 股选股的效果,核心结论是:随机森林在样本外常显著优于单棵树,且特征重要性是它的核心副产品——能告诉你「哪些因子真的有用」。

第 4 章 · 03 决策树与随机森林

本节摘要:上节讲 SVM 用核技巧处理非线性,本节换一条完全不同的路——决策树。决策树用「if-else 规则」递归划分特征空间,天然捕捉非线性与交互效应,且可解释性极强(树本身就是规则),是另一种处理非线性的思路。但单棵决策树极不稳定——换一点数据,树的结构就大变。随机森林(Random Forest)通过 bagging(bootstrap aggregating)与特征随机把多棵不稳定树组合成稳健的强模型,同时提供特征重要性OOB 评估。华泰人工智能系列第 4-5 篇系统测试了决策树与随机森林在 A 股选股的效果,核心结论是:随机森林在样本外常显著优于单棵树,且特征重要性是它的核心副产品——能告诉你「哪些因子真的有用」。读完本节,你理解集成学习的第一种范式(bagging),为下节的 Boosting 打基础。

内容来源:仓库研报 华泰人工智能系列第 4-5 篇(决策树与随机森林),知识结构化整理。

⚠️ 学习提示:随机森林是「入门机器学习的明星模型」——好调参、不易过拟合、出特征重要性,是工业级基线的强有力竞争者。

学习目标

阅读完本节,你应当能够:

  1. 解释决策树如何用 if-else 规则递归划分特征空间。
  2. 说清单棵树的不稳定性及其原因。
  3. 描述 bagging特征随机如何让随机森林稳定下来。
  4. 理解特征重要性OOB 评估两个核心副产品。
  5. 知道随机森林相对 SVM、线性模型的优劣。

一、决策树:用 if-else 规则分治

决策树(Decision Tree)从根节点开始,每次选一个特征与阈值,把数据按「特征 ≤ 阈值」与「特征 > 阈值」分成两支,递归直到满足停止条件(纯节点、深度上限、样本数下限)。

根节点(所有股票) ├─ PE < 15 ? │ ├─ 是 → ROE > 15% ? → 是:买入类 / 否:观望类 │ └─ 否 → 动量 > 0 ? → 是:持有类 / 否:卖出类

划分标准(分类):常用基尼系数信息增益——选能让两支「最纯」(同类样本占比最高)的特征与阈值。

决策树的优点:

  • 可解释性极强:树本身就是一组 if-else 规则,非技术同事也能看懂。
  • 处理非线性:每个划分本质上是「在某特征上做阈值分割」,组合起来能拟合任意边界。
  • 处理交互效应:深层的划分是建立在前一层条件上的,自然捕捉因子交互。
  • 无需标准化:树按阈值分割,特征尺度不影响结果。
  • 处理缺失:某些树实现(如 C4.5)能直接处理缺失值。

二、单棵树的致命弱点:不稳定

单棵决策树有一个致命问题——极不稳定。训练数据稍微变动(去掉几个样本、加几个新数据),最优划分点可能完全不同,整棵树结构大变。

为什么不稳定:

  • 贪心算法:树每次只看当前最优划分,不回溯;某个特征在前一层选了,后续结构就完全依赖这个选择。
  • 高方差:树深时,每个叶节点样本少,预测对训练数据极度敏感。
  • 特征竞争:两个相关性高的特征,选哪个作为划分特征几乎随机,但选了之后结构就不同。

这与上节 SVM 的稳健性截然相反——单棵树是高方差低偏差模型,需要集成方法稳定它。

💡 核心心法:决策树的不稳定性本质是「贪心 + 高方差」。集成学习(bagging 与 boosting)的核心思想都是「用多棵树投票/加权,降低方差或偏差」。

三、Bagging:Bootstrap 聚合

Bagging(Bootstrap Aggregating)是降低方差的标准方法:

  1. 有放回抽样:从训练集有放回地抽 N 个样本,形成一个 bootstrap 子集(约 63% 的样本会出现,37% 不出现)。
  2. 训练多棵树:对每个 bootstrap 子集训练一棵决策树。
  3. 投票/平均:多棵树预测结果投票(分类)或平均(回归)。

为什么有效:多棵不稳定的树,每棵在不同 bootstrap 子集上训练,它们的「随机误差」互相独立,投票后大幅抵消——这是大数定律的应用。

四、随机森林:Bagging + 特征随机

随机森林(Random Forest)在 bagging 基础上加了特征随机——每次划分时,只在随机选的 m 个特征里找最优划分,而不是所有特征。

m 通常取 √(总特征数) 或 总特征数/3

为什么需要特征随机:

  • 如果某个特征主导(如市值因子很强),所有 bootstrap 子集的树都会优先用它 → 树之间高度相关 → 投票抵消效果差。
  • 强制每次只看部分特征,不同树会选不同特征 → 树之间去相关 → 投票抵消更好。

随机森林 = Bagging + 特征随机,是工业级决策树集成的标准形式。

五、OOB 评估:免费的样本外估计

随机森林的一个巧妙副产品是 OOB(Out-of-Bag)评估:

  • 每个 bootstrap 子集只用了约 63% 的样本,剩余 37% 称为袋外样本(OOB)
  • 对每棵树,用它没训练过的 OOB 样本评估,得到该树的 OOB 误差。
  • 综合所有树的 OOB 评估,得到整个森林的 OOB 误差

OOB 的价值:

  • 无需单独划分验证集:OOB 本质上是「训练过程中自动产生的样本外评估」,不需要专门留验证集。
  • 无偏估计:OOB 样本未被该树训练,评估是无偏的。
  • 省时省力:不用做交叉验证,一次训练就拿到样本外估计。
from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(n_estimators=500, oob_score=True) rf.fit(X_train, Y_train) print(rf.oob_score_) # 直接得到 OOB 准确率

💡 关键观察:OOB 是随机森林相对于其他模型的一大优势——调参时不需要额外交叉验证,OOB 已经是无偏估计。这在数据稀缺的选股场景里极有价值。

六、特征重要性:另一个核心副产品

随机森林的另一个关键输出是特征重要性(feature importance)——它告诉你「哪些因子真的有用」。

两种常见计算方式:

  • Gini importance(sklearn 默认):每个特征在所有树中带来的基尼系数下降的总和,除以树数。
  • Permutation importance:打乱某个特征的取值,看模型表现下降多少——下降越多,该特征越重要。

特征重要性的实战价值:

  • 因子筛选:筛出 top 20 重要因子,作为后续模型的输入——比人工选因子更客观。
  • 因子研发:对未知的因子候选,看它能否进入重要性前列——能进入说明它有边际信息。
  • 失效排查:某段时期重要因子排名剧烈变化,说明市场结构在变,模型可能需要重训。
  • 研报叙事:用特征重要性图说明「模型在赌什么」,弥补随机森林相对线性模型的可解释性劣势。

⚠️ 学习提示:Gini importance 在「高基数特征」(如某些连续因子)上有偏——倾向于给取值多的特征更高重要性。Permutation importance 更稳健,实战推荐用 Permutation 做最终特征重要性。

七、随机森林在选股里的优势

华泰 AI 4-5 的实证显示,随机森林在 A 股选股有几个突出优势:

  • 样本外稳健:相比单棵树大幅降低方差,样本外 IC/IR 显著提升。
  • 超参不敏感:主要超参 n_estimators(树数,500-2000 都行)、max_depth(深度,5-10 常用)对结果影响不大,不像 SVM 那么敏感。
  • 无需标准化:树按阈值分割,特征尺度不影响,简化预处理。
  • OOB 评估:免费得到样本外估计,调参方便。
  • 特征重要性:作为因子筛选与失效排查的工具,价值巨大。

随机森林的劣势:

  • 预测平滑:随机森林的预测是「多棵树的平均」,在选股排序上极端组区分度可能不如线性模型——它倾向于把预测概率拉向中间。
  • 外推能力弱:树只能预测训练数据见过的特征区间,新出现的极端值会落入最近的叶节点,无法外推。金融数据出现新的极端状态(如新牛市顶部)时,随机森林可能失效。
  • 训练内存大:500-2000 棵树占内存,大数据集上内存压力大。

八、随机森林 vs SVM vs 线性模型

维度 线性模型 SVM 随机森林
非线性 不能
超参敏感
可解释性 高(系数) 低(黑箱) 中(特征重要性)
小样本 一般 一般
大样本训练
OOB 评估
外推能力
预测极端组 一般(平滑)

选股场景的经验选择:

  • 数据少、追求稳健:SVM 或线性模型。
  • 数据中等、追求非线性 + 特征重要性:随机森林
  • 数据极大、追求精度:下节的 Boosting。

九、Python 实战要点

from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier( n_estimators=1000, # 树数,500-2000 常用 max_depth=8, # 深度,选股常用 5-10 max_features='sqrt', # 每次划分看的特征数,√N 是默认 min_samples_leaf=100, # 叶节点最少样本数,控制过拟合 oob_score=True, n_jobs=-1, # 并行训练 random_state=42 ) rf.fit(X_train, Y_train) print(rf.oob_score_) print(rf.feature_importances_) # Gini 重要性 prob = rf.predict_proba(X_test)[:, 1]

几个工程要点:

  • 树数宁多勿少:树数越多,OOB 越稳定,但边际收益递减;500-2000 是合理范围。
  • 限制深度:无限深的树会记住训练数据,过拟合;选股里 max_depth=5-10 常用。
  • min_samples_leaf:叶节点最少样本数,设大一点(如 100)能避免过拟合极端样本。
  • n_jobs=-1:多核并行训练,大幅加速。
  • 超参用时序 CV:虽然 OOB 提供了无偏估计,但最终评估仍要留独立的时序测试集,避免数据泄漏。

本节要点回顾

  1. 决策树:if-else 规则递归划分,可解释、处理非线性与交互、无需标准化;但单棵树极不稳定
  2. 不稳定性原因:贪心算法 + 高方差,数据微变结构大变,需要集成方法稳定。
  3. Bagging:有放回抽样 + 训练多棵树 + 投票,降低方差,是大数定律的应用。
  4. 随机森林:Bagging + 特征随机(每次划分看 √N 个特征),让树之间去相关,投票抵消更好。
  5. OOB 评估:bootstrap 的 37% 袋外样本提供无偏的样本外估计,无需额外交叉验证,数据稀缺的选股场景极有价值。
  6. 特征重要性:Gini importance(默认)或 Permutation importance(更稳健),用于因子筛选、研发、失效排查。
  7. 优势:样本外稳健、超参不敏感、OOB 免费、出特征重要性;劣势:预测平滑(极端组区分差)、外推弱、内存大。
  8. 实战要点:树数 500-2000、深度 5-10、min_samples_leaf 大一点、并行训练、最终仍需时序测试集评估。

下一节,我们讲集成学习的另一种范式——Boosting(AdaBoost/GBDT/XGBoost/LightGBM),它通过「逐步纠错」把弱学习器组合成强学习器,是当前机器学习选股的主力模型。


发布者: 作者: 灏天文库 转发
评论区 (0)
U