决策树训练准确率高但测试波动大是因高方差导致过拟合;bagging通过自助采样与多数投票降低方差,需设max_features='sqrt'、合理预剪枝(如max_depth=5, min_samples_split=20),并用重复交叉验证评估稳定性。

为什么决策树在训练集上准确率高但测试结果波动大
这是典型的高方差表现:模型对训练样本过于敏感,轻微的数据扰动就会导致树结构大幅变化。根本原因在于决策树天然具备强拟合能力,尤其当不限制深度、不设最小样本分割阈值时,DecisionTreeClassifier 很容易生长出过深、过细的分支。
用 BaggingClassifier 包裹决策树降低方差
Bagging 通过自助采样(bootstrap)和多数投票,让多个弱相关树的预测相互抵消噪声。关键不是“堆更多树”,而是控制单棵树的方差来源:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
-
n_estimators设为 50–100 即可,继续增加收益递减 - 必须设置
max_features='sqrt'(分类)或'log2'(回归),否则各子树高度相似,Bagging 失效 - 显式传入
base_estimator并关闭其剪枝参数,把复杂度控制权交给 Bagging 层本身:from sklearn.ensemble import BaggingClassifier<br>from sklearn.tree import DecisionTreeClassifier<br><br>bag_clf = BaggingClassifier(<br> base_estimator=DecisionTreeClassifier(max_depth=None, min_samples_split=2),<br> n_estimators=80,<br> max_features='sqrt',<br> bootstrap=True,<br> random_state=42<br>)
预剪枝比后剪枝更适配 Bagging 场景
后剪枝(如 ccp_alpha)需要验证集评估每个子树,而 Bagging 中每棵树用不同 bootstrap 样本训练,验证逻辑混乱。预剪枝直接限制树的生长边界,与 Bagging 天然兼容:
-
max_depth控制全局深度,建议从 3–6 开始试,超过 8 容易恢复高方差 -
min_samples_split和min_samples_leaf比单纯设max_depth更鲁棒——它们按数据量比例生效,对样本规模变化不敏感 - 避免同时设
max_depth和min_samples_split=2,后者会让前者的约束失效 - 示例组合:
DecisionTreeClassifier(max_depth=5, min_samples_split=20, min_samples_leaf=10)
验证时别只看平均准确率
Bagging 的稳定性优势体现在预测方差上,单次 score() 看不出效果。必须做多次重采样评估:
- 用
cross_val_score配合cv=RepeatedStratifiedKFold(n_splits=5, n_repeats=3),观察标准差是否明显缩小 - 对比基线树与 Bagging 的
predict_proba输出分布:高方差模型在边缘样本上输出概率常集中在 0.4–0.6 区间,而优化后会更倾向 0.1 或 0.9 - 如果测试集上 Bagging 结果反而更差,大概率是
max_features没设对,或单棵树仍过拟合(比如min_samples_split太小)
max_features 的默认值——BaggingClassifier 默认用 None,即使用全部特征,这会让所有子树趋同,完全失去集成意义。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










