尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

机器学习复习Day5——偏差方差诊断

机器学习复习Day5——偏差方差诊断 ---type: notetitle: 偏差方差诊断编程作业date: 2026-08-26description: C2W3 作业。三个模型组成对照实验验证偏差方差理论Ex5 保持容量不变是为了控制变量回归误差量距离、分类误差数个数类别编号是代号不是数量两个差距的判断法复盘。---# 2026-08-26 学习笔记## 笔记区### 这份作业到底在干嘛**C2W3 是一个对照实验。** 像试药——要证明一种药有效不能只找一组人吃药看结果得设对照组。它要验证的命题是**模型太复杂会过拟合而正则化能治它。**于是作业让搭三个模型| 练习 | 模型 | 结构 | 参数量 | 在实验里的角色 || ---- | ---------- | ---------------------- | -------- | ------------------------------------ || Ex3 | 复杂模型 | 120 40 6 | 5446 | **制造病症**故意做胖让它过拟合 || Ex4 | 简单模型 | 6 6 | 60 | **对照组**容量小到几乎不可能过拟合 || Ex5 | 正则化模型 | 120 40 6 L2(0.1) | **5446** | **关键组**治疗后的病人 |Ex1 的 eval_mse 和 Ex2 的 eval_cat_err 不是主角是**量尺**——做实验总得有尺子量结果。回归部分用 MSE 那把尺分类部分用错误率那把尺。### 为什么 Ex5 必须保持 120/40 不变控制变量治过拟合最直觉的办法是把模型改小。但作业要求把 Ex3 原样重建只加 kernel_regularizerl2(0.1)参数量还是 5446和 Ex3 一模一样。**原因如果又改小、又加正则化最后效果好了就说不清是谁的功劳。**改小点就不那么容易过拟合了——正因为改小本身就能减轻过拟合两个变量一起动归因就断了。保持容量不动唯一变量只剩 L2。这时候效果变好只可能是 L2 干的。这就是试药实验里「两组人其他条件全一样只差吃没吃药」的道理。### 回归误差 vs 分类误差为什么不能用同一把尺**关键类别编号只是代号不是数量。**这份数据有 6 个类别编号 0~5。这些数字长得像数但作用跟球衣号码、门牌号一样**只是名字**。3 号球衣的球员不比 1 号大两倍。假设照搬平方差算分类误差- 真实 0 判成 5 → (0-5)² 25- 真实 0 判成 1 → (0-1)² 1等于说「把 0 判成 5」比「把 0 判成 1」错得严重 25 倍。**说不通**判错就是判错类别之间没有远近。**更硬的论证编号是人随便编的。** 把原来叫 0 的改叫 5、叫 5 的改叫 0数据一个点没动、任务一点没变——- 用平方差算 → 编号一换误差数字全变同一个模型换个编号成绩就不同荒谬- 数错的个数 → 不管怎么重编号判错的还是那几个点错误率纹丝不动合理编号能随便换说明它是**代号**不是**数量**代号之间不存在差多少。回归就不一样房价真实 300 万预测 305 万 vs 预测 800 万后者确实错得离谱得多因为房价是**真正的量**。| | y 是什么 | 误差怎么量 || ---- | ---------------------- | -------------------------- || 回归 | 真实的量价格、温度 | 差多远 → 平方差 || 分类 | 代号类别编号 | 对没对 → 数错的个数 ÷ 总数 |一句话**能比大小的用平方差只能比是不是同一个的就数个数。**### 判断偏差方差只比两组别的组合都不成立**三个量**| 量 | 是什么 | 打个比方 || --------------------- | --------------------------------------------------------------- | -------------- || **基线** baseline | 合理期望水平人类水平/已有算法。不是算出来的是定出来的参照 | 及格线 || **J_train** 训练误差 | 模型在**做过的**训练集上的错误率 | 练习册的正确率 || **J_cv** 交叉验证误差 | 模型在**没见过的**验证集上的错误率 | 模拟考的成绩 |**两个差距**| 比谁和谁 | 差距大 | 人话 || ----------------------- | -------------------- | ------------------------------------- || 基线 ←→ **J_train** | **高偏差**欠拟合 | 练习册都做不到及格线 → 本事根本不够 || **J_train** ←→ **J_cv** | **高方差**过拟合 | 练习册满分一模拟考就崩 → 只会背答案 |顺序**先看第一个差距再看第二个哪个差距大问题就是哪个。**## 代码逐段展开### Ex1 eval_mse — 回归的均方误差pythondef eval_mse(y, yhat):m len(y)err 0.0for i in range(m):err (y[i] - yhat[i])**2err / 2*mreturn(err)- m len(y)一共多少个样本。- for i in range(m)一个一个样本过。- (y[i] - yhat[i])**2真实值减预测值**再平方**。平方有两个作用一是差值有正有负直接加会互相抵消错 5 和错 −5 加起来等于 0看着像没错二是放大大错误逼模型优先修大问题。- err / 2*m累加完除以 2m 求平均。那个 **2** 是为了求导时把平方的系数 2 约掉C1 学过。### Ex2 eval_cat_err — 分类错误率pythondef eval_cat_err(y, yhat):m len(y)incorrect 0for i in range(m):if (y[i] ! yhat[i]): # 自己填的部分incorrect 1cerr incorrect/mreturn(cerr)- 整个函数从头到尾只有一个动作不相等就加 1。- incorrect/m错的个数 ÷ 总数 错误率。- 不管错到哪个类别去了**都只记一笔**。真实 2 判成 3、判成 5incorrect 都是加 1。### Ex3 复杂模型pythonmodel Sequential([tf.keras.layers.Dense(units120, activationrelu),tf.keras.layers.Dense(units40, activationrelu),tf.keras.layers.Dense(units6, activationlinear)], nameComplex)model.compile(loss SparseCategoricalCrossentropy(from_logitsTrue),optimizer tf.keras.optimizers.Adam(learning_rate0.01),)- 输出层 **6 个单元**因为这份数据有 6 个类别。- 输出层 linear 配 from_logitsTrue——昨天 Softmax 作业学过让损失函数在内部自己算 softmax数值更稳。- Sequential 只搭了骨架compile 才告诉它**用什么损失函数、用什么优化器**。少了 compile 没法训练。### Ex4 简单模型pythonmodel_s Sequential([tf.keras.layers.Dense(units6, activationrelu),tf.keras.layers.Dense(units6, activationlinear)], nameSimple)同一份数据容量从 160 个隐藏单元降到 6 个。参数量 5446 → 60。### Ex5 正则化模型pythonmodel_r Sequential([tf.keras.layers.Dense(120, activationrelu, kernel_regularizertf.keras.regularizers.l2(0.1)),tf.keras.layers.Dense(40, activationrelu, kernel_regularizertf.keras.regularizers.l2(0.1)),tf.keras.layers.Dense(6, activationlinear)])- 结构和 Ex3 **完全相同**唯一区别是两个隐藏层各加了 kernel_regularizer。- l2(0.1) 里的 **0.1 就是 8-04 学的那个 λ**——这是 λ 落到代码上的样子。- **思想**不砍模型容量还是 12040而是给大权重加罚款逼 w 别乱飘。既保留学复杂规律的能力又不至于把杂音也记住。- **第三层不加正则化**——测试函数 model_r_test 明确要求第 3 层 kernel_regularizer None。## 线索区合上材料自问自答**Q: 这份作业为什么要搭三个模型一个不行吗**A: 它是对照实验。一个复杂模型制造过拟合、一个简单模型对照组、一个复杂正则化关键组。只有摆在一起对比才能看出正则化到底起没起作用。**Q: Ex5 为什么不能顺手把模型改小一点**A: 控制变量。改小本身就能减轻过拟合如果又改小又加正则化效果变好了说不清是谁的功劳。保持 120/40 不动唯一变量只剩 L2。**Q: 分类误差为什么不能算平方差**A: 类别编号只是代号不是数量编号能随便重排而不改变任何东西。用平方差的话换个编号方式误差就变了同一个模型成绩不一样荒谬。数错的个数则不受编号影响。**Q: 判断高偏差高方差到底比哪两组**A: 基线 ←→ J_train 差距大 高偏差J_train ←→ J_cv 差距大 高方差。不存在J_cv vs 基线这种配对。比喻及格线管本事够不够练习册到模拟考的落差管是不是死记硬背。**Q: 给一组数怎么判断基线 5%A: J_train 4% / J_cv 18%B: J_train 16% / J_cv 17%**A: A 是高方差——训练误差比基线还低说明本事够但到交叉验证集掉了 14 个百分点用户原话「交叉验证集没得吃说明过拟合了」。B 是高偏差——训练误差就比基线高 11 个百分点用户原话「基线都没学到」而 J_train 到 J_cv 只差 1%。**Q: l2(0.1) 里的 0.1 是什么**A: 就是 8-04 学的正则化参数 λ。λ 大 → w 被压小 → 欠拟合高偏差λ 小 → 惩罚不够 → 过拟合高方差。---## 总结50 字以内C2W3 是对照实验复杂模型制造过拟合、简单模型作对照、复杂L2 保持容量不变作控制变量。分类误差数个数不算平方差编号是代号。判断只比两组基线↔J_train 看偏差J_train↔J_cv 看方差。---## 复习卡片| 概念 | 一句话 | 我的场景 || ------------- | ------------------------------------- | ------------------------------ || 对照实验 | 三个模型分别是病症/对照/治疗后 | 验证某个手段有没有用得有对照 || 控制变量 | 只动一个变量效果才能归因 | Ex5 保持 5446 参数不变只加 L2 || 分类误差 | 数错的个数不算差多少 | 类别编号是代号不是数量 || 高偏差 | 基线 ←→ J_train 差距大 | 练习册都做不到及格线 || 高方差 | J_train ←→ J_cv 差距大 | 练习册满分模拟考崩 || l2(0.1) | 代码里的 λ给大权重加罚款 | 保容量、治过拟合 |
返回列表