第 5 章 · 第二部分 学习

真正的考试在训练集之外

一个模型在见过的数据上表现好,不说明任何事。这一章讲泛化、过拟合、评估,以及数据里最常见的几个陷阱。

人工智能导论 · 上海交通大学「AI+教育」平台 · 讲义版幻灯片

这一讲对应《Hello, AI》第 5 章《真正的考试在训练集之外》。主线约 7 分钟的阅读量,展开讲一节课。

本章要回答的问题:怎样知道一个模型是真的学会了,还是只是把答案背下来了?

开场去年的卷子

他把去年的期末试卷连题带答案背得滚瓜烂熟

  • 今年换了题目,他一道也不会。你不会说他「学会了」。
  • 可是只看去年那份卷子——他是满分。
机器学习里每天都在发生

一个模型在训练数据上的表现,就像那个学生做去年试卷:它见过答案。

这个比喻贯穿全章,请把它立住:训练集 = 去年的卷子;测试集 = 今年的卷子;过拟合 = 背答案。

可以现场问:怎么才能知道一个学生是真会了还是背了?学生给出的办法(换题、换问法、问为什么),正好对应本章要讲的评估手段。

这一章的位置

泛化,是机器学习唯一真正的目标。

损失、梯度、参数——上一章那些零件,全都是为它服务的。

这一章没有多少新算法,但它是这门课里最能保护你不被数字骗的一章。

如果整门课只能挑一章给非技术背景的管理者听,就是这一章。它教的是怎么审视别人给你的准确率。

?

怎样知道一个模型是真的学会了,
还是只是把答案背下来了?

过拟合

学得太用力

考试制度

把数据分成三份

三个陷阱

数字漂亮,现实翻车

三张卡片就是本章三节。第四节「相关不是因果」是附加的一节,讲的是思维的陷阱而不是数据的陷阱。

一Part One

过拟合:学得太用力

模型不但学到了数据里的规律,还学到了数据里的噪声和巧合——它把「这十个点恰好在这里」当成了「世界就是这样」。

过拟合欠拟合偏差与方差早停
过拟合上一章实验里见过的画面

哪一条更懂这些点?

过拟合
左:穿过每一个点的曲线,训练损失为零。右:贴近它们的曲线。

让学生先投票再讲。多数人会直觉选右边——那个直觉是对的,本节就是给这个直觉配上词汇和办法。

左边那条曲线在点与点之间疯狂扭动,对任何新点的预测都离谱。

两端永恒的拉锯

学得太用力,和学得不够

过拟合

模型太灵活

把噪声和巧合也学了进去。训练损失很低,新数据上很差。

旋钮越多、数据越少,越容易发生。

欠拟合

模型太简单

连数据里真实的规律都抓不住。用一条直线拟合一段明显的曲线,训练损失就下不去。

你希望模型足够灵活,能表达真实世界的复杂;又希望它不要灵活到把偶然当必然。

提醒学生:欠拟合很容易发现(训练损失就下不去),过拟合很难发现(训练损失非常漂亮)。危险的总是后者。

怎么办四种常用手段

把模型拉回来

一

更多数据

噪声会互相抵消,规律会更突出。这是最可靠也最贵的办法。

二

限制复杂度

少一点旋钮,浅一点的树,小一点的网络。

三

正则项

在损失函数里加一项,惩罚旋钮拧得太大。

四

早停

训练损失还在降、验证损失开始回升的那一刻,停下来。

第四条最直观,也最能说明「为什么需要验证集」——没有一份模型没学过的数据,你根本不知道该在哪里停。

深入一个更精确的说法

偏差、方差、和消不掉的那部分

偏差

系统性地错

模型太简单,不管给多少数据都抓不住真实规律,误差集中在同一个方向。

欠拟合 = 高偏差。

方差

不稳定地错

换一批训练数据,学出来的东西就大不相同——它对数据里的偶然太敏感。

过拟合 = 高方差。

不可约误差

数据本身的噪声

任何模型都消不掉。它是这个问题的天花板。

增加复杂度:降偏差、增方差。增加数据:降方差、不改变偏差。
这就是为什么「更多数据」在深度学习时代如此重要——深度网络偏差极低,瓶颈几乎总在方差上。

可以补一个悬念:参数量远超样本量的大模型,按经典理论方差该爆炸,实践中泛化反而更好。这个现象叫「双下降」,2019 年之后理论界仍在消化。

二Part Two

考试制度:把数据分成三份

既然训练数据上的表现不可信,就必须留一部分数据不给模型看——而且要留两份,因为「你自己」也会过拟合。

训练集验证集测试集用过去预测未来
三份数据各司其职

训练、验证、测试

把数据分成三份 训练集 · 模型在上面学(约 70%) 验证集 · 调参数 测试集最后只考一次 反复看验证集调模型,你自己就成了过拟合的一部分;测试集必须连你都没反复看过。 有时间顺序的数据:用过去预测未来 2023 – 2025 上半年 · 训练 2025 下半年 · 测试 随机打乱再划分,模型会偷看未来,成绩会假得漂亮。
有时间的数据必须按时间切。
  • 训练集模型在上面学。
  • 验证集调超参数用:学习率、模型大小、什么时候停。模型不直接在上面学,但你的决定受它影响。
  • 测试集直到最后才拿出来考一次。此前任何决策都不能碰它。

「你的决定受它影响」这句话是理解验证/测试之分的钥匙,下一页展开。

为什么要分验证和测试

如果你反复根据一份数据调模型,
你自己就成了过拟合的一部分。

你会不自觉地把模型调到在那份数据上最好看的样子。
测试集必须是一份连你都没有反复看过的数据,它给出的数字才是对「新数据」的诚实估计。

这是学术界和工业界都常犯的错。公开数据集被全世界反复刷榜之后,榜上的成绩已经不再代表泛化能力——这是同一个问题的大规模版本。

铁律有时间顺序的数据

用过去预测未来,不是随机打乱

错

随机划分

用 2025 年的订单训练、2024 年的订单测试。模型看起来很准,但那是因为它偷看了未来。

对

按时间切

前两年训练,最近一年测试。这才模拟了模型上线后真实面对的处境:只能用已经发生的,预测还没发生的。

上一章学情预警的例子就是这条铁律:不能随机打乱,否则模型会「偷看」同一学年的同学。

深入数据少的时候怎么考试

交叉验证:每个样本都当过一次考题

只有三百个样本时(一个班级三年的记录、一种罕见病的病例),留出三分之一做测试,训练数据就不够了,而且成绩会因为「恰好留出了哪些样本」剧烈波动。

把数据分成 k 份(常用 5 或 10),轮流拿一份做测试、其余训练,得到 k 个成绩取平均。代价是训练 k 次。

更重要的用途
  • 比较两个方法时只看一次划分,很可能是噪声在做决定。
  • 一句该问的话「高了 0.8 个百分点」——是一次划分的还是交叉验证的?方差有多大?

注意:有时间的数据,每一折也必须「用过去测未来」。

这一页给要做毕业设计或课题的学生特别有用。很多论文里 0.5 个百分点的「提升」,换一个随机种子就没有了。

三Part Three

准确率之外

「准确率 99%」是最常被引用、也最容易误导的数字。这一节讲怎么把它拆开看,以及为什么拆的方式本身是一个价值判断。

混淆矩阵精确率召回率阈值
一个毫无用处的模型准确率 99%

某种疾病发病率 1%

不管看到谁都说「没病」99%准确率

这个模型毫无用处。

同样的陷阱在哪里出现
  • 垃圾邮件过滤
  • 欺诈检测
  • 学情预警

我们真正关心的那一类(有病、是欺诈、需要帮助)往往是少数,准确率会被多数类淹没。

这一页可以让学生自己算:不及格率 12% 的班级,「全部预测及格」的准确率是多少?88%。上一章那个 91% 的模型,其实只比它好三个点。

拆开看四个格子,两个比率

混淆矩阵

实际是「是」实际是「否」 预测「是」预测「否」 真阳性找对了 假阳性误报 假阴性漏报 真阴性放对了 精确率模型说「是」的里面,多少真的是真阳性 ÷ (真阳性 + 假阳性) 召回率所有真的「是」里,找出了多少真阳性 ÷ (真阳性 + 假阴性) 癌症筛查要高召回(宁可误报);给学生贴标签要高精确(误报伤人)。选哪边是价值判断。
两个问题
  • 精确率模型说「是」的那些里,有多少真的是?
  • 召回率所有真的「是」里,模型找出了多少?

两者通常此消彼长:把门槛放宽,召回率上去,精确率下来。

让学生用一句话复述这两个词,用他们自己的例子。能说清楚,本章最重要的技术内容就过了。

该偏向哪一边取决于代价

两种错误,两种后果

癌症筛查

要高召回

宁可误报——再查一次就是了;不可漏报,代价是一条命。

给学生贴「高风险」

恰恰相反

误报会让一个正常的孩子被另眼相看,代价可能比漏报还大。

指标不是技术选择,是价值选择。把它藏在「技术细节」里是不诚实的。

这一页请务必留出时间讨论。可以让学生举一个自己领域的例子,说明哪种错误更贵——答案往往有分歧,而分歧本身就是要点。

深入阈值与 ROC

没有「最好的模型」,只有「最合适的取舍」

  • 模型输出的是概率「这封邮件是垃圾邮件的概率是 0.83」。判不判,取决于门槛设在哪里。
  • 0.5 是默认,不是对的没有任何理由认为它合适。
  • ROC 与 AUC把门槛从 0 滑到 1,画出曲线;曲线下面积衡量所有门槛下的区分能力。0.5 是瞎猜,1 是完美。
但 AUC 也只是一个数
真正的部署决策是:
在这条曲线上选哪个点?

模型回答不了这个问题。它需要知道误报和漏报各自的代价,而代价由使用它的人和被它影响的人决定。

AUC 的好处是不依赖某一个门槛、也不受类别比例影响,比准确率稳健得多。但它回答不了「上线时用哪个门槛」,那一步永远是人的决定。

深入公平性

平均数会藏东西

整体错误率5%某个人群 1%,另一个人群 20%

只要后者人数少,平均数就看不出来。这不是假设:

  • 人脸识别不同肤色、性别人群上的错误率差距可达几倍到几十倍。
  • 语音识别对口音、儿童、老年人的错误率显著更高。
  • 学情预警历史上被关注得少、记录更不完整的学生,模型会「学会」对他们更不准。
一句该问的话
「按人群拆开呢?」

如果对方答不上来,说明他们没测过,也就不知道它对谁不准。

更难的是决定「公平」指什么:让各群体误报率相等,和让各群体漏报率相等,数学上通常不能同时做到。

最后一点很重要:公平不是一个可以「优化」的技术目标,而是几个互相冲突的定义,必须选一个。选哪个是政策问题。

四Part Four

三个陷阱

准确率高、指标漂亮,模型上线后仍然可能翻车。原因往往不在模型,而在数据。

抽样偏差标签泄漏分布偏移
陷阱一抽样偏差

数据只能教模型「它见过的世界」

医疗

三甲医院的数据,社区医院失灵

因为来三甲的病人本来就更重。同一个症状,在两个地方意味着不同的概率。

定价

一个城市的订单,换个城市就不准

路网、通勤习惯、天气、消费水平,全都不一样。

训练数据不能代表要预测的对象时,再漂亮的指标也只是在描述过去那个样本。

请学生想一个身边的例子:在本校学生数据上训练的模型,能直接用到另一所学校吗?为什么不能?

陷阱二标签泄漏

某个特征偷偷包含了答案

  • 预测是否住院特征里有「是否开了住院单」。
  • 预测是否及格特征里有「期末成绩」。
  • 更隐蔽的一种「最后一次登录时间」——因为系统在学生退学后自动清空账号,它泄漏了退学。
为什么危险

模型会学到接近完美的准确率,因为它作弊了——而作弊用的那个特征,在真正需要预测的时刻并不存在。

泄漏的危险在于它让测试结果看起来很好。发现它的可靠信号是「好得不像话」:一个新特征让准确率从 80% 跳到 98%,先怀疑泄漏,再庆祝。

深入泄漏的十种隐蔽形式

它们在真实项目里反复出现

1未来的信息混进特征用「是否开住院单」预测住院
2标签的代理变量「客户经理备注长度」与违约高度相关——因为违约后才写很多备注
3数据处理顺序先对全部数据标准化再划分,测试集的统计量已进入训练
4重复样本跨越划分同一病人的多次检查被分到两边,模型「认出」了这个人
5时间上的偷看随机划分有时间顺序的数据
6标识符携带信息样本编号按时间或按类别分配
7人工标注的痕迹正样本图片上固定的裁剪方式或水印
8缺失值的模式某字段只在阳性样本里缺失,「是否缺失」成了答案
9系统行为的副作用账号退学后停用,「最后登录时间」泄漏了退学
10测试集被反复用来选模型这是人自己造成的泄漏

不必逐条讲。挑第 3、4、9 条讲——它们最反直觉,也最常在学生自己的项目里出现。

陷阱三分布偏移

为晴天造的船,遇上了雨

分布偏移
所有模型都默认「未来像过去」,而这个假设没有任何保证。

例子:疫情前的数据训练的出行模型,疫情一来全错;去年的学生训练的预警模型,今年换了教材和考试方式,它还在按去年的规律判断。

所以部署不是终点,监控才是。

深入上线之后

仪表盘上该有什么

一

输入的分布

每个特征的均值、方差、缺失率,与训练时比较。能在真实标签到来之前发出预警。

二

输出的分布

上周标了 8% 的学生,这周标了 30%?多半不是学生变了,是数据变了。

三

延迟到来的真实表现

期末成绩、是否再入院、是否违约。等它到了,重算指标,按人群拆开。

四

人的反馈

使用者是否在绕过系统?老师是否不再看预警名单?这些信号比任何指标都早。

监控的成本常常超过训练的成本,而这笔账在立项时往往没人算。第二章两次寒冬的教训之一就在这里。

第四条最容易被忽略,也最早出现。一个没人看的预警系统,技术指标再好也已经失败了。

动手三个陷阱,三个小实验

亲手训练一个准确率很高的模型,然后看它翻车

每个实验对应一个陷阱:抽样偏差、标签泄漏、分布偏移。你要做的不只是看它翻车,还要找出翻车的原因。

实验 · 数据陷阱
为什么值得做

这个实验很短,但它教的东西可能是这门课里最实用的:以后你看到任何一个漂亮的准确率,第一反应会是「它是怎么测的」。

如果课上只做一个实验,建议就是这个。二十分钟,效果最好。

五Part Five

相关不是因果

最后一个陷阱不是数据的,而是思维的。模型学到的全部是相关:什么和什么倾向于同时出现。

冰淇淋与溺水预测 vs 干预随机实验辛普森悖论
相关两个例子

模型会忠实地学到它,而且学得很准

经典

冰淇淋销量与溺水人数

高度相关。模型会学到这一点。但它们的共同原因是夏天。

教育里的版本

「用平板做作业的学生成绩更好」

这可能只是因为买得起平板的家庭有更多其他资源。

相关足以做预测:知道冰淇淋销量确实能帮你预测溺水人数。
相关不足以做干预:给每个孩子发平板,不会自动提高成绩。

「预测」和「干预」这两个词的区分,是本节的全部。可以让学生各举一个例子,说明哪些决定只需要预测,哪些必须懂因果。

一个随手可用的检验

把「导致」换成「伴随」
再读一遍。

「数据显示使用时长导致成绩提升」
→「数据显示使用时长伴随成绩提升」。

意思还成立吗?如果成立,原句就说得太多了。

这是一个非常好用的日常工具,学生带出教室就能用在新闻和广告上。

深入从相关走向因果

因果是设计出来的,不是从数据里挖出来的

随机实验:把对象随机分成两组,一组做 X,一组不做,比较 Y。随机分组保证两组在所有其他方面(包括你没想到的那些)平均而言相同,于是差异只能来自 X。

  • 互联网公司叫它 A/B 测试每天做成千上万次。
  • 教育研究叫它随机对照试验判断教学方法是否有效的黄金标准。

平板的问题,正确做法不是训练更大的模型,而是随机给一部分学生发平板,一个学期后比较。

它的限制
  • 有些不能随机不能随机让一半学生辍学。
  • 有些太贵或太慢
  • 有些伦理上不允许

于是有了自然实验、双重差分、工具变量、因果图——它们都需要对数据产生过程做出假设,而假设需要领域知识。

一句可以带走的追问:当一个 AI 产品声称「发现了 X 导致 Y」,问它——你随机分组了吗?如果没有,你假设了什么?

深入辛普森悖论

分开看和合起来看,结论相反

1973
伯克利被指控录取歧视女性总体上男性申请者的录取率明显高于女性。
但是
按院系分开看大多数院系里,女性的录取率反而更高。

原因:女性更多地申请了竞争激烈、录取率低的院系。合起来看,这个「申请去向」的差异被隐藏了。

对机器学习的教训

模型学到的相关,可能整个是由一个没进入特征的变量制造的。

找出这种变量,靠的不是更多数据或更强的算法,而是对这个领域的理解。

这也是为什么再好的模型,也不能替代懂业务的人。

一个变量(院系)同时影响了原因(性别分布)和结果(录取率),把它忽略掉,相关的方向可以完全反转。这是最强的一个「平均数会骗人」的例子。

带走一句话

成绩要在没见过的数据上考;
准确率要拆成误报和漏报分开看。

数字漂亮之后,还要问三件事:
数据从哪来?有没有泄漏?世界有没有变?

这三个追问可以印在一张卡片上。它们是这门课给非技术人员最实用的礼物。

自测第 1、2 题

一个模型训练损失接近零,验证损失却很高。发生了什么?可以怎么办?

为什么验证集和测试集要分开?只留一份「没训练过的数据」不够吗?

参考答案 一、过拟合:模型记住了训练数据的噪声和巧合。办法:增加数据、降低模型复杂度、加正则项,或在验证损失开始回升时早停。

二、如果你反复根据同一份数据调整模型,你的选择会逐渐偏向在那份数据上好看的方向,等于间接过拟合了它。测试集必须是最后才看一次的数据,才能诚实估计对新数据的表现。

先让学生回答,再按右键展开答案。

自测第 3 题

一个欺诈检测模型准确率 99.5%。
你还需要知道什么,才能判断它好不好?

参考答案 ① 欺诈交易的比例——如果只有 0.3%,一个「全判正常」的模型准确率也有 99.7%,比它还高;② 精确率和召回率;③ 误报和漏报各自的代价——冻结一个正常用户的账户,和放过一笔欺诈,哪个更不能接受?

第一条是「杀手锏」:99.5% 听起来很好,但在这个比例下它其实比什么都不做还差。

自测第 4 题

「使用在线学习平台时长长的学生成绩更好」,
学校据此要求所有学生每天在线两小时。这个推理错在哪?

参考答案 它把相关当成了因果。时长和成绩的关系可能来自第三个因素——比如学习动机强的学生本来就会多用平台,也会考得好。强制延长时长不一定改变那个因素,也就不一定改变成绩;甚至可能让学生挂着页面做别的事,把这个相关彻底破坏掉。

最后半句值得展开:一旦把一个相关指标变成考核目标,它就不再是那个指标了。这是第三章「奖励破解」在人身上的版本。

收束第 5 章

这一章留下什么

  • 泛化是唯一的目标:训练集上的成绩就像做去年的卷子,不说明任何事。
  • 过拟合是高方差,欠拟合是高偏差;更多数据压方差,更复杂的模型压偏差,早停和正则项把它拉回来。
  • 三份数据各司其职:测试集必须是连你都没反复看过的;有时间顺序的数据必须「用过去预测未来」。
  • 准确率会被多数类淹没,要拆成精确率和召回率;偏向哪一边取决于两种错误的代价——指标是价值选择。
  • 三个陷阱:抽样偏差、标签泄漏、分布偏移。加上一个思维陷阱:相关不是因果,因果是设计出来的。
本章术语
泛化过拟合欠拟合训练集与测试集准确率精确率与召回率混淆矩阵标签泄漏分布偏移相关与因果

继续读

正文与「深入」段落:ai4edu.sjtu.edu.cn/helloai/read/generalization/
下一章:第 6 章 一层一层看出一只猫

留三到五分钟做本页的回顾,让学生用自己的话复述其中一条。

阅读本章正文 ↗ 全部幻灯片

放映快捷键

← → 空格
上一页 / 下一页
数字 + 停顿
跳到第 N 页
O
缩略总览,点一张跳过去
N
讲者备注抽屉
S
改成一步一点(默认一次一整页)
F
全屏
P
打印 / 导出 PDF(每页一张)
Esc
退出总览或关闭本窗

鼠标移到屏幕底部会显示控制条;页码记在地址栏的 # 后面,刷新不会丢。
手机上:竖着拿会自动把版面转过来(底下那条里的「转向」可以切回去),点右半边或往上滑翻页。

在手机上怎么翻

竖着拿的时候,整张幻灯片会自动转过来,字大一倍;把手机横过来也一样能看。

点右半边或往上滑是下一页,点左半边回上一页。屏幕底下那条里有缩略总览和讲者备注。

或者读这一章的正文 →