Skip to content

模型是真的学会,还是偷看了答案? ​

先看一个有问题的高分 ​

一家商店想在用户付款时预测“这笔交易以后是否会退款”。团队训练了一个模型,测试准确率达到 99.8%。看起来非常成功。

但模型输入中有一列:退款完成时间。

付款发生时,这一列还不存在。只有真的发生退款后,它才会出现。模型相当于考试时直接看到了答案。这个问题叫数据泄漏:训练或测试过程使用了真实预测时不可获得的信息。

所以,判断机器学习结果时,第一个问题不该是“用了什么模型”,而应该是:

模型在什么时候做决定?那个时刻究竟能看到哪些信息?

1. 先把题目说成人话 ​

继续使用退款例子。一句合格的任务描述是:

在用户完成付款的时刻,只使用当时已经产生的交易信息,预测这笔交易在未来 30 天是否退款,用于决定是否进入人工复核。

这句话已经固定了四件事:

  • 时刻:付款完成时;
  • 输入:该时刻已经可见的交易信息;
  • 答案:未来 30 天是否退款;
  • 用途:决定是否人工复核。

如果这四件事说不清,后面的数据、模型和分数都没有稳定含义。

数学符号只是这句话的缩写:输入记为 x,正确答案记为 y,模型记为 fθ(x)。参数 θ 会根据带答案的历史样本调整。

2. 训练与测试就像练习和闭卷考试 ​

假设有 1000 条历史交易:

text
700 条训练集:带答案练习,用来调整模型参数
150 条验证集:模拟考试,用来选择模型和判断阈值
150 条测试集:最终闭卷考试,只在方案确定后使用

训练分数高只说明模型会做见过的练习题。我们真正关心的是它面对未见数据的表现,也就是泛化。

验证集与测试集的差别容易混淆:

  • 看了验证结果后,可以修改模型或阈值;
  • 看了测试结果后再反复修改,相当于根据正式考题备考,测试集便不再是闭卷考试。

3. 数据不能只靠随机打散 ​

真实使用发生在未来,所以常见做法是按时间切分:

text
较早历史 ─── 训练 ───│── 验证 ──│── 测试 ──> 更晚时间

还要避免同一对象跨集合泄漏。例如同一用户的十笔高度相似交易,如果九笔在训练集、一笔在测试集,模型可能只记住用户,而不是学会可迁移的退款规律。

因此切分前要问:数据之间是否共享用户、设备、病人、商品、文档模板或时间关系?这些业务语义不是随机函数能够自动知道的。

4. 为什么 99% accuracy 也可能没用 ​

假设 100 笔交易中只有 1 笔退款。一个什么都不学、永远回答“不退款”的模型,也有 99% accuracy。

所以要根据实际决策看不同问题:

问题常用观察
被送去人工复核的交易中,多少真的退款?precision
所有退款交易中,找回了多少?recall
不同阈值下,二者怎样取舍?PR 曲线、混淆矩阵
人工最多只能复核 100 笔怎么办?前 100 条的命中率与真实成本

指标不是越多越好。它必须回答真实决策问题,并和一个简单基线比较。

5. 基线是最简单的参赛者 ​

基线可以是“永远预测多数类”、一条业务规则或一个简单线性模型。如果复杂模型连基线都没有稳定超过,就没有证据证明复杂度有价值。

基线还有诊断作用:若一条极简单规则突然得到近乎完美的成绩,应优先检查重复样本和泄漏,而不是立即宣布问题已经解决。

6. 一份可信结论应该怎样说 ​

不可信:

模型准确率 99.8%,可以识别退款。

较可信:

在 2026 年 7 月之前的数据训练并调参,在 8 月首次出现的交易上测试。模型在固定人工复核量下比规则基线多找回 12% 的退款交易,但新商户样本仍明显较差;结果尚未证明 9 月以后或其他国家的数据同样有效。

后一种说法同时交代了数据范围、基线、指标、失败对象和没有证明的部分。

常见误解 ​

  • 随机切分就一定公平:错误。时间和实体关系可能仍然泄漏。
  • 训练 loss 下降就是学会:错误。它只说明训练目标被更好地拟合。
  • 测试一次高分就能上线:错误。还要检查样本代表性、错误代价、漂移和运行约束。
  • 复杂模型一定超过简单规则:错误。必须在同一闭卷考试上比较。

小结与自测 ​

记住四问即可:

  1. 什么时候预测?
  2. 当时能看到什么?
  3. 用哪些真正没见过的数据考试?
  4. 分数是否对应真实用途?

自测:要在病人入院时预测七天内是否再次住院,“出院诊断”和“七天后的随访记录”能作为输入吗?同一病人的多次记录为什么不能随意按行切分?

下一步:从常数基线到线性模型,亲手观察“训练题全对,但测试仍然出错”。

最近更新