1202 随机森林与集成思想

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标:理解集成学习(Ensemble Learning)中“Bagging”的核心思想(并行训练、投票平均);掌握随机森林在决策树基础上增加的“双重随机性”(样本随机 + 特征随机);理解随机森林相对于单棵决策树在抗过拟合能力上的根本原因。
  • ⚙️ 能力目标:能够调用 sklearn.ensemble.RandomForestClassifier 完成分类任务;能够通过代码对比单棵决策树与随机森林在测试集上的性能差异;能够观察并解释随机森林的特征重要性输出与单棵树的区别。
  • 💡 素养目标:建立“集体决策优于个人决策”的系统思维;理解在工业级项目中为何优先采用集成模型而非单棵基模型。

【重点与难点】

  • 🟢 教学重点:随机森林的训练流程(Bagging + 特征子集);随机森林与决策树的代码实现对比;通过 n_estimators 参数控制森林规模。
  • 🟡 教学难点:理解“特征随机性”如何进一步降低树与树之间的相关性,从而提升泛化能力;区分 Bagging(并行)与后续课程 Boosting(串行)的核心差异。

📌 一、 课程导入(5 分钟)

回顾旧知:上次课训练的决策树(max_depth=None)在训练集上准确率达到 100%,但在测试集上出现了性能下滑——这就是典型的“过拟合”。单棵决策树过于“个性”,容易被数据中的噪声带偏。

场景类比

  • 单棵决策树 ≈ 一位经验丰富但偶尔固执的资深专家。
  • 随机森林 ≈ 召集 100 位专家,各自独立判断,最后通过投票(分类)或取平均(回归)得出最终结论。

核心疑问抛出

  1. 如何保证这 100 棵树“各自独立”且各不相同?
  2. 为什么 100 棵树投票的结果,通常比最强的那一棵树还要准?
  • 👨‍🏫 教师活动:展示上次课中过拟合树的截图(训练集 100%,测试集 94%);抛出“专家投票”类比;板书关键词“Bagging = Bootstrap Aggregating”。
  • 🧑‍🎓 学生活动:回忆并复述决策树的过拟合现象;参与“投票决断”小互动(例如:班级内随机抽取 5 人对某个问题投票,观察准确率是否高于单人)。

通过“专家投票”的生活化类比,降低集成学习的理解门槛。同时点明本节课要解决的痛点(过拟合)正是上节课遗留的问题,形成课程内容闭环。


📖 二、 解决问题过程(一):随机森林的两大核心机制

核心机制 1:样本随机(Bootstrap 自助采样)

  • 原始训练集有 N 个样本。每棵树的训练数据,都是通过 有放回 的抽样方式从原始集中抽取 N 个样本。
  • 结果:每棵树拿到的训练数据都略有不同(约 63.2% 的原始样本会被抽到,其余为重复或未抽中)。
  • 作用:确保每棵树的“成长环境”不同。

核心机制 2:特征随机(Random Subspace)

  • 假设总共有 M 个特征。在树的每个节点进行分裂时,不是从全部 M 个特征里选最优,而是先随机抽取 sqrt(M)log2(M) 个特征作为候选,再从这一小撮里挑最好的。
  • 作用:强制树与树之间的分裂路径产生更大差异,避免所有树都依赖同一个最强特征。

为什么随机森林抗过拟合?

  • 单棵树可能记住噪声,但不同树记住的噪声不同。
  • 投票机制将这些“个体噪声”相互抵消,保留“群体共识”,从而在测试集上表现更稳健。
  • 👨‍🏫 教师活动:在黑板上画出示意图(原始数据集 → 多个 Bootstrap 子集 → 多棵并行树 → 投票输出);使用具体数值(如 N=10, M=4)演示抽样过程。
  • 🧑‍🎓 学生活动:在导学案上填写“Bagging”全称(Bootstrap Aggregating);讨论“如果只随机抽样本,不随机抽特征,效果会打折扣吗?”。

将“双重随机性”拆解为两个独立知识点,方便学生分步消化。强调“去相关性”是随机森林的核心竞争力,为后续调参(如 max_features)埋下伏笔。


💻 三、 解决问题过程(二):代码实战——训练随机森林并与决策树对比

实验设置:沿用上节课的鸢尾花数据集(训练/测试集划分保持一致,以便公平对比)。

步骤 1:训练随机森林(默认参数)

 1from sklearn.ensemble import RandomForestClassifier
 2from sklearn.datasets import load_iris
 3from sklearn.model_selection import train_test_split
 4
 5X, y = load_iris(return_X_y=True)
 6X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
 7
 8# 默认 n_estimators=100(100棵树)
 9rf = RandomForestClassifier(random_state=42)
10rf.fit(X_train, y_train)
11
12print("随机森林 - 训练集准确率:", rf.score(X_train, y_train))
13print("随机森林 - 测试集准确率:", rf.score(X_test, y_test))

步骤 2:加载上节课的决策树模型进行对比(伪代码复用)

1from sklearn.tree import DecisionTreeClassifier
2
3dt = DecisionTreeClassifier(random_state=42)
4dt.fit(X_train, y_train)
5
6print("决策树 - 训练集准确率:", dt.score(X_train, y_train))
7print("决策树 - 测试集准确率:", dt.score(X_test, y_test))

现象观察:随机森林的训练集准确率可能略低于单棵完全生长的树(因为每棵树被“削弱”了),但测试集准确率通常更高或持平——这就是泛化能力的提升。

步骤 3:查看随机森林的特征重要性

1print(rf.feature_importances_)

与单棵树的 feature_importances_ 对比,随机森林的重要性评估更加稳定平滑,不会因为某棵树的结构异常而产生极端值。

  • 👨‍🏫 教师活动:在 Notebook 中分屏同时运行两个模型,并高亮显示测试集准确率数据;对比两张特征重要性柱状图(单棵树 vs 随机森林)。
  • 🧑‍🎓 学生活动:运行代码并记录两组数据;思考“为什么随机森林的训练集准确率有时候反而低于决策树?”(答案:因为每棵树没有完全拟合,降低方差)。

通过“背靠背”的代码对比实验,用客观数据说话,让学生直观感受集成学习的威力。强调“泛化能力”比“训练集分数”更值得关注,建立正确的模型评估观念。


✍️ 四、 解决问题过程(三):课堂实训——调整森林规模观察性能变化

📝 任务一:探究 n_estimators 对模型性能的影响…

背景与题目n_estimators 是随机森林中最重要的参数之一,代表森林中树的数量。理论上,树越多,模型越稳定,但训练时间也会线性增加。

任务要求: 使用鸢尾花数据集,训练不同树数量的随机森林(n_estimators = 1, 10, 50, 100, 200),记录每种配置下模型在训练集和测试集上的准确率,并绘制折线图观察变化趋势。

🔍 查看参考代码与解析…
 1import matplotlib.pyplot as plt
 2from sklearn.ensemble import RandomForestClassifier
 3
 4n_estimators_list = [1, 10, 50, 100, 200]
 5train_scores = []
 6test_scores = []
 7
 8for n in n_estimators_list:
 9    rf = RandomForestClassifier(n_estimators=n, random_state=42)
10    rf.fit(X_train, y_train)
11    train_scores.append(rf.score(X_train, y_train))
12    test_scores.append(rf.score(X_test, y_test))
13
14# 绘图
15plt.plot(n_estimators_list, train_scores, label='训练集', marker='o')
16plt.plot(n_estimators_list, test_scores, label='测试集', marker='s')
17plt.xlabel('树的数量 (n_estimators)')
18plt.ylabel('准确率')
19plt.legend()
20plt.grid(True)
21plt.show()

解析:通常随着树数量增加,测试集准确率会上升并趋于平缓(收敛)。训练集准确率可能一直很高。这说明并不是树越多越好(边际效益递减),需要根据训练时间做权衡。


📝 五、 课堂小结(5 分钟)

flowchart LR
    root["🌲 随机森林(第二次课)"]

    subgraph C1["📖 核心思想"]
        direction TB
        A1["集成学习:集体决策"]
        A2["Bagging:并行训练 + 投票"]
    end

    subgraph C2["⚙️ 双重随机性"]
        direction TB
        B1["样本随机:Bootstrap 有放回抽样"]
        B2["特征随机:节点分裂时随机选子集"]
    end

    subgraph C3["📊 对比决策树"]
        direction TB
        C1_node["单棵树:高方差、易过拟合"]
        C2_node["随机森林:低方差、泛化强"]
    end

    subgraph C4["🔧 核心调参"]
        direction TB
        D1["n_estimators:树的数量(越多越稳)"]
        D2["max_features:特征子集大小"]
    end

    root --> C1
    root --> C2
    root --> C3
    root --> C4

    style root fill:#2e7d32,stroke:#1b5e20,color:#fff,stroke-width:2px,rx:8px,ry:8px
    style C1 fill:#e8f5e9,stroke:#4caf50,stroke-width:1px
    style C2 fill:#e3f2fd,stroke:#2196f3,stroke-width:1px
    style C3 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
    style C4 fill:#f3e5f5,stroke:#9c27b0,stroke-width:1px

✏️ 随堂检测与互动练习

点击展开:随堂测试题(带解析)

一、 单选题

  1. 随机森林中“Bagging”技术的主要目的是?
  • A. 增加模型在训练集上的准确率
  • B. 降低基模型之间的相关性,减少过拟合风险
  • C. 加快模型的训练速度
  • D. 让模型只能处理分类问题
【答案】

【解析】B。Bagging 通过有放回抽样和并行训练,制造出“不同”的基模型,投票平均后降低整体方差。

  1. 假设某数据集包含 100 个特征,随机森林在节点分裂时默认选取 max_features='sqrt',意味着每次考虑多少个候选特征?
  • A. 100 个
  • B. 10 个(sqrt(100))
  • C. 50 个
  • D. 由模型自动决定,不受参数影响
【答案】

【解析】B。当 max_features='sqrt' 时,候选特征数为总特征数的平方根。

二、 代码填空题

题目:现有训练好的随机森林模型 rf,请补充代码,预测测试集的前 5 个样本的类别,并计算整体准确率。

1# 1. 预测测试集前 5 个样本
2y_pred_sample = rf.predict(_________________)
3# 2. 计算整体准确率
4accuracy = rf.score(_________________________)
【答案】
  1. X_test[:5]
  2. X_test, y_test

三、 辨析题

题目:请简述随机森林的“特征随机性”与“样本随机性”在防止过拟合过程中分别扮演了什么角色。

【答案】

样本随机性(Bootstrap)确保每棵树的训练数据略有差异,避免所有树学习到完全相同的噪声模式。特征随机性(特征子集)则确保即使在相似的数据子集上,树的分裂路径也不同。两者共同作用,大幅降低树与树之间的相关性,使得最终的投票结果更加稳健。

📮 六、 课后作业与拓展

📮 课后作业…
  1. 基础作业:在 Jupyter Notebook 中完成代码对比实验(决策树 vs 随机森林),截屏保存训练/测试准确率对比结果,并写下 50 字以内的观察结论。
  2. 调参作业:在随机森林中尝试修改 max_features 参数('sqrt', 'log2', None, 0.3 等),观察测试集准确率的变化,并尝试解释原因。
  3. 数据作业:更换数据集为 load_wine(葡萄酒数据集),重新执行决策树与随机森林的对比实验,记录准确率差异并提交代码文件。
  4. 拓展阅读:查阅资料,了解随机森林除了投票外,还提供了 predict_proba(概率预测)功能,思考在风控场景中概率输出比硬分类输出有哪些优势。
  5. 预习作业:阅读教材中关于“XGBoost”的第一段简介,思考“串行集成(Boosting)”与今天所学的“并行集成(Bagging)”在直觉上有什么不同。

📋 七、 板书设计

🛠️ 板书设计…
 1🌲 随机森林 – 第二次课
 2
 3一、 为什么需要集成?
 4    单棵决策树:高方差,易过拟合(记住细节,忽视规律)
 5    集成学习:群体决策,弥补个体不足
 6
 7二、 随机森林的两大法宝(双重随机)
 8    ① 样本随机(Bagging):有放回抽样,构造不同的训练子集
 9    ② 特征随机(Feature Subspace):节点分裂时只考虑部分特征
10     → 目的:降低树与树之间的相关性
11
12三、 随机森林 vs 决策树(核心对比)
13    | 维度     | 决策树       | 随机森林       |
14    |----------|--------------|----------------|
15    | 结构     | 单棵         | 多棵并行        |
16    | 方差     | 高           | 低              |
17    | 可解释性 | 非常强       | 中等(依赖重要性)|
18    | 抗过拟合 | 弱(需剪枝) | 强(天然抗性)  |
19
20四、 关键参数
21    n_estimators  → 树的数量(性能收敛后不再提升)
22    max_features  → 每次分裂考虑的特征数(越大,树相关性越高)

本课用到的单词

英文术语 发音(美式) 中文释义 专业语境解释
Ensemble Learning /ɑːnˈsɑːmbəl ˈlɜːrnɪŋ/ 集成学习 组合多个基模型以提升整体预测性能的机器学习范式。
Bagging /ˈbæɡɪŋ/ 自助聚集法 Bootstrap Aggregating 的缩写,通过有放回抽样构建多个子数据集并行训练。
Bootstrap /ˈbuːt.stræp/ 自助采样法 一种统计重采样技术,从原始数据中有放回地抽取等量样本。
Random Subspace /ˈrændəm ˈsʌb.spes/ 随机子空间 在节点分裂时随机选取部分特征作为候选集合的策略。
Variance /ˈver.i.əns/ 方差(泛化误差来源) 模型对训练数据微小变化的敏感程度,方差高意味着容易过拟合。
n_estimators /en ˌes.tɪˈmeɪ.tɚz/ 基学习器数量 随机森林中决策树的总棵数,核心超参数。
Majority Voting /məˈdʒɔː.rə.ti ˈvoʊ.tɪŋ/ 多数投票法 分类问题中集成模型常用的决策策略,少数服从多数。