P2-15.2 进入 Part 3 之前的检查¶
Section ID:
P2-15.2Version:v2026.09.15
连接数据与计算¶
公式表达计算规则,Python 表达执行步骤。NumPy 负责数组计算,Pandas 负责表格选择与聚合,Matplotlib 用于检查数值变化和分布。Git 可以记录修改代码与说明的理由。
flowchart TD
A["公式<br/>计算规则"]
B["Python 与 NumPy<br/>执行与数组计算"]
C["Pandas<br/>检查样本与列"]
D["Matplotlib<br/>检查数值与误差"]
E["Git<br/>记录条件与变更"]
F["机器学习<br/>输入、学习、评价"]
A --> B --> C --> D --> E --> F
案例 1. 四名学生的输入与目标¶
假设要在考试前预测学生分数。以下虚构资料用于确认输入与目标之间的关系。学习时间、缺课次数和练习测验次数都是预测时已记录的信息,考试分数则是之后确认的目标。
| 学生 | 学习时间 | 缺课次数 | 测验次数 | 考试分数 |
|---|---|---|---|---|
| A | 2 | 5 | 3 | 50 |
| B | 4 | 3 | 5 | 65 |
| C | 6 | 1 | 7 | 80 |
| D | 8 | 0 | 9 | 90 |
输入 X 包含学习时间、缺课次数和测验次数三列,目标 y 包含考试分数。学生是行,特征是列,因此 X.shape 为 (4, 3),y.shape 为 (4,)。第一个输入 [2, 5, 3] 对应目标 50。
将考试分数也放进 X 会得到 (4, 4),却提供了考试前不可能知道的答案。列数正确、代码可运行,并不意味着输入构成正确。
去掉测验次数后,X.shape 变为 (4, 2),y.shape 不变。如果排除学生 D,必须在 X 与 y 两边同时删除该学生。
学生名称用于连接行,不作为本例的预测特征。如果仅将 X 按学习时间降序排列,D 的输入 [8, 0, 9] 就会错误地对应 A 的分数 50。样本数相同也可能构成错误的训练资料。
即使使用相同的三个特征,预测时改变列顺序也有问题。训练的第一列是学习时间,新学生的第一列也必须是学习时间。(1, 3) 只表示一名学生、三个特征,不保证各列的含义。
阅读训练与预测调用¶
scikit-learn 将能从数据中学习的对象称为 estimator。监督学习中的 fit(X_train, y_train) 使用训练输入与目标训练模型;predict(X_test) 将测试输入交给已训练模型,得到预测值。
| 表达 | 含义 |
|---|---|
| sample | 一条数据;本例中是一名学生 |
| feature | 输入属性;本例中是学习时间、缺课次数、测验次数 |
target、y | 需要预测的答案;本例中是考试分数 |
| train data | 用于训练模型的数据 |
| test data | 不用于训练或模型选择,留作最终评价的数据 |
fit | 从数据中学习模型规则 |
predict | 使用已训练模型计算输入对应的预测值 |
flowchart TD
A["划分成对样本"]
B["训练输入与目标<br/>X_train, y_train"]
C["训练<br/>fit"]
D["已训练模型"]
E["测试输入<br/>X_test"]
F["预测<br/>predict"]
G["预测值"]
H["测试目标<br/>y_test"]
I["最终评价"]
A --> B --> C --> D --> F --> G --> I
A --> E --> F
A --> H --> I
测试目标不作为 predict 的输入,而是在预测完成后用于比较预测值与实际答案。
训练、验证与测试的角色¶
划分数据是将样本对一起分开,而不是独立打乱 X 与 y。将 A、B、C 用于训练,D 用于测试,形状如下。这个四行例子只说明流程,不足以判断实际预测性能。
| 数据集 | 学生 | 输入形状 | 目标形状 |
|---|---|---|---|
| 训练 | A、B、C | (3, 3) | (3,) |
| 测试 | D | (1, 3) | (1,) |
fit 看到 A、B、C 的输入与目标,predict 只接收 D 的输入。产生的一个预测值与 D 的实际分数 90 比较。即使传入一个新样本,也需要保留特征矩阵的两个轴。
实际比较模型时,应在训练资料中留出验证数据,或使用交叉验证。验证结果用于选择特征、模型和设置,测试数据则留待选择结束后进行最终评价。根据测试分数不断修改特征,会把测试信息用于选择,使它失去独立最终评价的作用。
预处理参数也应从训练数据中得到。例如,要从学习时间中减去平均值,应使用 A、B、C 的平均值 (2+4+6)/3 = 4。对 D 的 8 小时应用相同标准,得到 8-4 = 4。如果先计算四名学生的平均值 5,就在训练前使用了测试输入信息。
案例 2. 区分误差、损失与评价值¶
另做一个计算练习:四名学生的实际分数为 [50, 65, 80, 90],预测分数为 [55, 60, 80, 85]。这些预测值是为比较指标而指定的,不是已训练模型的实验结果。实际值减去预测值得到 [-5, 5, 0, 5]。平均值是 1.25,但正负抵消,不能直接表示误差大小。
平方误差为 [25, 25, 0, 25],MSE 为 75 / 4 = 18.75。平均绝对误差 MAE 对误差绝对值取平均,结果为 15 / 4 = 3.75。相同预测在不同汇总方式下产生不同数值和含义。
| 汇总值 | 数值 | 解释 |
|---|---|---|
| 平均误差 | 1.25 分 | 正负误差抵消后的值 |
| MAE | 3.75 分 | 绝对误差的平均值 |
| MSE | 18.75 分² | 平方误差的平均值 |
| RMSE | 约 4.330 分 | MSE 的平方根 |
MSE 的数字大于 MAE,不意味着性能更差。它们以不同单位和计算规则汇总同一组预测。比较模型时,应使用相同评价样本和相同指标。
损失是训练过程中要减小的量,评价指标是判断结果的标准。同一计算,如 MSE,可以承担两种角色。需要说明它由哪些数据计算、用于什么决定。
将预测值改为 [50, 65, 80, 90],所有误差以及 MSE、MAE 都变为 0。这是检查计算的小例子。
现在只把最后一个预测值从 85 改成 75,计算 MAE 与 MSE 如何变化。绝对误差总和增至 25,MAE 为 6.25;平方误差总和增至 275,MSE 为 68.75。单个样本的大误差经过平方后影响更大。
记录改变的条件¶
改变输入特征或划分条件时,要与结果一起记录。仅写“结果改善”无法说明比较了什么。
| 记录项目 | 具体例子 |
|---|---|
| 输入变化 | 去掉测验次数,特征从三个变为两个 |
| 固定条件 | 相同训练与验证学生,相同模型设置 |
| 比较结果 | 记录修改前后的验证 MSE 与预测表;选择完成后测试 |
| 生成依据 | 代码和数据版本、执行命令 |
同时修改多个条件,很难区分结果差异由哪个变化引起。应根据比较目的选择并记录修改条件。
检查结果解释¶
判断以下情况能否直接解释为性能改善。
| 情况 | 判断与理由 |
|---|---|
| 将考试分数加入输入后误差变为 0 | 泄漏了预测时未知的答案,不能作为改善依据 |
从 X 删除一名学生,却不修改 y | 样本数与对应关系错误,应先修复输入 |
| 模型 A 的训练 MSE 低于模型 B 的测试 MSE | 评价数据不同,不能直接比较泛化性能 |
| 相同验证数据、相同指标下,去掉一个特征后误差更低 | 在该验证条件下有所改善,选择后仍需独立测试 |
代码能执行、数字变小并不足够。还要确认输入在预测时可知、样本配对正确、评价条件一致。
各概念的参考位置¶
| 内容 | 相关正文 |
|---|---|
| 变量与函数 | P2-2.1 |
| 向量与矩阵 | P2-3.1 |
| 均值与方差 | P2-5.2 |
| 损失函数 | P2-6.1 |
| 梯度下降 | P2-6.3 |
| 数组形状与轴 | P2-11.2 |
| 输入、目标与数据划分 | P2-12.3 |
| 图表解读 | P2-13.1 |
| MSE 计算 | P2-15.1 |
检查清单¶
- 能区分学生表中的输入列与目标列吗?
- 能解释删除一个特征或一名学生时
X、y形状如何变化吗? - 能区分传给
fit与predict的数据吗? - 能用上面的预测值计算平均误差、MSE 和 MAE 吗?
- 能区分训练损失与测试评价值的角色吗?
- 改变输入或划分时,能记录固定条件和结果吗?
- 能解释形状相同但行对应或特征顺序错误为什么仍有问题吗?
- 能区分使用验证结果进行选择与使用测试进行最终评价吗?
- 能用数值解释为什么预处理参数只能从训练数据中求得吗?
来源与参考资料¶
- scikit-learn developers, Getting Started 确认日期: 2026-09-15. X、y、fit、predict 的基本结构。
- scikit-learn developers, Glossary 确认日期: 2026-09-15. sample、feature、target、estimator 术语。
- scikit-learn developers, Common pitfalls and recommended practices 确认日期: 2026-09-15. 防止泄漏与从训练数据学习预处理参数。
- scikit-learn developers, Cross-validation: evaluating estimator performance 确认日期: 2026-09-15. 区分基于验证的选择与测试。
- scikit-learn developers, Regression metrics 确认日期: 2026-09-15. 用 MSE、MAE、RMSE 汇总同一预测。