第 4 章 · 03 决策树与随机森林 本节摘要:上节讲 SVM 用核技巧处理非线性,本节换一条完全不同的路——决策树。决策树用「if-else 规则」递归划分特征空间,天然捕捉非线性与交互效应,且可解释性极强(树本身就是规则),是另一种处理非线性的思路。但单棵决策树极不稳定——换一点数据,树的结构就大变。随机森林(Random Forest)通过 bagging(bootstrap aggregating)与特征随机把多棵不稳定树组合成稳健的强模型,同时提供特征重要性与OOB 评估。华泰人工智能系列第 4-5 篇系统测试了决策树与随机森林在 A 股选股的效果,核心结论是:随机森林在样本外常显著优于单棵树,且特征重要性是它的核心副产品——能告诉你「哪些因子真的有用」。
本节摘要:上节讲 SVM 用核技巧处理非线性,本节换一条完全不同的路——决策树。决策树用「if-else 规则」递归划分特征空间,天然捕捉非线性与交互效应,且可解释性极强(树本身就是规则),是另一种处理非线性的思路。但单棵决策树极不稳定——换一点数据,树的结构就大变。随机森林(Random Forest)通过 bagging(bootstrap aggregating)与特征随机把多棵不稳定树组合成稳健的强模型,同时提供特征重要性与OOB 评估。华泰人工智能系列第 4-5 篇系统测试了决策树与随机森林在 A 股选股的效果,核心结论是:随机森林在样本外常显著优于单棵树,且特征重要性是它的核心副产品——能告诉你「哪些因子真的有用」。读完本节,你理解集成学习的第一种范式(bagging),为下节的 Boosting 打基础。
内容来源:仓库研报 华泰人工智能系列第 4-5 篇(决策树与随机森林),知识结构化整理。
⚠️ 学习提示:随机森林是「入门机器学习的明星模型」——好调参、不易过拟合、出特征重要性,是工业级基线的强有力竞争者。
阅读完本节,你应当能够:
决策树(Decision Tree)从根节点开始,每次选一个特征与阈值,把数据按「特征 ≤ 阈值」与「特征 > 阈值」分成两支,递归直到满足停止条件(纯节点、深度上限、样本数下限)。
根节点(所有股票) ├─ PE < 15 ? │ ├─ 是 → ROE > 15% ? → 是:买入类 / 否:观望类 │ └─ 否 → 动量 > 0 ? → 是:持有类 / 否:卖出类
划分标准(分类):常用基尼系数或信息增益——选能让两支「最纯」(同类样本占比最高)的特征与阈值。
决策树的优点:
单棵决策树有一个致命问题——极不稳定。训练数据稍微变动(去掉几个样本、加几个新数据),最优划分点可能完全不同,整棵树结构大变。
为什么不稳定:
这与上节 SVM 的稳健性截然相反——单棵树是高方差低偏差模型,需要集成方法稳定它。
💡 核心心法:决策树的不稳定性本质是「贪心 + 高方差」。集成学习(bagging 与 boosting)的核心思想都是「用多棵树投票/加权,降低方差或偏差」。
Bagging(Bootstrap Aggregating)是降低方差的标准方法:
为什么有效:多棵不稳定的树,每棵在不同 bootstrap 子集上训练,它们的「随机误差」互相独立,投票后大幅抵消——这是大数定律的应用。
随机森林(Random Forest)在 bagging 基础上加了特征随机——每次划分时,只在随机选的 m 个特征里找最优划分,而不是所有特征。
m 通常取 √(总特征数) 或 总特征数/3
为什么需要特征随机:
随机森林 = Bagging + 特征随机,是工业级决策树集成的标准形式。
随机森林的一个巧妙副产品是 OOB(Out-of-Bag)评估:
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 在「高基数特征」(如某些连续因子)上有偏——倾向于给取值多的特征更高重要性。Permutation importance 更稳健,实战推荐用 Permutation 做最终特征重要性。
华泰 AI 4-5 的实证显示,随机森林在 A 股选股有几个突出优势:
n_estimators(树数,500-2000 都行)、max_depth(深度,5-10 常用)对结果影响不大,不像 SVM 那么敏感。随机森林的劣势:
| 维度 | 线性模型 | SVM | 随机森林 |
|---|---|---|---|
| 非线性 | 不能 | 强 | 强 |
| 超参敏感 | 低 | 高 | 低 |
| 可解释性 | 高(系数) | 低(黑箱) | 中(特征重要性) |
| 小样本 | 一般 | 好 | 一般 |
| 大样本训练 | 快 | 慢 | 中 |
| OOB 评估 | 无 | 无 | 有 |
| 外推能力 | 好 | 中 | 弱 |
| 预测极端组 | 好 | 好 | 一般(平滑) |
选股场景的经验选择:
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]
几个工程要点:
max_depth=5-10 常用。下一节,我们讲集成学习的另一种范式——Boosting(AdaBoost/GBDT/XGBoost/LightGBM),它通过「逐步纠错」把弱学习器组合成强学习器,是当前机器学习选股的主力模型。