17-4 MLP 应用实战

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标:掌握 scikit-learn 中 MLPClassifier 和 MLPRegressor 的核心参数及其含义;理解从“从零实现”到“框架使用”的抽象层级跃迁;熟悉 MLP 模型在实际数据集上的完整使用流程(数据预处理 → 模型选择 → 训练 → 评估 → 调参)。
  • ⚙️ 能力目标:能够使用 MLPClassifier 完成手写数字识别等实际分类任务;能够使用 MLPRegressor 完成房价预测等回归任务;能够通过调整网络结构(隐藏层大小、激活函数、求解器等)优化模型性能;能够解读模型训练过程中的损失曲线并诊断收敛状态。
  • 💡 素养目标:培养“先理解原理,再使用工具”的学习路径意识;理解自动微分框架(如 PyTorch/TensorFlow)与 scikit-learn MLP 接口的设计差异;建立从原型验证到工程部署的完整开发思维。

【重点与难点】

  • 🟢 教学重点:MLPClassifier 和 MLPRegressor 的 API 使用规范;核心参数(hidden_layer_sizes、activation、solver、alpha、learning_rate_init)的含义与调参策略;分类与回归任务在数据预处理和模型评估上的差异。
  • 🟡 教学难点:理解不同求解器(sgd、adam、lbfgs)的适用场景与收敛特性;正则化参数 alpha 对模型泛化能力的影响机制;早停法(early stopping)的用法与原理;从“从零实现”到“框架使用”的思维转换。

📌 一、 课程导入(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 课“从零实现”功能对等的、经过工业级优化的接口。

本课路径

 1从零实现的神经网络(第17-3课)
 2 3MLPClassifier / MLPRegressor API
 4 5核心参数详解
 6 7分类案例:手写数字识别
 8 9回归案例:房价预测
1011模型调参与诊断
  • 👨‍🏫 教师活动:回顾前三课累计的代码量,指出从零实现的局限性;展示 scikit-learn MLP 模块的简洁性;给出本课结构图。
  • 🧑‍🎓 学生活动:回顾自己实现反向传播的体验;思考“框架带来了什么便利”。

通过从零实现到框架使用的对比,让学生理解“原理”与“工具”的关系:先理解底层机制,再使用高层封装,避免成为只会调参而不懂原理的“调参侠”。


📖 二、 解决问题过程(一):MLPClassifier 与 MLPRegressor 核心 API(20 分钟)

2.1 模块导入与基本用法

1from sklearn.neural_network import MLPClassifier, MLPRegressor
2from sklearn.datasets import load_digits, fetch_california_housing
3from sklearn.model_selection import train_test_split
4from sklearn.preprocessing import StandardScaler
5from sklearn.metrics import classification_report, mean_squared_error

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 课):

1model = NeuralNetwork(n_input=10, n_hidden=32, n_output=1, learning_rate=0.1)
2model.fit(X_train, y_train, epochs=1000)

scikit-learn 等价实现

1model = MLPClassifier(hidden_layer_sizes=(32,), activation='relu',
2                      solver='sgd', learning_rate_init=0.1,
3                      max_iter=1000, random_state=42)
4model.fit(X_train.T, y_train.ravel())  # 注意:sklearn 要求 X: (n_samples, n_features)
  • 👨‍🏫 教师活动:逐一介绍核心参数及其对模型的影响;对比从零实现与 scikit-learn 的参数映射关系;强调数据维度要求的差异。
  • 🧑‍🎓 学生活动:记录核心参数及其含义;思考“为什么需要 L2 正则化”和“早停法的作用”。

通过建立“从零实现 → 框架接口”的映射关系,帮助学生将前几课的原理知识迁移到实际工具的使用中,而非孤立地学习 API。


📖 三、 解决问题过程(二):分类实战——手写数字识别(20 分钟)

3.1 数据集介绍:MNIST 手写数字(scikit-learn 版本)

1from sklearn.datasets import load_digits
2import matplotlib.pyplot as plt
3
4digits = load_digits()
5X, y = digits.data, digits.target
6
7print(f"数据形状: {X.shape}")  # (1797, 64)
8print(f"标签形状: {y.shape}")   # (1797,)
9print(f"类别数: {len(np.unique(y))}")  # 10

数据说明:

  • 1797 个样本
  • 每个样本为 8×8 = 64 像素的灰度图像
  • 像素值范围 0~16(0 为白色,16 为黑色)
  • 10 个类别(数字 0~9)

3.2 数据预处理与划分

 1from sklearn.model_selection import train_test_split
 2from sklearn.preprocessing import StandardScaler
 3
 4# 划分训练集和测试集
 5X_train, X_test, y_train, y_test = train_test_split(
 6    X, y, test_size=0.2, random_state=42
 7)
 8
 9# 标准化(MLP 对特征尺度敏感)
10scaler = StandardScaler()
11X_train_scaled = scaler.fit_transform(X_train)
12X_test_scaled = scaler.transform(X_test)
13
14print(f"训练集: {X_train_scaled.shape}, 测试集: {X_test_scaled.shape}")

⚠️ 重要:MLP 基于梯度下降优化,特征的尺度差异会影响收敛速度和最终性能。标准化是必要的预处理步骤。

3.3 MLPClassifier 训练

 1from sklearn.neural_network import MLPClassifier
 2from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
 3import seaborn as sns
 4
 5# 实例化模型
 6mlp = MLPClassifier(
 7    hidden_layer_sizes=(64, 32),  # 两个隐藏层:64 → 32
 8    activation='relu',
 9    solver='adam',
10    alpha=0.0001,
11    learning_rate_init=0.001,
12    max_iter=500,
13    early_stopping=True,
14    validation_fraction=0.1,
15    random_state=42,
16    verbose=True
17)
18
19# 训练
20mlp.fit(X_train_scaled, y_train)
21
22# 预测与评估
23y_pred = mlp.predict(X_test_scaled)
24print(f"测试集准确率: {accuracy_score(y_test, y_pred):.4f}")
25print("\n分类报告:")
26print(classification_report(y_test, y_pred))

3.4 损失曲线可视化

 1# 提取训练过程中的损失值
 2loss_curve = mlp.loss_curve_
 3
 4plt.figure(figsize=(8, 5))
 5plt.plot(loss_curve)
 6plt.xlabel('迭代次数')
 7plt.ylabel('损失值')
 8plt.title('MLPClassifier 训练损失曲线')
 9plt.grid(True, alpha=0.3)
10plt.show()

3.5 混淆矩阵可视化

1import seaborn as sns
2
3cm = confusion_matrix(y_test, y_pred)
4plt.figure(figsize=(8, 6))
5sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
6plt.xlabel('预测标签')
7plt.ylabel('真实标签')
8plt.title('混淆矩阵')
9plt.show()

3.6 预测错误样本分析

 1# 找出预测错误的样本
 2errors = np.where(y_pred != y_test)[0]
 3print(f"错误样本数: {len(errors)}")
 4
 5# 展示前 5 个错误样本
 6fig, axes = plt.subplots(1, 5, figsize=(10, 3))
 7for i, idx in enumerate(errors[:5]):
 8    axes[i].imshow(X_test[idx].reshape(8, 8), cmap='gray')
 9    axes[i].set_title(f"真实: {y_test[idx]}\n预测: {y_pred[idx]}")
10    axes[i].axis('off')
11plt.tight_layout()
12plt.show()
  • 👨‍🏫 教师活动:介绍 scikit-learn 内置手写数字数据集;演示数据预处理、模型训练、评估的完整流程;展示损失曲线和混淆矩阵的解读方法。
  • 🧑‍🎓 学生活动:跟随代码运行完整的分类流程;观察损失曲线是否收敛;分析混淆矩阵中哪些数字容易混淆。

通过完整的分类案例,让学生掌握 MLPClassifier 的标准使用流程。手写数字识别是机器学习领域的经典入门任务,其结果直观可验证。


📖 四、 解决问题过程(三):回归实战——房价预测(15 分钟)

4.1 数据集介绍:California Housing

1from sklearn.datasets import fetch_california_housing
2
3housing = fetch_california_housing()
4X, y = housing.data, housing.target
5
6print(f"数据形状: {X.shape}")  # (20640, 8)
7print(f"特征名称: {housing.feature_names}")
8print(f"目标值范围: [{y.min():.2f}, {y.max():.2f}]")

4.2 数据预处理与划分

1X_train, X_test, y_train, y_test = train_test_split(
2    X, y, test_size=0.2, random_state=42
3)
4
5# 标准化
6scaler = StandardScaler()
7X_train_scaled = scaler.fit_transform(X_train)
8X_test_scaled = scaler.transform(X_test)

4.3 MLPRegressor 训练

 1from sklearn.neural_network import MLPRegressor
 2from sklearn.metrics import mean_squared_error, r2_score
 3
 4mlp_reg = MLPRegressor(
 5    hidden_layer_sizes=(64, 32),
 6    activation='relu',
 7    solver='adam',
 8    alpha=0.001,
 9    learning_rate_init=0.001,
10    max_iter=500,
11    early_stopping=True,
12    validation_fraction=0.1,
13    random_state=42,
14    verbose=True
15)
16
17mlp_reg.fit(X_train_scaled, y_train)
18
19# 预测与评估
20y_pred = mlp_reg.predict(X_test_scaled)
21mse = mean_squared_error(y_test, y_pred)
22r2 = r2_score(y_test, y_pred)
23
24print(f"测试集 MSE: {mse:.4f}")
25print(f"测试集 R²: {r2:.4f}")

4.4 预测值与真实值对比图

 1plt.figure(figsize=(8, 5))
 2plt.scatter(y_test, y_pred, alpha=0.3)
 3plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()],
 4         'r--', linewidth=2, label='理想预测')
 5plt.xlabel('真实值')
 6plt.ylabel('预测值')
 7plt.title('房价预测:真实值 vs 预测值')
 8plt.legend()
 9plt.grid(True, alpha=0.3)
10plt.show()

4.5 分类与回归的 MLP 配置对比

配置项 分类(MLPClassifier) 回归(MLPRegressor)
输出层神经元数 类别数(自动确定) 1
输出层激活函数 Softmax 线性
损失函数 交叉熵 MSE
预测方法 predict() 返回类别 predict() 返回连续值
概率输出 predict_proba() 不适用
评估指标 准确率、F1、混淆矩阵 MSE、RMSE、R²
  • 👨‍🏫 教师活动:演示 MLPRegressor 的完整回归流程;对比分类与回归在 API 使用上的异同;展示预测值 vs 真实值散点图的解读方法。
  • 🧑‍🎓 学生活动:运行回归代码;对比回归与分类的评估指标;思考“为什么房价预测的 R² 通常没有分类准确率高”。

通过回归案例完整覆盖 MLPRegressor 的使用流程,帮助学生理解神经网络在同一框架下对不同类型任务的统一处理方式。


✍️ 五、 课堂练习与巩固(15 分钟)

📝 任务一:手写数字识别——调参实验

题目

使用 MNIST 手写数字数据集(load_digits),完成以下实验:

  1. 固定其他参数,分别设置 hidden_layer_sizes=(16,)(64,)(128, 64)(256, 128, 64),记录测试集准确率
  2. 固定 hidden_layer_sizes=(64, 32),分别设置 solver='sgd''adam''lbfgs',对比收敛速度和最终准确率
  3. 设置 early_stopping=True 并记录训练轮数,分析早停法是否有效
参考结果与解析
隐藏层结构 参数量(约) 测试准确率 训练时间
(16,) ~1,200 0.94
(64,) ~4,800 0.96 中等
(128, 64) ~11,000 0.97 较慢
(256, 128, 64) ~27,000 0.97

解析:更宽更深的网络提供更高的容量,但准确率提升边际递减,训练成本显著增加。使用 early_stopping=True 可以提前终止训练,避免过拟合。

📝 任务二:房价预测——特征重要性分析

题目

基于 California Housing 数据集:

  1. 训练 MLPRegressor,使用 hidden_layer_sizes=(32, 16)
  2. 通过以下方法分析特征重要性:
    • 逐一将每个特征置为 0(或随机打乱),观察模型性能下降幅度
    • 性能下降越大的特征越重要
  3. 列出对房价影响最大的前 3 个特征
参考代码与解析
 1import numpy as np
 2from sklearn.metrics import r2_score
 3
 4# 基准性能
 5base_score = r2_score(y_test, mlp_reg.predict(X_test_scaled))
 6
 7feature_importance = []
 8for i in range(X_test_scaled.shape[1]):
 9    X_permuted = X_test_scaled.copy()
10    X_permuted[:, i] = np.random.permutation(X_permuted[:, i])
11    score = r2_score(y_test, mlp_reg.predict(X_permuted))
12    drop = base_score - score
13    feature_importance.append((housing.feature_names[i], drop))
14
15feature_importance.sort(key=lambda x: x[1], reverse=True)
16print("特征重要性排名(性能下降越大越重要):")
17for name, drop in feature_importance:
18    print(f"  {name}: {drop:.4f}")

解析:该方法的原理是“消融实验”——移除一个特征的信息后模型性能的下降程度反映了该特征的重要性。这属于模型解释性的范畴。

📝 任务三:从零实现 vs scikit-learn 对比

题目

  1. 使用第 17-3 课实现的 NeuralNetwork 类在 load_digits 数据集上训练(需修改为多分类)
  2. 使用 MLPClassifier 在相同数据上训练
  3. 对比以下维度:
    • 代码行数
    • 训练速度
    • 最终准确率
    • 易用性
对比结果参考
对比维度 从零实现 MLPClassifier
代码行数 ~150 行 ~20 行
训练速度 慢(纯 Python 循环) 快(Cython 优化)
支持多分类 需自行实现 Softmax 自动支持
支持早停法 未实现 内置支持
支持 Adam 未实现 内置支持

结论:从零实现有助于理解原理,但实际项目中应使用经过优化的框架。


📝 六、 课堂小结(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

✏️ 随堂检测与互动练习

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

一、 单选题

  1. scikit-learn 的 MLPClassifier 默认使用的激活函数是?
  • A. Sigmoid
  • B. Tanh
  • C. ReLU
  • D. Linear
【答案】

【解析】C。scikit-learn 的 MLP 模块默认激活函数为 'relu',这是当前深度学习实践中隐藏层的首选激活函数。

  1. 以下哪个是 MLPClassifier 用于控制 L2 正则化强度的参数?
  • A. learning_rate_init
  • B. alpha
  • C. max_iter
  • D. batch_size
【答案】

【解析】Balpha 是 L2 正则化系数,值越大惩罚越强,有助于抑制过拟合。

  1. 对于小规模数据集(如数千样本),以下哪个求解器通常收敛最快且无需调整学习率?
  • A. 'sgd'
  • B. 'adam'
  • C. 'lbfgs'
  • D. 'adagrad'
【答案】

【解析】C'lbfgs'(拟牛顿法)在小规模数据集上收敛快且对超参数不敏感,无需设置学习率。

  1. MLPRegressor 的输出层默认使用的激活函数是?
  • A. Sigmoid
  • B. ReLU
  • C. Softmax
  • D. 线性(无激活)
【答案】

【解析】D。回归任务的输出不应限制取值范围,因此使用线性激活函数。

  1. 以下哪项不是 MLP 训练前通常需要进行的数据预处理操作?
  • A. 标准化 / 归一化
  • B. 处理缺失值
  • C. 类别特征编码
  • D. 自动增加隐藏层
【答案】

【解析】D。隐藏层结构是模型参数而非数据预处理操作。A、B、C 均为 MLP 训练前的必要数据预处理步骤。

二、 代码填空题

题目:使用 MLPClassifier 训练手写数字识别模型,请补全代码:

 1from sklearn.neural_network import __________
 2from sklearn.preprocessing import __________
 3
 4# 实例化模型
 5model = __________(
 6    hidden_layer_sizes=(64, 32),
 7    activation='relu',
 8    solver='adam',
 9    random_state=42
10)
11
12# 数据标准化
13scaler = __________()
14X_train_scaled = scaler.___________(X_train)
15X_test_scaled = scaler.__________(X_test)
16
17# 训练与预测
18model._______(X_train_scaled, y_train)
19y_pred = model.________(X_test_scaled)
【答案】
 1from sklearn.neural_network import MLPClassifier
 2from sklearn.preprocessing import StandardScaler
 3
 4model = MLPClassifier(
 5    hidden_layer_sizes=(64, 32),
 6    activation='relu',
 7    solver='adam',
 8    random_state=42
 9)
10
11scaler = StandardScaler()
12X_train_scaled = scaler.fit_transform(X_train)
13X_test_scaled = scaler.transform(X_test)
14
15model.fit(X_train_scaled, y_train)
16y_pred = model.predict(X_test_scaled)

三、 简答题

题目:MLP 模型训练前为什么要进行特征标准化?如果不进行标准化会有什么后果?

【答案】

MLP 基于梯度下降优化参数,其损失函数对特征的尺度敏感。当特征取值范围差异较大时:

  1. 梯度下降的收敛路径会变曲折,需要更多迭代次数才能收敛
  2. 学习率的选择变得困难——对尺度大的特征合适的学习率对尺度小的特征可能过大或过小
  3. 权重参数的初始化和更新受到特征尺度的不均匀影响
  4. 可能导致模型偏向数值范围大的特征

标准化(如 StandardScaler)将所有特征变换为均值为 0、方差为 1 的分布,消除了尺度差异带来的问题。


📮 七、 课后作业与拓展

📮 课后作业

作业一:多分类 MLP 综合实验(必做)

使用 scikit-learn 的 load_wine 葡萄酒数据集(3 分类,13 个特征),完成:

  1. 数据标准化与训练/测试集划分
  2. 使用 MLPClassifier 训练,设置 hidden_layer_sizes=(32, 16)
  3. 输出测试集准确率和分类报告(精确率、召回率、F1)
  4. 绘制混淆矩阵
  5. 对比不同隐藏层配置 (16,)(32, 16)(64, 32, 16) 的测试准确率

作业二:回归 MLP 对比实验(必做)

使用 fetch_california_housing 数据集:

  1. 训练线性回归模型(LinearRegression),记录测试集 R²
  2. 训练 MLPRegressor(hidden_layer_sizes=(64, 32)),记录测试集 R²
  3. 对比两个模型的性能差异,分析神经网络是否比线性模型有明显提升
  4. 尝试不同的 alpha 值(0.0001、0.001、0.01、0.1),观察正则化强度对泛化能力的影响

作业三:早停法与验证集分析(必做)

在 MNIST 手写数字数据集上:

  1. 设置 early_stopping=Truevalidation_fraction=0.1,训练 MLPClassifier
  2. 使用 model.validation_scores_ 属性提取验证集损失曲线
  3. 绘制训练损失和验证损失在同一张图上,观察早停法何时终止训练
  4. 对比启用和禁用早停法时的测试集准确率

作业四:MLP 参数网格搜索(选做)

使用 GridSearchCV 对 MLPClassifier 进行超参数搜索:

  1. 搜索空间:
    • hidden_layer_sizes: [(32,), (64,), (128,), (64, 32), (128, 64)]
    • alpha: [0.0001, 0.001, 0.01]
    • solver: ['adam', 'sgd']
  2. 使用 3 折交叉验证,输出最佳参数组合和对应准确率
  3. 将最佳模型在独立测试集上评估

作业五:实践拓展(选做)

  1. 使用 PyTorch 或 TensorFlow/Keras 实现与 MLPClassifier 等同的网络结构
  2. 对比 scikit-learn MLP 与 PyTorch 在以下维度的差异:
    • API 设计哲学(高层封装 vs 底层可定制)
    • 训练速度(CPU vs GPU)
    • 代码复杂度
    • 灵活性

📋 八、 板书设计

🛠️ 板书设计
 1┌───────────────────────────────────────────────────────────────────────────────┐
 2│                        17-4 MLP 应用实战                                      │
 3├───────────────────────────────────────────────────────────────────────────────┤
 4│                                                                               │
 5│  一、scikit-learn MLP 模块                                                   │
 6│                                                                               │
 7│      MLPClassifier  →  分类任务                                              │
 8│      MLPRegressor   →  回归任务                                              │
 9│                                                                               │
10│      接口: .fit(X, y)  .predict(X)  .score(X, y)                            │
11│                                                                               │
12│  二、核心参数                                                                 │
13│                                                                               │
14│      参数              说明                    常用值                         │
15│      ─────────────────────────────────────────────────────────────────         │
16│      hidden_layer_sizes   网络结构            (100,), (64, 32)               │
17│      activation           隐藏层激活          relu (默认)                    │
18│      solver              优化器              adam (默认), sgd, lbfgs        │
19│      alpha               L2正则化            0.0001 (默认)                   │
20│      learning_rate_init   初始学习率         0.001 (默认)                    │
21│      early_stopping      早停                False (默认)                    │
22│      max_iter            最大迭代次数        200 (默认)                      │
23│                                                                               │
24│  三、标准流程                                                                 │
25│                                                                               │
26│      加载数据 → 标准化 → 训练/测试划分 → 模型实例化 → 训练 → 评估            │
27│                                                                               │
28│  四、前后呼应                                                                 │
29│                                                                               │
30│      第17-1~17-3课: 从零实现 (~280行)                                        │
31│      第17-4课:     scikit-learn (~20行)                                     │
32│                                                                               │
33│      原理 + 工具 = 完整能力                                                   │
34│                                                                               │
35└───────────────────────────────────────────────────────────────────────────────┘

🔤 本课用到的单词

单词 发音(美式) 解释
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/ 抽象,将底层细节封装为高层接口的设计理念