第3讲 · EECS 189:机器学习机制——术语与技术

UC Berkeley EECS 189/289A《机器学习导论》2026 春季 · 课堂实录重构

主讲 Alex Dimakis、Jennifer Listgarten
视频 https://www.youtube.com/watch?v=oVo_RajZ3aE
课程主页 https://eecs189.org/sp26/
官方讲义/笔记(Lecture 3) Google Drive PDF
教材 Machine Learning: A First Course for Engineers and Scientists(Lindholm 等),本讲对应 Chapter 1
幻灯片致谢 Lecture 3 幻灯片由 Joseph E. Gonzalez、Narges Norouzi 制作
图片来源 书中幻灯片插图为官方 PDF 高清渲染图;少量截图为视频画面

对应讲次:第3讲(UC Berkeley EECS 189 机器学习导论)

制作模型:deepseek-flash(coding-agent / pi;据 ~/.pi/agent/settings.json)

说明:课程材料版权归 UC Berkeley 及授课教师所有,本书仅供学习

编者说明:本讲是机器学习方法论的「鸟瞰图」——引入术语与生命周期,但不陷入数学细节(后续各讲会重新深入)。授课在「正则化」一页(约 01:15)停下,剩下的幻灯片(参数化/非参数化、逻辑回归、优化、评估、作业等)归入文末附录。


导言:本讲目标

(参考时间: 00:00)

本讲将引入使用机器学习时的主要概念,提供一个高层的理解(而非严格推导);所有主题都会在学期后半段更正式地回顾。我们还会展示如何用 Python 做基础的机器学习,走一遍机器学习生命周期的每一步,并为 Homework 1 做准备。

本讲标题页

📷 本讲标题页
回到原视频 (00:00:34)

今天的目标:

今天的目标

📷 今天的目标
回到原视频 (00:00:47)

一个小调查(Slido):课前用过哪些库?结果——几乎所有人都用过 NumPy;用 pandas 的比例出乎意料地高;用 scikit-learn 的也很多;不少人用过 PyTorch;没有人用过 JAX(讲师说他自己也不用 JAX,而用 PyTorch)。

课前调查:用过哪些库

📷 课前调查:用过哪些库
回到原视频 (00:02:23)


一、scikit-learn 与机器学习生命周期

(参考时间: 00:04)

本讲的主角之一是 scikit-learn——一个被广泛使用的 Python 包,覆盖机器学习生命周期的多个子环节:

今天介绍 scikit-learn

📷 今天介绍 scikit-learn
回到原视频 (00:04:13)

机器学习生命周期(ML Lifecycle)由四个阶段组成:

flowchart LR
    A["Learning Problem<br/>定义问题"] --> B["Model Design<br/>模型设计"]
    B --> C["Optimization<br/>优化/训练"]
    C --> D["Predict & Evaluate<br/>预测与评估"]
    D -.->|"迭代"| B
机器学习生命周期

📷 机器学习生命周期
回到原视频 (00:04:51)

第一阶段永远是「定义学习问题」,它包含三个要素:

这些听起来很直观,但实际上非常复杂,需要非常认真地思考——实践中大多数错误都发生在这里。

定义学习问题

📷 定义学习问题
回到原视频 (00:05:18)


二、把问题形式化:FashionHub 的例子

(参考时间: 00:05)

设想你正在创办一个服装交易网站(FashionHub):用户上传想交易的衣物照片。我们希望根据卖家上传的图片,自动把衣物打上类别标签,以便归入正确的类别(像 eBay 那样,上传运动鞋就自动识别出来)。我们手上还有一些带类别标签的示例服装图片。

用生命周期的语言来问:我们要预测什么?——衣物的类型;我们有什么数据?——成对的「图片 + 标签」(labeled pairs);如何评估成功?——也许是准确率(accuracy):拿 100 张图看分类对了多少。

例子:FashionHub

📷 例子:FashionHub
回到原视频 (00:05:34)

编者说明:讲师强调,上面这套说法在举例层面是对的,但在现实中几乎处处是坑。 - 准确率未必是好的度量:电商真正关心的是「用户参与度(engagement)」,因为它决定你能否融到 A 轮;分类器的准确率未必等于参与度。 - 数据从哪来?「我们是一家初创公司,我们不知道——你去想办法。」这才是真实的工作方式。 - 标签的粒度(granularity)至关重要:是分「鞋 vs 非鞋」,还是分「运动鞋 / 靴子」,还是分「Nike / Jordan」?问题越细越难。而在公司里没人会给你一份 20 页的规格说明,你得自己想清楚。 - 合成图片(用 Gemini / Midjourney 生成)在图像上效果很差:讲师说他曾花约一年尝试用合成数据训练图像分类器,效果并不好(文本可以,图像不行)。而且生成模型本身可能已在目标数据集上训练过。 - 爬取图片也有陷阱:Google 图片搜索里「运动鞋」的结果可能是广告页上一个开心的人,鞋根本没露多少;更根本的是循环依赖——如果你能自动标注图片,你早就把要做的模型做出来了。

那么真实的数据集是怎么来的?讲师举了 CIFAR-10 与 ImageNet 的例子:当年博士们正是去 Flickr / Google 图片搜索按关键词抓图,再交给真人标注员逐张确认——这就是 ImageNet 的构建方式。

定义完问题后,第二步是「看懂你的数据」。讲师在这里说了本讲最想强调的一句话:

我真的、真的、真的希望你去「看」你的数据。如果是图片,就去看图片;如果是表格,就在 Excel / Google Sheets 里打开,花上几个小时逐行看那些数字。如果你这样做了,「我的一生就没有白费」。

定义学习问题(含「看懂数据」)

📷 定义学习问题(含「看懂数据」)
回到原视频 (00:07:07)


三、看懂你的数据

(参考时间: 00:16)

数据通常是一个训练用的 CSV 表:$D$ 个特征(每个特征占一列),$N$ 个样本(每个样本占一行)——这是贯穿整门课的统一约定。对图像分类,一行就是那张图片的像素,标签是「运动鞋 / T 恤 / ……」这样的类别。

「看懂数据」要回答的问题包括:

务必去采样、去阅读、去画图。

数据:特征与标签

📷 数据:特征与标签
回到原视频 (00:16:49)

一个真实演示:看 Fashion-MNIST 风格的服装图片(踝靴、套头衫、T 恤、裤子……)。看的时候你会立刻发现问题——这张到底是踝靴还是运动鞋?也许它标错了,也许它该归到运动鞋而不是踝靴。这就是「看数据」的价值:只有亲眼看过,你才会回去问产品经理「我们到底要不要把它分类成踝靴」。

看懂机器学习问题并观察数据(演示)

📷 看懂机器学习问题并观察数据(演示)
回到原视频 (00:19:22)

FashionHub 服装图像数据(视频画面)

📷 FashionHub 服装图像数据(视频画面)
回到原视频 (00:19:40)

另一个可以做的统计是像素值分布:这些是灰度图,每个像素取值 0–255。把全部图片的像素做成直方图,你就能看到「平均亮度」的分布。例如:

很多真实数据集并不干净,正是通过这类统计,你才能发现「动态范围不对」这类问题。


四、机器学习问题的分类

(参考时间: 00:23)

按「有没有标签」划分:

flowchart TD
    ML["机器学习"] --> SL["监督学习<br/>(有标签 y)"]
    ML --> UL["无监督学习<br/>(无标签)"]
    ML --> RL["强化学习<br/>(只有奖励)"]
    SL --> Q["标签为连续值<br/>→ 回归 Regression"]
    SL --> C["标签为离散类别<br/>→ 分类 Classification"]
    UL --> DR["降维<br/>PCA 等"]
    UL --> CL["聚类<br/>K-means 等"]
机器学习问题的分类

📷 机器学习问题的分类
回到原视频 (00:23:21)

监督学习

📷 监督学习
回到原视频 (00:24:53)

值得注意的是:即使是无监督问题,人们也常常把它转成监督问题。经典例子就是 GPT:语言生成本身不是监督问题,但你可以用「给定前面的词,预测下一个词」把它构造成监督问题;训练好之后,再拿它去做生成这种非监督任务。图像上也有类似做法——自监督学习:把图片切两半,给模型下半部分,让它判断上半部分来自哪张图,从而学到有用的内部表示。

编者说明:讲师还吐槽了一个经典的面试错误:对三分类问题(0/1/2)直接跑回归。数字标签只是任意的编码,不含序数意义;用回归会强行给模型「分类别是有序的」这一错误暗示。

分类问题的标签是离散类别(如图片里的衣物类型)。离散标签常被编码成数字,但应当被当作类别来对待。两类主要问题:

分类问题

📷 分类问题
回到原视频 (00:28:53)

定义学习问题:训练/测试划分

📷 定义学习问题:训练/测试划分
回到原视频 (00:29:29)


五、如何评估分类器:准确率的问题

(参考时间: 00:29)

最直观的度量是准确率(accuracy)= 预测正确的数量 / 样本总数。例如测试集 100 张图对了 85 张,准确率就是 85%。

但准确率有严重问题。讲师举了一个新闻标题:「机器学习研究者做出了一个神经网络,只要看你在网上的照片,就能预测你是否感染新冠!」 你该问什么?

答案是:它有大约 99% 的准确率——但那只是因为它一直回答「没有」。因为感染率不到 1%,一个「永远说 no」的分类器就能有 99%+ 的准确率。准确率在这里是一个糟糕的度量。

准确率的问题

📷 准确率的问题
回到原视频 (00:29:47)

你会以两种方式犯错:

你会以两种方式犯错

📷 你会以两种方式犯错
回到原视频 (00:32:52)

这两类错误在实际系统中的影响完全不同。例如:

你会以两种方式犯错(续)

📷 你会以两种方式犯错(续)
回到原视频 (00:33:23)

讲师用 Rivian 召回的真实案例说明:因为前控制臂/转向节的紧固件没有拧紧(可能在图中看到裂纹),Rivian 召回了几乎所有 222 辆车。漏掉一个缺陷的代价,可能远大于报废一些好产品。

因此:

编者说明:如果 100 辆车里只有 1 辆紧固件有缺陷,随机抽检 10% 可能根本抽不到;要让这样的产品可以出厂,模型必须有极小的第二类错误概率。

两类错误的代价(续)

📷 两类错误的代价(续)
回到原视频 (00:33:43)

两类错误的代价与 Rivian 召回

📷 两类错误的代价与 Rivian 召回
回到原视频 (00:34:03)


六、泛化与数据划分

编者拓展|fa26 用 KNN 把这一整节演示了一遍:2026 秋季(fa26)用 k 近邻(KNN) —— 最简单、几乎没有“训练”的模型 —— 把本节的概念(泛化、训练/测试划分、超参数 $k$、验证集)逐个演了一遍: $k{=}1$ 时训练集准确率 100%、测试集却很差,正是“记忆不等于学会”的最直白版本。 本书(sp26 春季实录版)没有 KNN 这一讲,补充内容见 《补充:KNN、机器学习词汇与 K-Means》。

6.1 考试类比:记忆不等于学会

(参考时间: 00:36)

我们即将用数据训练模型。怎么知道模型真的「学到」了?

如何评估模型:考试类比

📷 如何评估模型:考试类比
回到原视频 (00:36:16)

6.2 泛化

泛化(Generalization)是模型在与训练数据同分布的、新的未见数据上表现良好的能力。要评估泛化,就必须有办法在未用于训练的新数据上评估模型。

泛化

📷 泛化
回到原视频 (00:37:07)

6.3 训练-测试划分(Train-Test Split)

标准做法:

  1. 打乱(shuffle)训练数据;
  2. 切成两部分:
  3. 较大的训练集(~80%):用于开发与训练模型;
  4. 较小的测试集(~20%):用于评估泛化性能。

测试集只应在模型开发、训练完成后使用一次。

训练-测试划分

📷 训练-测试划分
回到原视频 (00:38:13)

为什么只能用一次?因为如果你用测试集来调参,测试集就不再衡量泛化了——你其实在「从测试集学习」,开始作弊。

为什么测试集只能用一次

📷 为什么测试集只能用一次
回到原视频 (00:39:34)

6.4 验证集(Validation Split)

为了在开发过程中调参,我们从训练集中再切出一个验证集:

验证集

📷 验证集
回到原视频 (00:40:17)

三者对应的考试类比:

训练-验证-测试的考试类比

📷 训练-验证-测试的考试类比
回到原视频 (00:47:20)

编者说明:这里有一个 Kaggle 式的经典技巧——当你用验证集挑完最优超参数后,要在「训练集 + 验证集」的全部数据上重新训练最终模型,再看测试集;仅这一步往往就能带来约 5% 的提升。此外,80/20 还是 50/50 存在权衡:验证集越大,你「观测」超参数的能力越强,但留给模型训练的数据越少、模型越弱。极端情况下可用交叉验证(cross validation)、分层交叉验证(stratified CV),甚至训练一个模型去预测性能。

6.5 ImageNetV2:一次关于「测试集」的复制研究

(参考时间: 00:47)

讲师大篇幅介绍了一篇来自 Berkeley 的著名论文(Ludwig Schmidt、Vaishaal Shankar、Ben Recht 等,作者按字母序排列)。背景:ImageNet 是 AI 史上最重要的数据集之一(由李飞飞团队创建,被誉为「AI 之母」),包含上百万张图片、上千个类别。

它的构建方式是:去 Flickr 搜「花」等关键词,再让 Amazon Mechanical Turk 上的标注员在类似下图的界面里逐张确认「这是不是一只 bluebird」。这就是原始 ImageNet 数据收集过程(也是 CIFAR-10 的方式)。

关于训练/测试划分的有趣论文(ImageNetV2)

📷 关于训练/测试划分的有趣论文(ImageNetV2)
回到原视频 (00:47:58)

问题是:ImageNet 分类器能泛化到 ImageNet 吗?听起来荒谬——怎么会泛化不了?但答案可能是:不能。因为大家在同一个测试集上竞争了太久、不断在测试集上调整,可能已经严重过拟合测试集。

于是作者用原始数据源、按原始流程重新采集,构建了新的 ImageNetV2,做了一次复制研究(replication study):

ImageNetV2 的结果

📷 ImageNetV2 的结果
回到原视频 (00:53:27)

编者说明:讲师的判断是——ImageNet 大致被复制成功:所有数字都被高估了一点,但相对次序依然有效,因此它依然是推动 AI 进步的重要基准。

6.6 分布漂移与合成数据

由这个研究引申出一个关键问题:训练-测试划分到底有没有效?取决于一个假设——你的训练/测试分布,是否等于模型上线后真实遇到的数据分布。

ImageNetV2(期望 vs 实际)

📷 ImageNetV2(期望 vs 实际)
回到原视频 (00:48:52)

一个标准演示:用 scikit-learn 做 train_test_split。

训练-验证-测试划分(演示)

📷 训练-验证-测试划分(演示)
回到原视频 (00:57:43)

用 scikit-learn 做 train_test_split(视频画面)

📷 用 scikit-learn 做 train_test_split(视频画面)
回到原视频 (00:57:55)


七、特征工程

(参考时间: 00:57)

第二阶段是模型设计:包括特征工程、模型族/架构、假设空间(hypothesis space)、归纳偏置(inductive biases)/假设。

模型设计阶段

📷 模型设计阶段
回到原视频 (00:57:58)

特征工程是「从原始特征中选择并编码输入特征」的过程:

特征工程

📷 特征工程
回到原视频 (00:58:16)

7.1 数值数据的编码

数值特征通常可以直接使用,但有三个重要例外:

数值数据的编码(一):类别特征做 one-hot

📷 数值数据的编码(一):类别特征做 one-hot
回到原视频 (00:58:43)

One-hot 编码:把一个类别特征替换为多个二值特征(每个可能取值一列),在原始值对应的列填 1。

Color:   Red, Green, Red, Blue, Blue, Yellow, Missing
   →
Color:Red  Color:Blue  Color:Green  Color:Yellow  Color:Missing
    1          0           0            0             0
    0          0           1            0             0
    1          0           0            0             0
    0          1           0            0             0
    0          1           0            0             0
    0          0           0            1             0
    0          0           0            0             1
One-hot 编码

📷 One-hot 编码
回到原视频 (00:59:22)

数值数据的编码(二):偏斜特征与标准化

📷 数值数据的编码(二):偏斜特征与标准化
回到原视频 (01:01:15)

编者说明:实际中常用 pandas.get_dummies 一步完成。是否省略最后一类(避免共线性)并不重要,用验证损失来选即可。

特征标准化(Standardization):用训练数据计算特征的均值 $\mu$ 与方差 $\sigma^2$,再做变换

$$ z = \frac{x - \mu}{\sigma} $$

得到零均值、单位方差的新特征。注意:测试时也必须用训练集算出的 $\mu,\sigma$ 做同样的变换。

特征标准化

📷 特征标准化
回到原视频 (01:01:31)

一个课堂投票:要不要对 one-hot 编码做标准化?为什么?答案是不要——它是二值列,减去均值毫无意义,甚至可能带来灾难性后果。任何特征工程都要用验证损失来经验性地检验,没有放之四海皆准的配方。

要不要标准化 one-hot 编码?

📷 要不要标准化 one-hot 编码?
回到原视频 (01:03:10)

7.2 文本数据的编码

编码文本字符串有几种方法:

所有方法最终都产生一个高维向量表示。

文本数据的编码

📷 文本数据的编码
回到原视频 (01:05:14)

词袋模型:把词表里每个词作为一列,统计它在文本中的出现次数(或是否出现)。例如把「Learning about machine learning is fun.」编码成 [learning=2, machine=1, fun=1, ...]。

实践中会:

编者说明:讲师说「这些都是 LLM 之前『黑暗时代』的做法」,今天你会直接把文本丢给 LLaMA 拿 embedding。词袋有一个根本缺陷——它对词序是盲的:把词打乱,「machine learning is fun」与「fun is learning machine」得到完全相同的表示。这也解释了为什么有时你能构造出「胡言乱语」却被判为极正面或极负面的评论:模型看到的是词袋,不是句子。

一个有趣的彩蛋:Gonzalez 教授当年搬进一栋没有艺术品的楼,于是偷偷在机器学习楼层装了一件「艺术装置」,里面藏着一个停用词(从此保洁阿姨的扫帚和垃圾桶就「困惑」了)。

词袋编码

📷 词袋编码
回到原视频 (01:06:20)

关于停用词的小故事

📷 关于停用词的小故事
回到原视频 (01:07:37)

7.3 图像数据的编码

图像可看作三维张量(高 × 宽 × 通道)。编码方式包括:

所有方法都产生一个高维向量表示。

图像数据的编码

📷 图像数据的编码
回到原视频 (01:09:00)

7.4 用 scikit-learn 做特征化

scikit-learn 提供了大量数据变换工具,很多都遵循 fit / transform 模式:

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()          # 构造
ohe.fit(df[["color"]])         # 拟合
ohe.transform(df[["color"]])   # 变换

参见 https://scikit-learn.org/stable/data_transforms.html。

用 scikit-learn 做特征化

📷 用 scikit-learn 做特征化
回到原视频 (01:09:50)


八、把机器学习看作函数逼近

(参考时间: 01:09)

在模型设计阶段,我们要选「模型族」。一个统一的视角是:机器学习 = 函数逼近(Function Approximation):

模型设计:特征工程与模型族

📷 模型设计:特征工程与模型族
回到原视频 (01:10:05)

机器学习作为函数逼近

📷 机器学习作为函数逼近
回到原视频 (01:10:09)

带(学习到的)特征的函数逼近

📷 带(学习到的)特征的函数逼近
回到原视频 (01:10:24)

由此可以发展出通用的模型族与相应的训练算法:

通用函数逼近

📷 通用函数逼近
回到原视频 (01:10:41)


九、模型族与归纳偏置

(参考时间: 01:11)

线性回归模型族的形式为:

$$ g_w(\mathbf{x}) = w_0 + \sum_{d=1}^{D} w_d x_d $$

不同的权重向量 $w$ 得到不同的模型。例如 $g_{[1,1]}(x) = 1 + x_1$、$g_{[1,-1]}(x) = 1 - x_1$、$g_{[2,2]}(x) = 2 + 2x_1$。它的假设空间,就是所有由实值斜率与截距参数化的直线。

线性回归模型族

📷 线性回归模型族
回到原视频 (01:11:00)

归纳偏置(Inductive Biases)是为了让模型能泛化到训练数据之外,而在模型设计中所做的一组假设。

没有免费午餐定理(No Free Lunch Theorem):不存在普遍最优的模型——你必须选择具备正确归纳偏置的模型。

例如:训练数据只有两点 $(-1,1)$ 与 $(1,1)$,现在要预测 $x=0$ 处的 $y$。有无穷多条模型能完美拟合这两个点,任何一条都可能是对的。此时:

归纳偏置

📷 归纳偏置
回到原视频 (01:11:25)

归纳偏置既来自模型,也来自特征:特征工程会在 $h_w$ 中引入归纳偏置。

特征与模型中的归纳偏置

📷 特征与模型中的归纳偏置
回到原视频 (01:13:04)


十、复杂度、过拟合与正则化

(参考时间: 01:13)

线性 vs 非线性:非线性模型更「表达力强」,能表示更复杂的关系——无论是回归曲线,还是分类的决策边界。但非线性模型一定更好吗?不一定。

复杂度:线性模型与非线性模型

📷 复杂度:线性模型与非线性模型
回到原视频 (01:13:36)

复杂度与过拟合:把不同复杂度的模型拟合到同一样本上——

关键:随模型复杂度上升,训练误差总是下降,但测试误差先降后升。我们要用验证/测试误差来找到甜点区。

复杂度与过拟合

📷 复杂度与过拟合
回到原视频 (01:13:54)

正则化(Regularization):在训练中加入约束或惩罚以改善泛化。很多模型与算法都有在训练过程中调节正则化的机制——这属于生命周期中的优化阶段。它把模型从「过拟合」一侧拉回「甜点区」。

寻找甜点区本质上就是调节超参数(例如多项式的次数),并在验证集上检验——而不是看训练误差。

正则化

📷 正则化
回到原视频 (01:14:26)


总结(Takeaways)


附录:课堂未展示的幻灯片

以下幻灯片属于本讲官方 deck,但本次录像在「正则化」之后即结束,未展开讲解,作为延伸阅读收录。

参数化与非参数化模型

🖼️ 参数化与非参数化模型

如何选择模型族

🖼️ 如何选择模型族

逻辑回归模型族

🖼️ 逻辑回归模型族

优化阶段

🖼️ 优化阶段

迭代优化算法

🖼️ 迭代优化算法

超参数

🖼️ 超参数

训练准确率与验证准确率

🖼️ 训练准确率与验证准确率

预测与评估阶段

🖼️ 预测与评估阶段

做出预测

🖼️ 做出预测

评估度量与混淆矩阵

🖼️ 评估度量与混淆矩阵

scikit-learn 分类(演示)

🖼️ scikit-learn 分类(演示)

本讲致谢与教材章节

🖼️ 本讲致谢与教材章节

作业环节

🖼️ 作业环节

作业构成

🖼️ 作业构成

AGI 时代的作业

🖼️ AGI 时代的作业

如何下载作业

🖼️ 如何下载作业

Homework 1

🖼️ Homework 1

祝学习愉快

🖼️ 祝学习愉快

编者说明:附录中「AGI 时代的作业」一页给出了一条实用的经验法则——能用 AI,就在你能轻松验证的场景用它(可视化、查文档);不能验证时就不要用 AI(编写你不知道如何下手的函数或应用);如果你写不出测试或设计文档,就不要 vibe coding 它;同时小心那些对机器有写权限的 git / 函数。


附:官方参考与延伸阅读

主题 链接 / 说明
课程主页 https://eecs189.org/sp26/
官方讲义/笔记(Lecture 3) Google Drive PDF
教材 Machine Learning: A First Course for Engineers and Scientists 本讲对应 Chapter 1 · https://doi.org/10.1017/9781108919371
scikit-learn 数据变换大全 https://scikit-learn.org/stable/data_transforms.html
ImageNetV2 复制研究 https://arxiv.org/abs/1902.10811(Do ImageNet Classifiers Generalize to ImageNet?)
Kaggle 竞赛总览(学习验证与集成技巧) https://www.kaggle.com/competitions
↳ House Prices(验证/集成常用练手赛) https://www.kaggle.com/c/house-prices-advanced-regression-techniques
作业内容仓库 BerkeleyML/sp26-student(含内容下载 notebook)

版权说明:本讲视频、幻灯片与课程材料版权归 UC Berkeley EECS 189/289A 课程团队(Alex Dimakis、Jennifer Listgarten 及幻灯片作者 Joseph E.