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

这一讲对应《Hello, AI》第 5 章《真正的考试在训练集之外》。主线约 7 分钟的阅读量,展开讲一节课。
本章要回答的问题:怎样知道一个模型是真的学会了,还是只是把答案背下来了?
一个模型在训练数据上的表现,就像那个学生做去年试卷:它见过答案。
这个比喻贯穿全章,请把它立住:训练集 = 去年的卷子;测试集 = 今年的卷子;过拟合 = 背答案。
可以现场问:怎么才能知道一个学生是真会了还是背了?学生给出的办法(换题、换问法、问为什么),正好对应本章要讲的评估手段。
泛化,是机器学习唯一真正的目标。
损失、梯度、参数——上一章那些零件,全都是为它服务的。
这一章没有多少新算法,但它是这门课里最能保护你不被数字骗的一章。
如果整门课只能挑一章给非技术背景的管理者听,就是这一章。它教的是怎么审视别人给你的准确率。
三张卡片就是本章三节。第四节「相关不是因果」是附加的一节,讲的是思维的陷阱而不是数据的陷阱。
模型不但学到了数据里的规律,还学到了数据里的噪声和巧合——它把「这十个点恰好在这里」当成了「世界就是这样」。
让学生先投票再讲。多数人会直觉选右边——那个直觉是对的,本节就是给这个直觉配上词汇和办法。
左边那条曲线在点与点之间疯狂扭动,对任何新点的预测都离谱。
把噪声和巧合也学了进去。训练损失很低,新数据上很差。
旋钮越多、数据越少,越容易发生。
连数据里真实的规律都抓不住。用一条直线拟合一段明显的曲线,训练损失就下不去。
你希望模型足够灵活,能表达真实世界的复杂;又希望它不要灵活到把偶然当必然。
提醒学生:欠拟合很容易发现(训练损失就下不去),过拟合很难发现(训练损失非常漂亮)。危险的总是后者。
噪声会互相抵消,规律会更突出。这是最可靠也最贵的办法。
少一点旋钮,浅一点的树,小一点的网络。
在损失函数里加一项,惩罚旋钮拧得太大。
训练损失还在降、验证损失开始回升的那一刻,停下来。
第四条最直观,也最能说明「为什么需要验证集」——没有一份模型没学过的数据,你根本不知道该在哪里停。
模型太简单,不管给多少数据都抓不住真实规律,误差集中在同一个方向。
欠拟合 = 高偏差。
换一批训练数据,学出来的东西就大不相同——它对数据里的偶然太敏感。
过拟合 = 高方差。
任何模型都消不掉。它是这个问题的天花板。
增加复杂度:降偏差、增方差。增加数据:降方差、不改变偏差。
这就是为什么「更多数据」在深度学习时代如此重要——深度网络偏差极低,瓶颈几乎总在方差上。
可以补一个悬念:参数量远超样本量的大模型,按经典理论方差该爆炸,实践中泛化反而更好。这个现象叫「双下降」,2019 年之后理论界仍在消化。
既然训练数据上的表现不可信,就必须留一部分数据不给模型看——而且要留两份,因为「你自己」也会过拟合。
「你的决定受它影响」这句话是理解验证/测试之分的钥匙,下一页展开。
如果你反复根据一份数据调模型,
你自己就成了过拟合的一部分。
你会不自觉地把模型调到在那份数据上最好看的样子。
测试集必须是一份连你都没有反复看过的数据,它给出的数字才是对「新数据」的诚实估计。
这是学术界和工业界都常犯的错。公开数据集被全世界反复刷榜之后,榜上的成绩已经不再代表泛化能力——这是同一个问题的大规模版本。
用 2025 年的订单训练、2024 年的订单测试。模型看起来很准,但那是因为它偷看了未来。
前两年训练,最近一年测试。这才模拟了模型上线后真实面对的处境:只能用已经发生的,预测还没发生的。
上一章学情预警的例子就是这条铁律:不能随机打乱,否则模型会「偷看」同一学年的同学。
只有三百个样本时(一个班级三年的记录、一种罕见病的病例),留出三分之一做测试,训练数据就不够了,而且成绩会因为「恰好留出了哪些样本」剧烈波动。
把数据分成 k 份(常用 5 或 10),轮流拿一份做测试、其余训练,得到 k 个成绩取平均。代价是训练 k 次。
注意:有时间的数据,每一折也必须「用过去测未来」。
这一页给要做毕业设计或课题的学生特别有用。很多论文里 0.5 个百分点的「提升」,换一个随机种子就没有了。
「准确率 99%」是最常被引用、也最容易误导的数字。这一节讲怎么把它拆开看,以及为什么拆的方式本身是一个价值判断。
这个模型毫无用处。
我们真正关心的那一类(有病、是欺诈、需要帮助)往往是少数,准确率会被多数类淹没。
这一页可以让学生自己算:不及格率 12% 的班级,「全部预测及格」的准确率是多少?88%。上一章那个 91% 的模型,其实只比它好三个点。
两者通常此消彼长:把门槛放宽,召回率上去,精确率下来。
让学生用一句话复述这两个词,用他们自己的例子。能说清楚,本章最重要的技术内容就过了。
宁可误报——再查一次就是了;不可漏报,代价是一条命。
误报会让一个正常的孩子被另眼相看,代价可能比漏报还大。
指标不是技术选择,是价值选择。把它藏在「技术细节」里是不诚实的。
这一页请务必留出时间讨论。可以让学生举一个自己领域的例子,说明哪种错误更贵——答案往往有分歧,而分歧本身就是要点。
真正的部署决策是:
在这条曲线上选哪个点?
模型回答不了这个问题。它需要知道误报和漏报各自的代价,而代价由使用它的人和被它影响的人决定。
AUC 的好处是不依赖某一个门槛、也不受类别比例影响,比准确率稳健得多。但它回答不了「上线时用哪个门槛」,那一步永远是人的决定。
只要后者人数少,平均数就看不出来。这不是假设:
「按人群拆开呢?」
如果对方答不上来,说明他们没测过,也就不知道它对谁不准。
更难的是决定「公平」指什么:让各群体误报率相等,和让各群体漏报率相等,数学上通常不能同时做到。
最后一点很重要:公平不是一个可以「优化」的技术目标,而是几个互相冲突的定义,必须选一个。选哪个是政策问题。
准确率高、指标漂亮,模型上线后仍然可能翻车。原因往往不在模型,而在数据。
因为来三甲的病人本来就更重。同一个症状,在两个地方意味着不同的概率。
路网、通勤习惯、天气、消费水平,全都不一样。
训练数据不能代表要预测的对象时,再漂亮的指标也只是在描述过去那个样本。
请学生想一个身边的例子:在本校学生数据上训练的模型,能直接用到另一所学校吗?为什么不能?
模型会学到接近完美的准确率,因为它作弊了——而作弊用的那个特征,在真正需要预测的时刻并不存在。
泄漏的危险在于它让测试结果看起来很好。发现它的可靠信号是「好得不像话」:一个新特征让准确率从 80% 跳到 98%,先怀疑泄漏,再庆祝。
| 1 | 未来的信息混进特征 | 用「是否开住院单」预测住院 |
| 2 | 标签的代理变量 | 「客户经理备注长度」与违约高度相关——因为违约后才写很多备注 |
| 3 | 数据处理顺序 | 先对全部数据标准化再划分,测试集的统计量已进入训练 |
| 4 | 重复样本跨越划分 | 同一病人的多次检查被分到两边,模型「认出」了这个人 |
| 5 | 时间上的偷看 | 随机划分有时间顺序的数据 |
| 6 | 标识符携带信息 | 样本编号按时间或按类别分配 |
| 7 | 人工标注的痕迹 | 正样本图片上固定的裁剪方式或水印 |
| 8 | 缺失值的模式 | 某字段只在阳性样本里缺失,「是否缺失」成了答案 |
| 9 | 系统行为的副作用 | 账号退学后停用,「最后登录时间」泄漏了退学 |
| 10 | 测试集被反复用来选模型 | 这是人自己造成的泄漏 |
不必逐条讲。挑第 3、4、9 条讲——它们最反直觉,也最常在学生自己的项目里出现。
例子:疫情前的数据训练的出行模型,疫情一来全错;去年的学生训练的预警模型,今年换了教材和考试方式,它还在按去年的规律判断。
所以部署不是终点,监控才是。
每个特征的均值、方差、缺失率,与训练时比较。能在真实标签到来之前发出预警。
上周标了 8% 的学生,这周标了 30%?多半不是学生变了,是数据变了。
期末成绩、是否再入院、是否违约。等它到了,重算指标,按人群拆开。
使用者是否在绕过系统?老师是否不再看预警名单?这些信号比任何指标都早。
监控的成本常常超过训练的成本,而这笔账在立项时往往没人算。第二章两次寒冬的教训之一就在这里。
第四条最容易被忽略,也最早出现。一个没人看的预警系统,技术指标再好也已经失败了。
每个实验对应一个陷阱:抽样偏差、标签泄漏、分布偏移。你要做的不只是看它翻车,还要找出翻车的原因。
这个实验很短,但它教的东西可能是这门课里最实用的:以后你看到任何一个漂亮的准确率,第一反应会是「它是怎么测的」。
如果课上只做一个实验,建议就是这个。二十分钟,效果最好。
最后一个陷阱不是数据的,而是思维的。模型学到的全部是相关:什么和什么倾向于同时出现。
高度相关。模型会学到这一点。但它们的共同原因是夏天。
这可能只是因为买得起平板的家庭有更多其他资源。
相关足以做预测:知道冰淇淋销量确实能帮你预测溺水人数。
相关不足以做干预:给每个孩子发平板,不会自动提高成绩。
「预测」和「干预」这两个词的区分,是本节的全部。可以让学生各举一个例子,说明哪些决定只需要预测,哪些必须懂因果。
把「导致」换成「伴随」
再读一遍。
「数据显示使用时长导致成绩提升」
→「数据显示使用时长伴随成绩提升」。
意思还成立吗?如果成立,原句就说得太多了。
这是一个非常好用的日常工具,学生带出教室就能用在新闻和广告上。
随机实验:把对象随机分成两组,一组做 X,一组不做,比较 Y。随机分组保证两组在所有其他方面(包括你没想到的那些)平均而言相同,于是差异只能来自 X。
平板的问题,正确做法不是训练更大的模型,而是随机给一部分学生发平板,一个学期后比较。
于是有了自然实验、双重差分、工具变量、因果图——它们都需要对数据产生过程做出假设,而假设需要领域知识。
一句可以带走的追问:当一个 AI 产品声称「发现了 X 导致 Y」,问它——你随机分组了吗?如果没有,你假设了什么?
原因:女性更多地申请了竞争激烈、录取率低的院系。合起来看,这个「申请去向」的差异被隐藏了。
模型学到的相关,可能整个是由一个没进入特征的变量制造的。
找出这种变量,靠的不是更多数据或更强的算法,而是对这个领域的理解。
这也是为什么再好的模型,也不能替代懂业务的人。
一个变量(院系)同时影响了原因(性别分布)和结果(录取率),把它忽略掉,相关的方向可以完全反转。这是最强的一个「平均数会骗人」的例子。
成绩要在没见过的数据上考;
准确率要拆成误报和漏报分开看。
数字漂亮之后,还要问三件事:
数据从哪来?有没有泄漏?世界有没有变?
这三个追问可以印在一张卡片上。它们是这门课给非技术人员最实用的礼物。
一个模型训练损失接近零,验证损失却很高。发生了什么?可以怎么办?
为什么验证集和测试集要分开?只留一份「没训练过的数据」不够吗?
先让学生回答,再按右键展开答案。
一个欺诈检测模型准确率 99.5%。
你还需要知道什么,才能判断它好不好?
第一条是「杀手锏」:99.5% 听起来很好,但在这个比例下它其实比什么都不做还差。
「使用在线学习平台时长长的学生成绩更好」,
学校据此要求所有学生每天在线两小时。这个推理错在哪?
最后半句值得展开:一旦把一个相关指标变成考核目标,它就不再是那个指标了。这是第三章「奖励破解」在人身上的版本。
继续读
正文与「深入」段落:ai4edu.sjtu.edu.cn/helloai/read/generalization/
下一章:第 6 章 一层一层看出一只猫
留三到五分钟做本页的回顾,让学生用自己的话复述其中一条。
鼠标移到屏幕底部会显示控制条;页码记在地址栏的 # 后面,刷新不会丢。
手机上:竖着拿会自动把版面转过来(底下那条里的「转向」可以切回去),点右半边或往上滑翻页。