L04c Model Selection:拿测试集挑模型,那个分数就已经作废了
训练/验证/测试三分法、用 J_train 与 J_cv 的相对关系诊断偏差还是方差,以及学习曲线告诉你「加数据到底有没有用」。
一句话版
模型在新数据上表现差,先别乱调:把数据切成训练、验证、测试三份,看训练误差和验证误差的相对关系,判断是欠拟合还是过拟合,再决定加数据、加特征还是调 λ。
一个类比:模拟考、月考和高考
把训练集当作平时做的练习册,交叉验证集当作月考,测试集当作高考。
练习册你做过很多遍,分数当然高,这个分数说明不了你会不会考试(p.19 的训练误差乐观)。要知道哪种复习方法有效,就拿月考来比:方法 A、方法 B、方法 C 各复习一轮,谁月考分高就用谁。月考可以考很多次,因为它就是用来做选择的(p.24 的验证集)。
高考只考一次,而且考完不许再改复习方法。如果你先看高考卷子、再挑复习方法、再报高考分数,这个分数没人会信,因为你的方法是冲着这套卷子挑的(p.20 的「d 在测试集上拟合」)。
诊断也能对上。练习册和月考都考得差,而且差不多差,说明你根本没学会,多刷题没用,要换更深的教材(高偏差,p.38)。练习册满分、月考很差,说明你背下了练习册的答案,多做些没见过的题会有帮助(高方差,p.39)。
类比在哪里失效:考试里练习册、月考、高考是三套不同的题;三分法里三份数据来自同一个数据集随机切分,分布相同,只是模型「见没见过」这一点不同。另外考试可以复习后再考月考,但模型每换一次超参数就要从头重训一遍 θ,不是在原来的 θ 上接着改。
概念卡
1. 训练误差是乐观估计(Optimistic Training Error)
人话定义:参数 θ 是在训练集上通过最小化 J 得到的,所以训练集上的误差天然偏低,不等于模型在新房子上的表现(p.19)。
例子:p.13 的房价图用高次多项式把训练点全穿过去,训练误差接近 0,但预测新房子时会「上下乱跳」,这就是泛化失败。
常见误解:训练误差低就说明模型好?
恰恰相反,训练误差极低而验证误差高是过拟合的信号。p.19 的原话是训练误差「likely to be lower than the actual generalization error」,评估模型要看没参与训练的数据。2. 训练/交叉验证/测试三分法(Train / Cross-Validation / Test Split)
人话定义:把数据随机切成三份,典型比例 60/20/20。训练集用来学 θ,交叉验证集用来在候选模型(不同 d、不同 λ)之间做选择,测试集只在最后报一次泛化误差(p.21–p.24)。
例子:p.22 的 10 行房价数据,前 6 行训练,1534/315 和 1427/199 两行做交叉验证,1380/212 和 1494/243 两行做测试。三个误差 J_train、J_cv、J_test 公式形状完全一样,都是 (1/2m) Σ(h − y)²,差别只在算的是哪份数据、除以哪个 m(p.23)。
常见误解:只切训练/测试两份也能选模型?
两分法只能评估一个已定的模型,不能用来选模型。p.20 演示了拿测试集挑 d = 5 之后,J_test(θ⁽⁵⁾) 变成乐观估计,因为「多项式次数」这个额外参数已经在测试集上拟合过了。多出来的第三份数据就是为了把「选」和「评」分开。3. 模型选择(Model Selection)
人话定义:候选模型排成一列(d = 1, 2, …, 10 或 λ = 0, 0.01, 0.02, …),每个候选在训练集上训一遍得到 θ⁽ᵈ⁾,在交叉验证集上算 J_cv(θ⁽ᵈ⁾),挑最小的那个(p.25、p.33)。
例子:p.25 假设 J_cv 在 d = 4 处最小,就选 θ₀ + θ₁x + … + θ₄x⁴,然后用测试集算 J_test(θ⁽⁴⁾) 报出去。p.33 的 λ 候选是 0 之后从 0.01 起每次翻倍,一共 12 个。
常见误解:p.33 的「θ⁽⁴⁾」是四次多项式?
不是。p.33 的上标编号是候选 λ 的序号:第 4 个候选是 λ = 0.04,θ⁽⁴⁾ 是在这个 λ 下训出的参数,模型形式没变。同样的符号在 p.25 表示 d = 4,两页要分开读。4. 偏差与方差(Bias vs. Variance)
人话定义:高偏差是模型太简单,连训练集都拟合不好(欠拟合);高方差是模型太复杂,把训练集的噪声也学进去了(过拟合)。判断不看绝对值,看 J_train 和 J_cv 的相对关系(p.27–p.29)。
例子:p.27 的三张图,直线 θ₀ + θ₁x 是高偏差,二次曲线刚刚好,四次曲线穿过每个点是高方差。p.28 把 d 从 1 扫到 10,J_train 一路下降,J_cv 先降后升成 U 形。
常见误解:J_cv 高就一定是过拟合?
J_cv 高在两种情况下都会出现,单看它分不出原因。p.29 的规则是再看 J_train:J_train 也高且两者接近是偏差问题;J_train 低而 J_cv 远高于它才是方差问题。5. 正则化参数与偏差/方差(Regularization and Bias/Variance)
人话定义:λ 控制对大参数的惩罚。λ 很大(课件举 λ = 10000)时所有 θ_j ≈ 0,h ≈ θ₀ 变成一条水平线,高偏差;λ 很小接近不正则化,高方差;中间某个 λ 刚好(p.31、p.34)。
例子:p.34 横轴是 λ,J_train 随 λ 增大而上升(惩罚越重越难拟合训练集),J_cv 仍是 U 形,但左边是方差区、右边是偏差区,和 d 那张图左右镜像。
常见误解:J_train 里要不要带 λ 那一项?
不带。p.32 明确把优化目标 J(θ) 和三个评估误差分开写:J(θ) 含正则项,用来训 θ;J_train、J_cv、J_test 都不含正则项,只算预测误差。惩罚项是训练时的手段,不是评价指标。6. 学习曲线(Learning Curves)
人话定义:固定模型,横轴是训练集大小 m,画 J_train 和 J_cv 两条线。m 越大 J_train 越难压低(上升),J_cv 因为见过更多数据而下降。两条线的形状告诉你「继续加数据有没有用」(p.36–p.39)。
例子:p.38 高偏差时两条线很快贴在一起,而且都很高,再加数据也压不下去,应该加模型复杂度。p.39 用 θ₀ + … + θ₁₀₀x¹⁰⁰ 加很小的 λ,训练误差极低、验证误差高,两条线之间有大缺口,加数据大概率能让缺口变小。
常见误解:加数据总是有帮助?
只对高方差有效。p.38 的原话是高偏差时「getting more training data will not (by itself) help much」,因为模型本身太简单,看再多数据也画不出那条曲线。先诊断再决定要不要去收数据,这正是 p.11 说「诊断值得花时间」的原因。7. 六个补救动作(What to Try Next)
人话定义:p.10 列出模型在新数据上出错时可以试的六件事,本讲的目的是把它们和诊断结果配对,而不是逐个瞎试。
例子:治高方差用加训练数据、减少特征、增大 λ;治高偏差用增加特征、加多项式特征、减小 λ。p.41 把这些收进一张总图:模型复杂度从低到高,偏差²下降、方差上升,总泛化误差在中间某处最低。
常见误解:减少特征和增大 λ 是两件不相干的事?
方向相同。减特征是直接删掉一些 θ_j,增大 λ 是把它们压向 0,都在降低模型有效复杂度,所以都归在治方差那一组。反过来加特征和减小 λ 都在放开复杂度,归在治偏差那一组。把它们串起来
起点是 p.10 的场景:正则化线性回归在新房子上预测误差很大,手里有六个动作可选。p.11 说先做诊断。诊断的第一步是承认训练误差不可信(p.19),于是把数据切开;两分法能评估却不能选模型(p.20),于是切三份(p.21–p.24)。有了 J_train 和 J_cv,就能给每个候选 d 或 λ 打分并挑最小的(p.25、p.33),也能顺带判断当前模型是偏差问题还是方差问题(p.28–p.29、p.34)。学习曲线回答最后一个问题:加数据值不值(p.36–p.39)。p.41 的总图把整讲收口,模型复杂度的最佳点就是偏差和方差之和最小的地方,六个动作无非是在这条横轴上往左或往右挪一步。
课件里的坑
- [课件有误] 正则项求和上限写成 m(样本数),应为 n(特征数),出现在 p.10、p.31、p.32、p.33、p.34;同一份课件的 p.8 写的是正确的 n。
- [课件有误] p.17 逻辑回归的 J_test 第二项 log 里漏了「1 −」,正确形式是 (1 − y) log(1 − h(x))。
- [课件有误] p.25 选中的模型写成 θ₀ + θ₁x₁ + … + θ₄x⁴,单变量多项式回归里第一项应为 θ₁x,下标 1 是多余的。
- [课件留白] p.17 的 0/1 错分率公式是空的:err = 1 当 h(x) ≥ 0.5 且 y = 0,或 h(x) < 0.5 且 y = 1,否则 0;测试错误率是这些 err 的平均。
- [读图提醒] p.33 的 θ⁽⁴⁾ 是第 4 个候选 λ 下的参数,不是 d = 4;p.37 标题写「high bias and low variance」,右半边图实际是「Low bias case」,读图时以图内标注为准。
- [课件留白] p.15 的 70/30 切分没说要先随机打乱;如果数据按房价排序过再切,训练集和测试集分布会不同,切之前先 shuffle。
- [课件留白] p.40 的「irreducible error」和 p.41 的偏差²+方差分解课件只给了图,没有文字;考试上只需要记住总误差 = 偏差² + 方差 + 不可约误差,不可约误差是数据本身的噪声,换任何模型都去不掉。
课后 10 分钟:考点复习
这 10 分钟怎么用:前 3 分钟把必背的 7 条读一遍,重点是第 4 条的两组不等式;中间 4 分钟做完整例题,把 6 个候选 d 的选择和诊断走一遍;最后 3 分钟做变式题,自己先答,再展开参考答案对照。闪卡留到下次复习用。
必背
- 训练误差是乐观估计:参数在训练集上拟合过,训练误差一定低于真实泛化误差
- 拿测试集挑 d 或 λ,测试误差就变成乐观估计,因为超参数已经在测试集上拟合过
- 三分法固定顺序:训练集拟合 θ,交叉验证集选超参数(d、λ),测试集只在最后报一次分
- 高偏差(欠拟合):J_train 高且 J_cv ≈ J_train;高方差(过拟合):J_train 低且 J_cv ≫ J_train
- d 增大:J_train 单调下降,J_cv 先降后升;λ 增大方向正好相反,λ 很大时 θ_j ≈ 0,h ≈ θ₀ 高偏差
- 学习曲线:高偏差时两条线很快收敛在高位,加数据没用;高方差时两条线之间有大缺口,加数据很可能有用
- 六个补救动作分两组:治高方差用加数据、减特征、增大 λ;治高偏差用加特征、加多项式项、减小 λ
完整例题
题面:你用多项式回归预测房价,数据按 60/20/20 切成训练、交叉验证、测试三份。对 d = 1 到 6 各训一个模型,得到下表(单位:千美元²,数字为构造)。
| d | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| J_train | 42.0 | 18.5 | 12.1 | 9.8 | 6.2 | 2.1 |
| J_cv | 44.5 | 21.0 | 14.9 | 15.6 | 24.3 | 39.7 |
(a) 应该选哪个 d?(b) 选出的模型泛化误差怎么报?(c) d = 1 和 d = 6 各是什么问题?(d) 如果最终模型仍然不够好,六个动作里优先试哪些?
解法:
- 选 d 只看 J_cv:最小值 14.9 出现在 d = 3,所以 选 d = 3。J_train 在 d = 6 最小是意料之中,它只会随 d 下降,不能拿来选(p.28)。
- 泛化误差报 J_test(θ⁽³⁾),也就是拿 d = 3 训好的参数在测试集上算一次误差。不能报 J_cv = 14.9,因为 d 是在交叉验证集上挑出来的,这个数已经偏乐观(p.20、p.25)。
- d = 1:J_train = 42.0 很高,J_cv = 44.5 与它接近,两个数都高、挨得近,是 高偏差(欠拟合)。d = 6:J_train = 2.1 很低,J_cv = 39.7 远高于它,是 高方差(过拟合)(p.29)。
- 假设选定 d = 3 后画学习曲线,若两条线之间仍有明显缺口,优先 加训练数据、增大 λ;若两条线已贴在一起且都偏高,优先 加特征或再往上加一阶多项式。加数据只在高方差时值得去做(p.38–p.39)。
变式题(先自己做)
同样的数据,固定 d = 6,改扫 λ:候选 λ = 0, 0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28, 2.56, 5.12, 10.24。你得到 J_cv 在 λ = 0.64 时最小,且 λ = 10.24 时 J_train 和 J_cv 都很大并且几乎相等。
(a) 最终模型的参数记作什么?(b) λ = 10.24 那一端是什么问题,为什么?(c) 这张 J_cv 对 λ 的曲线与例题里 J_cv 对 d 的曲线,哪边是方差区?
提示
p.33 的编号是候选序号。λ 从大到小相当于模型从简单到复杂。参考答案与自检(非官方评分标准)
(a) λ = 0.64 是列表里第 8 个候选,参数记作 θ⁽⁸⁾,最终报 J_test(θ⁽⁸⁾)。自检:上标是候选序号,不是 λ 的值,也不是多项式次数。
(b) λ = 10.24 时惩罚太重,所有 θ_j 被压向 0,h ≈ θ₀ 接近一条水平线,是 高偏差(欠拟合);J_train 和 J_cv 都高且相等正是偏差问题的特征(p.31、p.34)。
(c) λ 图的 左边(λ 小)是方差区,右边是偏差区;d 图正好相反,左边 d 小是偏差区、右边是方差区。两张图 J_cv 都是 U 形,只是横轴方向的含义翻转(p.34)。
闪卡自测
1. 为什么训练误差不能当泛化误差用?
θ 是在训练集上最小化 J 得到的,训练误差天然偏低,p.19 称之为乐观估计。2. 用测试集选 d 之后,J_test 为什么不可信?
d 这个额外参数已经在测试集上拟合过,J_test 变成对泛化误差的乐观估计(p.20)。3. 三分法典型比例?p.22 的 10 行数据怎么分?
60/20/20;6 行训练,2 行交叉验证,2 行测试。4. J_train、J_cv、J_test 三个公式的区别在哪?
形状完全一样,都是 (1/2m) Σ(h − y)²,只是算在不同数据子集上、除以各自的 m(p.23)。它们都不含 λ 正则项。5. J_train 高、J_cv ≈ J_train,是什么问题?
高偏差、欠拟合(p.29)。6. J_train 低、J_cv ≫ J_train,是什么问题?
高方差、过拟合(p.29)。7. 随着 d 增大,J_train 和 J_cv 各怎么变?
J_train 单调下降;J_cv 先降后升呈 U 形,谷底就是该选的 d(p.28)。8. λ = 10000 时模型长什么样,属于哪种问题?
θ_j ≈ 0,h ≈ θ₀ 是水平线,高偏差欠拟合(p.31)。9. 学习曲线里 J_train 为什么随 m 上升?
样本越多,模型越难同时穿过所有点,训练误差被抬高;同时 J_cv 因见过更多数据而下降(p.36)。10. 高偏差时加数据有用吗?高方差呢?
高偏差没用,两条线早已收敛在高位(p.38);高方差有用,缺口会随数据增多缩小(p.39)。11. 六个动作里哪些治方差、哪些治偏差?
治方差:加数据、减特征、增大 λ;治偏差:加特征、加多项式项、减小 λ。12. 总泛化误差可以拆成哪三部分?
偏差² + 方差 + 不可约误差;不可约误差是数据噪声,换模型也去不掉(p.40–p.41)。下一讲
第 4 周三份课件到此结束:线性回归学会了怎么训 θ,正则化学会了怎么压住过拟合,这一讲学会了怎么判断该往哪个方向调。下一讲进入机器学习 Part II,从回归转向分类问题,前面的三分法、偏差方差诊断和学习曲线在分类模型上同样适用,只是误差换成 p.17 那种对数损失或 0/1 错分率。
个人整理的学习笔记,不是官方材料;数字与结论以课件和讲师为准。