第 9 章 · 01 决策树与 Bagging


文档摘要

第 9 章 · 01 决策树与 Bagging 本节摘要:本节打开本章非线性建模的入口——决策树(decision tree)与 Bagging 集成。线性模型只能学到「加性」关系,而金融数据里因子之间的交互普遍存在(比如「高动量 + 低波动」才有效)。决策树用一套「if-else 规则」递归切分特征空间,天然捕捉这种非线性与交互。但单棵树极不稳定,换一份样本规则就大变——这就是 Bagging 登场的理由:用 bootstrap 抽样训很多棵深树再平均,显著降低方差。本节讲清三件事:决策树如何用不纯度指标(MSE/Gini)做递归二划分;为什么树会过拟合、如何用 / 正则化;以及 Bagging 如何通过样本随机化 + 平均,在不改基础算法的前提下把方差压下去。

第 9 章 · 01 决策树与 Bagging

本节摘要:本节打开本章非线性建模的入口——决策树(decision tree)与 Bagging 集成。线性模型只能学到「加性」关系,而金融数据里因子之间的交互普遍存在(比如「高动量 + 低波动」才有效)。决策树用一套「if-else 规则」递归切分特征空间,天然捕捉这种非线性与交互。但单棵树极不稳定,换一份样本规则就大变——这就是 Bagging 登场的理由:用 bootstrap 抽样训很多棵深树再平均,显著降低方差。本节讲清三件事:决策树如何用不纯度指标(MSE/Gini)做递归二划分;为什么树会过拟合、如何用 max_depth/min_samples_leaf 正则化;以及 Bagging 如何通过样本随机化 + 平均,在不改基础算法的前提下把方差压下去。读完本节,你能训出一棵可解释的决策树,并用 BaggingRegressor 看到方差下降的实证。

内容来源:原项目 11_decision_trees_random_forests/01_decision_trees.ipynb02_bagged_decision_trees.ipynb,汉化并套用体系化模板。

⚠️ 学习提示:决策树对样本极度敏感,训练集换一份规则就重写一遍。直接上实盘的「单棵决策树」几乎一定过拟合,本节的价值在理解原理,实战请用下一节的随机森林。

学习目标

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

  1. 解释决策树如何用递归二划分切分特征空间。
  2. 区分回归树(MSE)与分类树(Gini/熵)的不纯度指标。
  3. 列举决策树的主要超参数及其正则化作用。
  4. 用 graphviz 可视化一棵训练好的树并读懂规则。
  5. 解释 Bagging 如何通过 bootstrap + 平均降低方差。

一、决策树:从数据学规则

决策树的目标变量可以是连续(回归)或离散(分类)。它用一套递归二划分算法学规则:给定训练集,遍历所有特征 X_i 与所有切点 s_j,找到一个组合,把样本分成 \{X_i < s_j\}\{X_i \ge s_j\} 两块,使两块内的「不纯度」相对父节点下降最多。

回归树用 MSE(均方误差)作为不纯度——叶节点的预测就是落进它的训练样本的目标均值。分类树改用 Gini 不纯度信息熵,叶节点的预测是样本里最多的类(也可输出类别概率)。两者算法骨架一致,只是切分准则和叶节点聚合方式不同。

💡 核心心法:决策树把特征空间切成若干「盒子」,每个盒子里给一个常数预测(回归用均值,分类用众数)。它的非线性能力来自「切」,交互能力来自「先按 A 切再按 B 切」——这种链式切分天然捕捉了「A 与 B 的某种组合」。

二、用 sklearn 训一棵回归树

notebook 用 Quandl 月度股票收益数据,先构造两个滞后收益特征(类似 AR(2))预测下月收益:

X2 = data.loc[:, ['target', 'return_1m']] X2.columns = ['y', 't-1'] X2['t-2'] = data.groupby(level='ticker').return_1m.shift() X2 = X2.dropna() y2 = X2.y X2 = X2.drop('y', axis=1)

然后实例化一棵深度 6 的回归树:

from sklearn.tree import DecisionTreeRegressor reg_tree_t2 = DecisionTreeRegressor(criterion='mse', max_depth=6, min_samples_split=2, min_samples_leaf=50, random_state=42) reg_tree_t2.fit(X=X2, y=y2)

关键参数的含义:

超参数 含义 正则化方向
criterion 不纯度准则,mse 用于回归
max_depth 树的最大深度 调小→欠拟合风险
min_samples_split 节点继续分裂所需最小样本数 调大→抑制过拟合
min_samples_leaf 叶节点最小样本数 调大→抑制过拟合
max_features 每次分裂考虑的特征数 调小→增加随机性

三、可视化与正则化

决策树最大的优点是可解释。sklearn 能输出 .dot 描述,由 graphviz 渲染成图:

from sklearn.tree import export_graphviz import graphviz dot_data = export_graphviz(reg_tree_t2, feature_names=X2.columns, max_depth=2, filled=True, rounded=True) graphviz.Source(dot_data)

每个内部节点标注「切分条件 + 样本数 + 当前均值」,叶节点标注最终预测。max_depth=2 这里只渲染前两层,避免图太挤。读懂这棵树,你就知道模型把「高 t-1 + 低 t-2」分成哪几类、各自的预测均值是多少。

过拟合与正则化

决策树有强烈的过拟合倾向,尤其当特征数相对样本数偏多时。如果任由树无限生长,它会把每个训练样本切到独立叶子里——训练 MSE 为 0,但样本外一无是处。控制手段就是上面那组超参数:限制深度、要求叶节点最少样本数、要求每次分裂带来足够的不纯度下降。notebook 还用 GridSearchCV 配合自定义的 MultipleTimeSeriesCV(时序交叉验证)做超参搜索。

⚠️ 时序交叉验证:金融数据不能用普通 K-fold——它会把未来数据漏进训练集。原项目 utils.pyMultipleTimeSeriesCV 严格按时间切分,训练段始终在测试段之前,且会 purge 掉与测试段标签重叠的训练样本。第 6 章详细讲过,这里要记得用。

四、Bagging:用平均降低方差

单棵树的问题:换一份训练样本,学出来的规则就大不一样——这是高方差。Bagging(Bootstrap Aggregating)的解法很直接:

  1. 从训练集有放回抽 bootstrap 样本(与原集等大,有重复)。
  2. 在每个 bootstrap 样本上训一棵深树(不剪枝,让每棵低偏差高方差)。
  3. 平均所有树的预测——方差被显著压低。
from sklearn.ensemble import BaggingRegressor bag = BaggingRegressor(base_estimator=DecisionTreeRegressor(), n_estimators=100, max_samples=1.0, max_features=1.0, bootstrap=True, bootstrap_features=False)

参数解读:

参数 含义
n_estimators 训多少棵树
max_samples 每棵树抽多少行(1.0 = 与原集等大)
max_features 每棵树用多少列(1.0 = 全部特征)
bootstrap 行是否放回抽样
bootstrap_features 列是否放回抽样

notebook 用一个「抖动的非线性函数」做演示:单棵深树会贴着噪声走,Bagging 后的曲线明显更平滑——这就是「降低方差」最直观的视觉证据。

💡 为什么用深树:Bagging 通过平均降方差,所以基础模型要故意「低偏差高方差」——深树正好满足。如果用浅树(高偏差),平均也救不了偏差。这与下一章的 Boosting 相反——Boosting 用浅树作弱学习器,串行拟合残差降偏差。

五、Bagging 的局限:树之间太相关

Bagging 的效果取决于「树之间的相关性」。如果所有树都用全部特征训,它们在最重要的那个特征上倾向于做同样的切分——相关性高,平均能降的方差就有限。这正是随机森林要解决的问题:在每个分裂点再随机选一部分特征,强制让树「各想各的」,把相关性也降下来。这是下一节的主题。

本节要点回顾

  1. 决策树本质:用递归二划分把特征空间切成盒子,每个盒子给一个常数预测(回归均值/分类众数)。
  2. 不纯度准则:回归用 MSE,分类用 Gini/熵;叶节点预测来自落进它的训练样本。
  3. 可解释性:export_graphviz 渲染规则树,每个节点显示切分条件与样本数——这是树相对黑盒模型的最大优势。
  4. 过拟合:树会无限切到每样本一叶,必须用 max_depth/min_samples_leaf 等正则化,并用时序 CV 搜索。
  5. Bagging 降方差:bootstrap 抽样 + 训深树 + 平均,基础模型要选「低偏差高方差」的深树。
  6. Bagging 的天花板:所有树用全部特征时相关性高,降方差有限——这是随机森林引入「特征随机化」的动机。

下一节,我们看 随机森林调参与日本股票多空——在 Bagging 基础上加特征随机化,用 LightGBM 在日本大盘股上跑一个完整的多空策略回测。


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