跳转至

P2-15.2 进入 Part 3 之前的检查

Section ID: P2-15.2 Version: 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 吗?
  • 能区分训练损失与测试评价值的角色吗?
  • 改变输入或划分时,能记录固定条件和结果吗?
  • 能解释形状相同但行对应或特征顺序错误为什么仍有问题吗?
  • 能区分使用验证结果进行选择与使用测试进行最终评价吗?
  • 能用数值解释为什么预处理参数只能从训练数据中求得吗?

来源与参考资料