AI 学习课程 / LESSON 04

第四节:常见机器学习方法

你已经知道模型怎样训练、怎样评估。这一节看看:除了回归和神经网络,模型还可以通过“提问分组”“合并多个模型”“寻找点群”和“寻找投影方向”来工作。

决策树与集成聚类与降维五个交互实验

01 / 先看模型要解决什么问题

预测、分组、压缩,是三种不同任务

监督学习

训练数据有正确答案 y,学习从 X 预测 y。

树、森林和梯度提升都能用于分类或回归。

聚类

没有给定类别答案,把相似样本分到一起。

K-means 寻找 K 个中心,并把点分配给最近的中心。

降维

把很多个特征压缩为较少的数,尽量保留某种信息。

PCA 寻找数据变化较大的线性投影方向。

本节的“无监督”是指训练这些聚类与降维步骤时不使用类别标签。它们也能作为监督学习项目中的预处理步骤,但仍须遵守训练、验证、测试的划分规则。

这里先理解算法,不要求记住工具接口。图中的坐标、中心、阈值和预测都来自实际计算。

02 / 一连串条件判断

决策树:不断提问,把样本分开

假设每个样本有两个特征 X[i]=[x₁,x₂]。一个内部节点提出问题,例如 x₁ ≤ 3 吗?满足条件走左边,否则走右边。到达叶子节点后,输出这个叶子中训练样本的多数类别。

输入 [x₁,x₂] → 判断 x₁ ≤ 阈值 → 判断 x₂ ≤ 阈值 → 叶子类别 分类叶子:取多数类别;回归叶子:常用目标值的平均数。

下面有 16 个训练点,原始教学规律是“x₁ 和 x₂ 都较大时类别为 1”。开关可以把 (2,2) 的标签从 0 改成 1,模拟一个扰动标签。模型只看到样本,不会直接收到这条生成规律。

实验 A:树的深度与预测路径

类别 0(圆)类别 1(方)新样本(十字)

背景颜色表示模型预测的类别;形状和数字表示训练点的真实类别。

展开这棵树的所有判断规则

先用深度 1,再用深度 2。然后加入扰动,比较深度 2 与 4:更深的树可能把少数异常样本也单独记住。训练准确率的提高需要用独立验证集进一步判断。

阈值是谁设定的?训练算法从数据中挑选

对某个节点,算法尝试“哪个特征、哪个阈值”能把样本分得更纯。例如一组里全是 0,比 0 和 1 各占一半更纯。这里用 基尼不纯度来量化。p₀ 是当前组中类别 0 的比例(0 类数量 ÷ 总数量),p₁ 同理。

Gini = 1 − p₀² − p₁² 全是 0:1 − 1² − 0² = 0 一半 0、一半 1:1 − 0.5² − 0.5² = 0.5 分裂后的不纯度 = (n左/n)·Gini左 + (n右/n)·Gini右 改善量 = 分裂前 Gini − 分裂后加权 Gini

手动考察第一道问题

本页的自动树逐个尝试训练值之间的中点,选择加权 Gini 最小的分裂,再在每个子组重复。它是逐步做局部选择,不保证整棵树是全局最优。深度、叶子最少样本数等限制控制复杂度;这里为便于观察,只开放深度。

与线性回归的训练有什么不同?

线性回归学习连续权重,常用梯度下降。这里的树枚举离散的特征和阈值,不对这些阈值做反向传播。训练后仍然是一个把 X 映射为预测结果的模型。

03 / 多棵不同的树一起判断

随机森林:让一组树投票

一棵树可能对某些样本很敏感。随机森林训练多棵有差异的树,再合并预测。分类常用投票或平均类别概率,回归常用平均预测值。本页演示硬投票。

  1. 有放回抽样:从 16 个训练点中抽 16 次,同一点可能重复,也可能一次没抽到。每棵树抽到的集合不同。
  2. 随机挑候选特征:每次分裂仅从一个随机选择的特征中找阈值。本例只有两个特征,所以每次选一个;实际数量是可设置的超参数。
  3. 合并:让 9 棵深度上限为 3 的树,分别预测同一个新样本。
单棵树:ŷ = T(X) 森林分类:ŷ = 9 棵树预测类别的多数票 森林回归:ŷ = (T₁(X)+…+T₉(X))/9

实验 B:观察每一票

使用上方的 16 个点与扰动开关;新样本坐标也与实验 A 同步。树使用固定随机种子,重复操作得到相同结果。

这 9 棵树的深度固定为 3,不随实验 A 的深度选择变化。某棵树根部没抽到某个特征,不代表它在后续节点也不会用到该特征。

随机化让树的错误不完全相同,合并通常有助于降低单棵树的波动。如果所有树都犯同样的错,投票也不能消除它。树的数量、深度和候选特征数仍需验证;森林不保证一定优于单棵树。

04 / 后一个模型修正前面的误差

梯度提升:一轮一轮补上预测差距

先看平方误差回归。初始模型给所有点预测同一个平均值。每一轮计算 残差 r=y−F(x),训练一棵小树来预测这些残差,再把它的一部分加到原预测上。

F₀(x) = 训练目标的平均值 第 m 轮残差:rᵢ = yᵢ − Fₘ₋₁(xᵢ) 拟合小树:hₘ(xᵢ) ≈ rᵢ 合并:Fₘ(x) = Fₘ₋₁(x) + η·hₘ(x)

η 是每一轮修正的比例。例如旧预测 2,真实值 5,小树预测残差 2.4,η=0.5,则新预测为 2+0.5×2.4=3.2。这里的小树是“树桩”:最多问一次,左右两组各输出一个平均残差。

实验 C:添加一棵修正树

真实训练目标(点)当前总预测
xy上轮预测上轮残差本轮 h(x)当前预测

初始状态还没有修正树;点击后,表格显示刚刚完成的一轮。最多演示 8 轮。这里显示训练 MSE,不能据它单独决定最佳轮数。

为什么名字里有“梯度”?

若单样本损失 ℓ = ½(y−F)², ∂ℓ/∂F = F−y,所以负梯度 −∂ℓ/∂F = y−F。 平方误差的负梯度就是残差。

一般的梯度提升,让下一棵小树拟合损失对当前预测值的负梯度。换成分类损失时,不一定还能直接用 y−F。此处先用平方误差把主线看清;树的分裂依然通过搜索完成。

森林:多棵树分别训练,最后一起投票。梯度提升:下一棵树依赖前面模型的预测,按顺序修正。提升中的 η 控制每轮加多少;它与第二节的学习率都控制更新幅度,但这里更新的是模型总预测。

增加提升轮数能让模型更灵活,也可能过拟合。实际选择 η、树深度、轮数,并用验证集或早停判断。

05 / 不提供类别答案

K-means:轮流“分配点”和“移动中心”

想把一组二维点分为 K 组,但没有给出正确类别。K-means 先放 K 个中心,再交替做两个步骤:每个点找最近的中心;每个中心移动到分给它的点的平均位置。

点 xᵢ 与中心 μₖ 的平方距离:d²=Σⱼ(xᵢⱼ−μₖⱼ)² 分配:cᵢ = argminₖ ‖xᵢ−μₖ‖² 移动:μₖ = 该组内所有点的平均值 目标 SSE = Σᵢ ‖xᵢ−μcᵢ‖²

argmin的意思是“找使后面的数最小的那个编号”。例如到三个中心的平方距离为 2、17、5,就分到编号 1 的中心。本页中心编号从 1 开始。

实验 D:每次只走一个步骤

放初始中心① 分配点② 移动中心

点旁数字是所属组;菱形是中心。颜色与编号一起表示组别。未分配的点暂时没有组号。

先用 K=3、中心分散,反复按按钮。再换成中心挤在左下角,观察分配与最终 SSE 是否相同;也可换成 K=2,看看三个点群怎样被压成两组。

聚类编号没有天然语义。“组 1”不自动意味着“好客户”或真实类别 1。K 是你选择的超参数,算法不会保证恢复真实类别。

初始化会影响结果,因此常用多次初始化并比较目标值。K-means 更适合欧氏距离有意义、大小相近且较紧凑的点群;弯月形点群、异常值或差异很大的密度会带来困难。

不同特征的单位也影响距离。若一个特征取值 0~1,另一个是 0~100000,后者可能主导距离。根据任务考虑缩放,并只在训练数据上拟合缩放规则。

如果某个中心没有分到点呢?

空组无法计算平均值。本页为了明确可复现,保留空组原中心;其他实现可能重新放置它。这个处理会影响结果,不是所有软件都采用同一策略。

06 / 从两个数压缩为一个数

PCA:找一条能保留较多变化的方向

一组样本有两个特征,图中沿斜线展开。若只能为每个点保留一个数,PCA 会选择一条方向,把点投影到这条线上,用它在线上的坐标表示原点。

  1. 减去均值:让点云中心位于原点。
  2. 选择长度为 1 的方向 v:如 v=(cos θ,sin θ)。
  3. 压缩:t=(x−μ)·v,二维点变成一个数。
  4. 近似还原:x̂=μ+t·v;垂直于这条线的信息被丢弃。
X 的形状:(n,2),均值 μ 的形状:(2,) 方向 v 的列向量形状:(2,1) T = (X−μ) @ v → 形状 (n,1) X̂ = T @ vᵀ + μ → 形状 (n,2)

实验 E:旋转投影方向

原始二维点投影方向 / 还原点(空心)丢弃的垂直距离(虚线)

两个特征在本例中使用可比较的单位。图形按相同的 x、y 单位长度绘制,因此投影连线与方向线垂直。

“保留变化”如何量化?

投影方差 = (1/n)Σᵢ tᵢ²(已经中心化) 总方差 = (1/n)Σᵢ ‖xᵢ−μ‖² 保留方差比例 = 投影方差 / 总方差 平均平方重建距离 = 总方差 − 投影方差

第一主成分就是使投影方差最大的单位方向;在这个正交投影设定下,也使平均平方重建距离最小。多维数据可继续寻找与前面方向垂直的主成分。

如何自动找到方向?与矩阵有什么关系?
C = (X−μ)ᵀ @ (X−μ) / n 二维例子中 C 的形状是 (2,2)。 投影方差 = vᵀ C v,且 ‖v‖=1。

可以使用 C 的特征向量:最大特征值对应第一主成分。特征向量可以先理解为一种特殊方向,矩阵作用在这个方向上时只改变长度。现在先掌握投影实验;配套 NumPy 用 np.linalg.eigh 求方向。

“保留 99% 方差”不表示“保留 99% 分类能力”。PCA 不使用类别答案,小方差方向也可能包含关键分类信息。方向 v 与 −v 表示同一条轴,投影坐标符号相反,重建结果相同。

中心化与缩放不同:减均值让数据居中,除标准差改变单位尺度。是否缩放会改变 PCA 的结果。均值、缩放参数和主成分都只能在训练数据上拟合,再应用到验证和测试数据。

07 / 用同一份数据与同一把尺

简单基线与树模型,实际比一次

下面另外生成固定的二维分类数据:两个特征位于 [0,1],类别为“两个特征是否分处 0.5 两侧”,再加入少量随机标签扰动。这种交叉区域规律无法被一条直线完全分开。

训练集 80 个点、验证集 120 个点。逻辑回归只用原始两个特征;树与森林也使用这两个特征。所有模型只在训练集上训练,下表使用同一验证集评估。

模型训练准确率验证准确率说明

森林使用 21 棵树、有放回抽样、每节点随机候选 1 个特征。逻辑回归用固定 2000 次全批量梯度下降、学习率 0.3,参数设置不随深度改变。结果只说明这份教学数据上的表现。

这里的单一直线基线表达能力有限。加入合适的非线性特征后,逻辑回归也可能改善;模型表现同时取决于特征表达、样本、超参数和评估流程。

这个表用于选择方案,属于验证结果。没有把它称为最终测试成绩。确定方案之后再使用保留的独立测试集,第五节会把这套流程做成完整项目。

08 / 以任务和验证证据选择

先建立基线,再决定是否增加复杂度

需求可考虑的方法需要检查
分类或回归,需要理解条件规则浅决策树规则是否稳定、验证误差是否可接受
表格任务,需要多个树合并判断随机森林、梯度提升深度、树数、训练资源与独立验证表现
无标签样本,需要按距离分组K-means单位尺度、K、初始化、点群结构与业务含义
特征多,希望做线性压缩或可视化PCA缩放、保留维数、重建误差与下游任务效果

数据量影响训练成本和评估稳定性;特征类型决定距离、阈值和编码是否合理;任务目标决定指标与错误成本。类别特征不能随意用 1、2、3 编号后就认为欧氏距离有意义。本页树实验只处理数值特征,缺失值与类别处理放到第五节。

缩放对距离方法、PCA 和基于梯度的线性模型尤其需要考虑。普通数值阈值树对单个特征的严格递增变换通常保留样本次序与等价分裂,因此不像欧氏距离那样依赖单位尺度。

09 / 操作之后,用代码复现

配套 NumPy 实验与验收

打开或下载 lesson-04-practice.py。配套代码只需要 NumPy,包含小型分类树、随机森林、残差提升、K-means、PCA 和同数据模型比较。实现用于学习,省略生产库的许多优化和边界处理。在终端进入项目根目录后运行:

uv run python lessons/lesson-04-practice.py

运行后会在 lessons/lesson-04-output/ 保存模型比较、提升误差、聚类中心与 PCA 投影的 CSV 记录。HTML 可以独立使用,不必先运行 Python。

  1. 手算不加扰动、x₁≤3 的第一处分裂:左右各几个 0、几个 1?加权 Gini 是多少?
  2. 在实验 A 中,为新样本 (4.5,1.5) 写下每次判断和最终叶子类别。
  3. 给出森林与提升的区别;手算旧预测 2、h=2.4、η=0.5 的新预测。
  4. 把 K-means 的一个中心移动步骤写成均值计算,记录两种初始化的最终 SSE。
  5. 把 PCA 转到水平、垂直和第一主成分方向,记录保留方差比例与重建误差。
  6. 记录深度 1、2、4、8 的训练与验证准确率。根据验证选一个方案,解释为什么不能只选训练准确率最高的模型。

10 / 检查理解

五道自测题

1. 一组样本中 0 和 1 各占一半,Gini 是?

2. 森林中的“有放回抽样”意味着什么?

3. 提升中 F=2,h=2.4,η=0.5,新预测为?

4. K-means 的中心更新是什么?

5. PCA 保留 99% 方差,是否保证保留 99% 分类能力?

下一节:表格数据项目。把预处理、基线、交叉验证、错误分析和最终评估连接成一次完整实践。