模型是真的学会,还是偷看了答案?
先看一个有问题的高分
一家商店想在用户付款时预测“这笔交易以后是否会退款”。团队训练了一个模型,测试准确率达到 99.8%。看起来非常成功。
但模型输入中有一列:退款完成时间。
付款发生时,这一列还不存在。只有真的发生退款后,它才会出现。模型相当于考试时直接看到了答案。这个问题叫数据泄漏:训练或测试过程使用了真实预测时不可获得的信息。
所以,判断机器学习结果时,第一个问题不该是“用了什么模型”,而应该是:
模型在什么时候做决定?那个时刻究竟能看到哪些信息?
1. 先把题目说成人话
继续使用退款例子。一句合格的任务描述是:
在用户完成付款的时刻,只使用当时已经产生的交易信息,预测这笔交易在未来 30 天是否退款,用于决定是否进入人工复核。
这句话已经固定了四件事:
- 时刻:付款完成时;
- 输入:该时刻已经可见的交易信息;
- 答案:未来 30 天是否退款;
- 用途:决定是否人工复核。
如果这四件事说不清,后面的数据、模型和分数都没有稳定含义。
数学符号只是这句话的缩写:输入记为
2. 训练与测试就像练习和闭卷考试
假设有 1000 条历史交易:
700 条训练集:带答案练习,用来调整模型参数
150 条验证集:模拟考试,用来选择模型和判断阈值
150 条测试集:最终闭卷考试,只在方案确定后使用训练分数高只说明模型会做见过的练习题。我们真正关心的是它面对未见数据的表现,也就是泛化。
验证集与测试集的差别容易混淆:
- 看了验证结果后,可以修改模型或阈值;
- 看了测试结果后再反复修改,相当于根据正式考题备考,测试集便不再是闭卷考试。
3. 数据不能只靠随机打散
真实使用发生在未来,所以常见做法是按时间切分:
较早历史 ─── 训练 ───│── 验证 ──│── 测试 ──> 更晚时间还要避免同一对象跨集合泄漏。例如同一用户的十笔高度相似交易,如果九笔在训练集、一笔在测试集,模型可能只记住用户,而不是学会可迁移的退款规律。
因此切分前要问:数据之间是否共享用户、设备、病人、商品、文档模板或时间关系?这些业务语义不是随机函数能够自动知道的。
4. 为什么 99% accuracy 也可能没用
假设 100 笔交易中只有 1 笔退款。一个什么都不学、永远回答“不退款”的模型,也有 99% accuracy。
所以要根据实际决策看不同问题:
| 问题 | 常用观察 |
|---|---|
| 被送去人工复核的交易中,多少真的退款? | precision |
| 所有退款交易中,找回了多少? | recall |
| 不同阈值下,二者怎样取舍? | PR 曲线、混淆矩阵 |
| 人工最多只能复核 100 笔怎么办? | 前 100 条的命中率与真实成本 |
指标不是越多越好。它必须回答真实决策问题,并和一个简单基线比较。
5. 基线是最简单的参赛者
基线可以是“永远预测多数类”、一条业务规则或一个简单线性模型。如果复杂模型连基线都没有稳定超过,就没有证据证明复杂度有价值。
基线还有诊断作用:若一条极简单规则突然得到近乎完美的成绩,应优先检查重复样本和泄漏,而不是立即宣布问题已经解决。
6. 一份可信结论应该怎样说
不可信:
模型准确率 99.8%,可以识别退款。
较可信:
在 2026 年 7 月之前的数据训练并调参,在 8 月首次出现的交易上测试。模型在固定人工复核量下比规则基线多找回 12% 的退款交易,但新商户样本仍明显较差;结果尚未证明 9 月以后或其他国家的数据同样有效。
后一种说法同时交代了数据范围、基线、指标、失败对象和没有证明的部分。
常见误解
- 随机切分就一定公平:错误。时间和实体关系可能仍然泄漏。
- 训练 loss 下降就是学会:错误。它只说明训练目标被更好地拟合。
- 测试一次高分就能上线:错误。还要检查样本代表性、错误代价、漂移和运行约束。
- 复杂模型一定超过简单规则:错误。必须在同一闭卷考试上比较。
小结与自测
记住四问即可:
- 什么时候预测?
- 当时能看到什么?
- 用哪些真正没见过的数据考试?
- 分数是否对应真实用途?
自测:要在病人入院时预测七天内是否再次住院,“出院诊断”和“七天后的随访记录”能作为输入吗?同一病人的多次记录为什么不能随意按行切分?
下一步:从常数基线到线性模型,亲手观察“训练题全对,但测试仍然出错”。