17-4 MLP 应用实战
📌 一、 课程导入(5 分钟)
主题:从造轮子到用轮子
第 17-1 至 17-3 课完成的工作:
| 课程 | 内容 | 代码量 |
|---|---|---|
| 17-1 | 逻辑回归的数学原理与 Sigmoid 推导 | ~50 行 |
| 17-2 | 神经网络的前向传播与结构设计 | ~80 行 |
| 17-3 | 反向传播算法与完整训练循环 | ~150 行 |
总计约 280 行代码实现了一个单隐藏层神经网络的完整训练。
现实问题:
- 如果需要 5 个隐藏层、每层 256 个神经元,代码复杂度急剧上升
- 需要实现自动微分、GPU 加速、批归一化等高级功能
- 需要与数据预处理、模型选择、超参数搜索等流程集成
解决方案:使用成熟的机器学习框架。
scikit-learn 的 MLP(Multi-layer Perceptron)模块提供了与第 17-3 课“从零实现”功能对等的、经过工业级优化的接口。
本课路径:
- 👨🏫 教师活动:回顾前三课累计的代码量,指出从零实现的局限性;展示 scikit-learn MLP 模块的简洁性;给出本课结构图。
- 🧑🎓 学生活动:回顾自己实现反向传播的体验;思考“框架带来了什么便利”。
通过从零实现到框架使用的对比,让学生理解“原理”与“工具”的关系:先理解底层机制,再使用高层封装,避免成为只会调参而不懂原理的“调参侠”。
📖 二、 解决问题过程(一):MLPClassifier 与 MLPRegressor 核心 API(20 分钟)
2.1 模块导入与基本用法
2.2 核心参数详解
| 参数 | 可选值 | 默认值 | 说明 |
|---|---|---|---|
hidden_layer_sizes |
元组 | (100,) |
隐藏层结构。(100,) 表示单隐藏层100个神经元;(64, 32) 表示两个隐藏层分别为64和32。 |
activation |
'relu', 'tanh', 'logistic' |
'relu' |
隐藏层激活函数。’logistic’ 即 Sigmoid。 |
solver |
'sgd', 'adam', 'lbfgs' |
'adam' |
权重优化求解器。‘sgd’ 为随机梯度下降;‘adam’ 为自适应矩估计;’lbfgs’ 为准牛顿法。 |
alpha |
正浮点数 | 0.0001 |
L2 正则化系数。值越大正则化越强,抑制过拟合。 |
learning_rate_init |
正浮点数 | 0.001 |
初始学习率。仅对 ‘sgd’ 和 ‘adam’ 有效。 |
max_iter |
正整数 | 200 |
最大迭代次数。’lbfgs’ 迭代次数;‘sgd’/‘adam’ 为 epoch 数。 |
early_stopping |
True / False |
False |
是否启用早停法。为 True 时,验证集损失不再下降则提前终止训练。 |
validation_fraction |
0~1 浮点数 | 0.1 |
早停法使用的验证集比例(从训练集中划分)。 |
batch_size |
正整数 / 'auto' |
'auto' |
小批量大小。'auto' 时取 min(200, n_samples)。 |
random_state |
整数 | None |
随机种子,确保结果可复现。 |
verbose |
True / False |
False |
是否输出训练过程信息(损失值、迭代次数)。 |
2.3 求解器(solver)对比与选择
| 求解器 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
'adam' |
大多数场景的默认选择 | 自适应学习率,收敛快,对超参数不敏感 | 在小数据集上可能过拟合 |
'sgd' |
大规模数据,需要精细控制学习率 | 可配合学习率衰减,泛化性能好 | 对学习率敏感,需要更多调参 |
'lbfgs' |
小规模数据集(数千样本以内) | 收敛快,无需调整学习率 | 不支持大规模数据,内存消耗大 |
2.4 从零实现 → scikit-learn MLP 的映射
| 从零实现的组件 | scikit-learn MLP 的对应参数 |
|---|---|
隐藏层结构 (n_hidden,) |
hidden_layer_sizes=(n_hidden,) |
| ReLU 激活函数 | activation='relu' |
学习率 lr |
learning_rate_init |
梯度下降迭代次数 epochs |
max_iter |
| 无(未实现) | alpha(L2 正则化) |
| 无(未实现) | early_stopping(早停法) |
| 无(未实现) | solver='adam'(自适应学习率) |
2.5 第 17-3 课代码 → scikit-learn 等价代码
从零实现的训练(第 17-3 课):
scikit-learn 等价实现:
- 👨🏫 教师活动:逐一介绍核心参数及其对模型的影响;对比从零实现与 scikit-learn 的参数映射关系;强调数据维度要求的差异。
- 🧑🎓 学生活动:记录核心参数及其含义;思考“为什么需要 L2 正则化”和“早停法的作用”。
通过建立“从零实现 → 框架接口”的映射关系,帮助学生将前几课的原理知识迁移到实际工具的使用中,而非孤立地学习 API。
📖 三、 解决问题过程(二):分类实战——手写数字识别(20 分钟)
3.1 数据集介绍:MNIST 手写数字(scikit-learn 版本)
数据说明:
- 1797 个样本
- 每个样本为 8×8 = 64 像素的灰度图像
- 像素值范围 0~16(0 为白色,16 为黑色)
- 10 个类别(数字 0~9)
3.2 数据预处理与划分
⚠️ 重要:MLP 基于梯度下降优化,特征的尺度差异会影响收敛速度和最终性能。标准化是必要的预处理步骤。
3.3 MLPClassifier 训练
3.4 损失曲线可视化
3.5 混淆矩阵可视化
3.6 预测错误样本分析
- 👨🏫 教师活动:介绍 scikit-learn 内置手写数字数据集;演示数据预处理、模型训练、评估的完整流程;展示损失曲线和混淆矩阵的解读方法。
- 🧑🎓 学生活动:跟随代码运行完整的分类流程;观察损失曲线是否收敛;分析混淆矩阵中哪些数字容易混淆。
通过完整的分类案例,让学生掌握 MLPClassifier 的标准使用流程。手写数字识别是机器学习领域的经典入门任务,其结果直观可验证。
📖 四、 解决问题过程(三):回归实战——房价预测(15 分钟)
4.1 数据集介绍:California Housing
4.2 数据预处理与划分
4.3 MLPRegressor 训练
4.4 预测值与真实值对比图
4.5 分类与回归的 MLP 配置对比
| 配置项 | 分类(MLPClassifier) | 回归(MLPRegressor) |
|---|---|---|
| 输出层神经元数 | 类别数(自动确定) | 1 |
| 输出层激活函数 | Softmax | 线性 |
| 损失函数 | 交叉熵 | MSE |
| 预测方法 | predict() 返回类别 |
predict() 返回连续值 |
| 概率输出 | predict_proba() |
不适用 |
| 评估指标 | 准确率、F1、混淆矩阵 | MSE、RMSE、R² |
- 👨🏫 教师活动:演示 MLPRegressor 的完整回归流程;对比分类与回归在 API 使用上的异同;展示预测值 vs 真实值散点图的解读方法。
- 🧑🎓 学生活动:运行回归代码;对比回归与分类的评估指标;思考“为什么房价预测的 R² 通常没有分类准确率高”。
通过回归案例完整覆盖 MLPRegressor 的使用流程,帮助学生理解神经网络在同一框架下对不同类型任务的统一处理方式。
✍️ 五、 课堂练习与巩固(15 分钟)
📝 六、 课堂小结(5 分钟)
flowchart TB
root["17-4 MLP 应用实战"]
subgraph C1["📦 scikit-learn MLP API"]
direction TB
A1["MLPClassifier: 分类任务"]
A2["MLPRegressor: 回归任务"]
A3["统一接口: fit / predict / score"]
end
subgraph C2["⚙️ 核心参数"]
direction TB
B1["hidden_layer_sizes: 网络结构"]
B2["activation: relu / tanh / logistic"]
B3["solver: adam / sgd / lbfgs"]
B4["alpha: L2 正则化强度"]
B5["early_stopping: 早停防止过拟合"]
end
subgraph C3["📊 实战流程"]
direction TB
C1["数据加载 → 标准化 → 划分"]
C2["模型实例化 → 训练 → 预测"]
C3["准确率 / MSE / R² / 混淆矩阵"]
end
subgraph C4["🔗 前后呼应"]
direction TB
D1["前三课: 从零实现 ~280 行"]
D2["本课: scikit-learn ~20 行"]
D3["原理 + 工具 = 完整能力"]
end
root --> C1
root --> C2
root --> C3
root --> C4
style root fill:#4b6cb7,stroke:#253b6e,color:#fff,stroke-width:2px
style C1 fill:#e3f2fd,stroke:#2196f3
style C2 fill:#fff3e0,stroke:#ff9800
style C3 fill:#e8f5e9,stroke:#4caf50
style C4 fill:#f3e5f5,stroke:#9c27b0
✏️ 随堂检测与互动练习
📮 七、 课后作业与拓展
📋 八、 板书设计
🔤 本课用到的单词
| 单词 | 发音(美式) | 解释 |
|---|---|---|
| MLP | /em el piː/ | Multi-layer Perceptron,多层感知机,前馈神经网络的同义词 |
| API | /eɪ piː aɪ/ | Application Programming Interface,应用程序编程接口 |
| Solver | /ˈsɑːlvər/ | 求解器,用于优化神经网络权重的算法 |
| Adam | /ˈædəm/ | Adaptive Moment Estimation,自适应矩估计优化算法 |
| LBFGS | /el biː ef dʒiː es/ | Limited-memory BFGS,拟牛顿法优化算法,适合小数据集 |
| Regularization | /ˌreɡjələrəˈzeɪʃən/ | 正则化,通过在损失函数中添加惩罚项抑制过拟合 |
| Early Stopping | /ˈɜːrli ˈstɑːpɪŋ/ | 早停法,验证集损失不再下降时提前终止训练的策略 |
| Validation | /ˌvælɪˈdeɪʃən/ | 验证,使用独立于训练的数据评估模型性能 |
| Standardization | /ˌstændərdəˈzeɪʃən/ | 标准化,将数据变换为均值为 0、方差为 1 的分布 |
| Normalization | /ˌnɔːrmələˈzeɪʃən/ | 归一化,将数据缩放到特定区间(如 [0, 1]) |
| Confusion Matrix | /kənˈfjuːʒən ˈmeɪtrɪks/ | 混淆矩阵,用于可视化分类模型预测结果的表格 |
| Precision | /prɪˈsɪʒən/ | 精确率,TP / (TP + FP),预测为正类的样本中实际为正类的比例 |
| Recall | /rɪˈkɔːl/ | 召回率,TP / (TP + FN),实际正类中被正确识别的比例 |
| F1 Score | /ef wʌn skɔːr/ | F1 分数,精确率和召回率的调和平均数 |
| Grid Search | /ɡrɪd sɜːrtʃ/ | 网格搜索,遍历超参数组合寻找最优配置的调参方法 |
| Abstraction | /æbˈstrækʃən/ | 抽象,将底层细节封装为高层接口的设计理念 |