训练、预测与泛化
fit 学习状态,predict 使用已学状态;泛化衡量模型对未见数据的有效性。
学习前需要掌握
背景与问题
同一个模型对象可以先拟合再多次预测,但这两个阶段的权限和输入不同。训练阶段可以使用训练标签;真实预测时,待预测样本的标签通常尚未产生,不能参与计算。
区分训练、预测与泛化,能帮助解释为什么某次模型输出合理,仍不足以证明它对未来样本可靠。
概念定义
训练用数据确定模型参数或状态,预测用已经确定的状态对新输入计算结果。泛化描述这种已学映射在未参与相应训练的数据上的表现,而不是模型对象中的一个固定开关。
某些模型支持增量学习,但只有明确执行更新接口并遵守其数据约定,才是在继续训练;不能把普通 predict 当成自动学习用户反馈。
直观理解
模型像一把用训练数据校准的尺子。预测是拿同一把尺子测量新样本;每测一个测试样本就重新校准,会改变评价过程,无法再公平解释为固定模型对新数据的表现。
两个测试样本必须使用同一组缩放参数
训练值为 [0,2],学到均值 1。之后先后预测 10 与 100 时,两条样本都应使用均值 1,而不是让“训练+10”或“训练+100”的均值决定各自变换。
即使某次重新拟合碰巧让输出更接近已知答案,也已经使用了测试分布信息。正确流程是冻结训练得到的管线,再用独立结果判断它是否泛化。
核心原理
预处理和模型一起构成已学状态。预测要复用训练集得到的填补值、缩放参数、类别集合和特征顺序,而不是仅保存最后的分类器。
训练成绩主要反映拟合过程,验证成绩帮助选择方案,独立测试检查锁定方案的表现。某个测试分数也是在特定数据与协议下的估计,不是对所有未来输入的保证。
泛化失败可能来自过拟合、输入超出训练覆盖、标签定义改变或业务环境变化,不能一律归因于“训练轮数不够”。错误分析应先定位变化发生在哪一层。
反馈到来后可以设计重训或增量更新,但必须记录版本并重新验证,避免悄悄改变模型后仍把旧测试结果当成新版本证据。
数学表达
核心表达
预测阶段必须冻结训练状态。只有明确支持增量学习的 partial_fit 才会更新;任何评价都需确认样本未参与相应 fit。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1明确模型学习状态
- 2仅在训练集 fit
- 3检查训练完成标志
- 4对新数据 predict
代码对应位置
示例 1预测前后核对真正的已学参数:检查 predict 没有重新拟合,而不是只比较超参数配置。
计算与实现步骤
- 明确模型学习状态
- 仅在训练集 fit
- 检查训练完成标志
- 对新数据 predict
- 使用合适指标评估
- 监控分布变化
代码实现
示例 1
预测前后核对真正的已学参数
example_01.py用途:检查 predict 没有重新拟合,而不是只比较超参数配置。
import numpy as np
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
model = make_pipeline(StandardScaler(), LogisticRegression()).fit(
[[0.], [1.], [2.], [3.]], [0, 0, 1, 1])
scaler, classifier = model.steps[0][1], model.steps[1][1]
mean_before, coef_before = scaler.mean_.copy(), classifier.coef_.copy()
prediction = model.predict([[2.5], [4.0]])
unchanged = np.array_equal(mean_before, scaler.mean_) and np.array_equal(coef_before, classifier.coef_)
print("prediction:", prediction.tolist())
print("parameters_unchanged:", unchanged)代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
检查 predict 没有重新拟合,而不是只比较超参数配置。
model- 组合预处理和估计器的模型对象。
scaler- 保存训练集缩放参数的转换器。
Step 1 · 1–12 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
model = make_pipeline(StandardScaler(), LogisticRegression()).fit(
[[0.], [1.], [2.], [3.]], [0, 0, 1, 1])
scaler, classifier = model.steps[0][1], model.steps[1][1]
mean_before, coef_before = scaler.mean_.copy(), classifier.coef_.copy()
prediction = model.predict([[2.5], [4.0]])
unchanged = np.array_equal(mean_before, scaler.mean_) and np.array_equal(coef_before, classifier.coef_)
print("prediction:", prediction.tolist())
print("parameters_unchanged:", unchanged)代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
prediction: [1, 1] parameters_unchanged: True
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 在测试集 fit
- 以为 predict 自动学习
- 训练高分等同泛化好
实际应用
- 所有监督模型
- 部署推理
常见错误
- 在测试集 fit
- 以为 predict 自动学习
- 训练高分等同泛化好
推荐学习资料
参考库不会生成虚假资源或无效外部链接。