面向真实使用的评价设计
数据划分必须模拟未来来源、时间、群组和预测时可用信息。
学习前需要掌握
背景与问题
模型分数回答的其实是某一种预测情境下的表现。随机留下几行数据,可能测到同一用户的新记录;按用户留出,才更接近对新用户的表现。划分设计不同,得到的结论也不同。
在选算法前,应先定义预测对象、预测时点、可获得的特征与错误代价,再决定验证样本如何模拟未来使用。
概念定义
评价设计先定义模型未来面对谁、何时预测、预测跨度和错误成本,再决定随机、时间、群组或来源外测试。
直观理解
测试不是从数据表随机抽题,而是模拟上线后真正会遇到的新对象。
核心原理
评估单位不一定是数据表的一行。一个患者有多次检查、同一图片有增强副本时,行与行之间并不独立;随机按行划分可能让训练和验证共享同一对象的信息。
时间边界决定特征是否可用。预测时点之后才产生的结算金额、处理结果或人工结论,不能作为当时的输入。即使列名没有标签字样,也可能携带未来信息。
协议还应规定主指标、次指标、基线、调参预算与最终测试的使用方式。模型选择阶段可以使用验证或交叉验证,但一旦根据测试结果改方案,测试集就参与了开发,不能继续作为独立证明。
应把划分逻辑和索引保存下来,检查训练验证之间的实体、时间与数据版本关系。没有一种划分器能自动解决全部问题:分组、时间与地区变化可能需要组合规则或自定义评估。
数学表达
核心表达
划分设计优先于算法选择;特征可用性、重复实体、时间顺序和地区/设备变化都要进入协议。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1定义预测时点和对象
- 2识别时间/群组/来源
- 3选择划分器
- 4冻结测试集
代码对应位置
示例 1用患者标识验证分组隔离:完整构造患者数据并检查划分契约;这里只验证评估设计,不训练模型或声称业务准确率。
案例:预测未见患者的检查结果
构造 6 名患者,每人 2 条记录。如果目标是服务新患者,必须让一个患者的全部记录进入同一个验证折。下方代码用 GroupKFold 留出患者,并直接检查训练与验证患者集合没有交集。
若部署目标其实是预测已知患者的下一次检查,还应按时间模拟可用历史。患者隔离回答“能否推广到新患者”,时间隔离回答“能否预测未来记录”,两者不能仅凭分数高低互相替代。
计算与实现步骤
- 定义预测时点和对象
- 识别时间/群组/来源
- 选择划分器
- 冻结测试集
- 在训练部分验证
- 分群报告误差
代码实现
示例 1
用患者标识验证分组隔离
example_01.py用途:完整构造患者数据并检查划分契约;这里只验证评估设计,不训练模型或声称业务准确率。
import numpy as np
from sklearn.model_selection import GroupKFold
X = np.arange(12).reshape(-1, 1)
y = np.tile([0, 1], 6)
patients = np.repeat(np.arange(6), 2)
overlap = []
sizes = []
for train, valid in GroupKFold(3).split(X, y, groups=patients):
overlap.append(len(set(patients[train]) & set(patients[valid])))
sizes.append((len(train), len(valid)))
assert overlap == [0, 0, 0]
print("overlap:", overlap)
print("train_valid_sizes:", sizes)代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
完整构造患者数据并检查划分契约;这里只验证评估设计,不训练模型或声称业务准确率。
X- 完整特征矩阵,每行一个样本、每列一个特征。
y- 目标标签或连续目标值。
Step 1 · 1–2 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.model_selection import GroupKFoldStep 2 · 4–14 行
输出中间参数、形状或最终指标,用于核对代码是否符合预期。
X = np.arange(12).reshape(-1, 1)
y = np.tile([0, 1], 6)
patients = np.repeat(np.arange(6), 2)
overlap = []
sizes = []
for train, valid in GroupKFold(3).split(X, y, groups=patients):
overlap.append(len(set(patients[train]) & set(patients[valid])))
sizes.append((len(train), len(valid)))
assert overlap == [0, 0, 0]
print("overlap:", overlap)
print("train_valid_sizes:", sizes)预期输出或运行结果
本地 scikit-learn 1.8.0 的核对输出: overlap: [0, 0, 0] train_valid_sizes: [(8, 4), (8, 4), (8, 4)]
常见错误 · 4 条
- 先挑让分数最高的划分,再把它描述为真实部署情境。
- 同一实体、重复样本或未来字段跨越训练验证边界。
- 反复查看测试结果后调参,却继续称该分数为独立测试表现。
- 确认样本轴、特征轴以及 X 与 y 的第一维完全对应。
实际应用
- 医疗
- 用户行为
- 时间预测
常见错误
- 先挑让分数最高的划分,再把它描述为真实部署情境。
- 同一实体、重复样本或未来字段跨越训练验证边界。
- 反复查看测试结果后调参,却继续称该分数为独立测试表现。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。