Class 1

机器学习概览 (Machine Learning)

基本概念

机器学习的过程被概括为一个循环流程,包含三个关键环节 :

  1. 数据 (Data):这是机器学习的基础 。我们假设数据集中隐藏着某种未知的模式或规律。在量化上,它被认为由输入特征和标签 $(s_i,y_i)$ 组成。
  2. 模型 (Model):模型是对数据中隐藏模式的一种简化或数学抽象。它可以是线性的,也可以是非线性的,由一个参数化函数 $h_{x}(s)$ 表示。
  3. 优化 (Optimization):寻找最佳模型的过程,通常被构建为一个优化问题,其被表示成损失函数 + 正则化项 $\min_x\frac{1}{m}\sum_{i=1}^m\ell(y_i,h_x(s_i))+\lambda r(x)$

监督学习 (Supervised Learning)

想象一下你正在教一个孩子识别动物。你会指着一张猫的图片告诉他“这是猫”,然后指着一张狗的图片告诉他“这是狗”。你提供了一个“问题”(图片)和一个“正确答案”(标签)。

监督机器学习做的就是类似的事情。我们给算法提供大量带有“正确答案”的数据,让它学习如何从“问题”映射到“答案”。

  • “问题” 就是我们后面要讲的 输入 (Input)
  • “正确答案” 就是 输出 (Output)标签 (Label)
  • 带有“正确答案”的数据集 就是 训练数据集 (Training Dataset)

监督学习始于一个包含 m 个样本的训练数据集 。每个样本都是一个“输入-输出”对(sⁱ, yⁱ),其中 s 是输入特征,y 是对应的标签或输出。

任务类型

  • 分类:目标是预测一个离散的类别标签。 $y\in{-1,+1}$ ,分别代表负样本和正样本(正例/负例)。
  • 回归:$y\in\mathbb{R}$。

监督学习的目的是找到一个函数(或称为模型)h,它可以将输入空间 S 映射到输出空间 Y 。这个函数 h 应该能够很好地近似真实的输入-输出关系,即 y ≈ h(s)

这个函数 h 在机器学习中通常被称为假设 (Hypothesis)模型 (Model)

  • 假设空间 (Hypothesis Space):在开始学习之前,我们会先确定一个模型的类别,例如,我们决定使用线性模型。那么,所有可能的线性函数就构成了我们的“假设空间”。
  • 学习过程:算法的学习(训练)过程,实际上就是在假设空间中,根据训练数据,搜索出一个“最佳”的函数 h 的过程。这个“最佳”通常是通过最小化损失函数来定义的。

一旦学习到了函数 h,就可以用它来对全新的、未见过的输入 s 进行预测 。例如,根据房屋的面积 s 来预测其价格 y 。最终的目标是在新样本上最大化预测的准确性,也就是最小化测试误差 (test error)

监督学习的记号(notation)

参数化模型 (Parametric Model)

  • 假设我们要学习的函数h 是由一个参数向量 x 控制的,记作 hₓ(s) 。这个参数向量x 存在于一个n维的实数空间 ℝⁿ 中 。以线性模型举例,有$h_x(s)=x^\top s$。
  • 全部向量按列向量处理(便于矩阵化推导):$$x=\begin{pmatrix}x_1\\vdots\x_n\end{pmatrix},\quad y=\begin{pmatrix}y^1\\vdots\y^m\end{pmatrix},\quad s^i=\begin{pmatrix}s_1^i\\vdots\s_n^i\end{pmatrix}$$
    • xⱼ:表示参数向量 x 中的第 j 个分量(或称为权重) 。
  • yⁱ:表示第 i 个样本的标签(目前假设为标量) 。
  • sⁱ ∈ ℝⁿ:表示第 i 个样本的特征列表,它是一个长度为 n 的列向量 。
  • sⱼⁱ:表示第 i 个训练样本中的第 j 个特征的值 。
  • sⱼ ∈ ℝᵐ:表示一个包含所有 m 个样本的第 j 个特征的向量 。

参数化模型,将一个抽象的“函数寻找”问题,转化为一个具体的“参数寻找”问题,是机器学习能够被计算和求解的关键。

  • 从无限到有限:函数空间是无限大的,我们不可能搜索所有可能的函数。但一旦我们选择了模型形式(例如,线性模型),问题就简化为在 n 维空间中寻找一个最优的参数向量 x。这使得问题变得明确且可用优化算法解决。
  • 模型即假设:选择一个参数化模型,实际上是做出了一个强假设。例如,选择线性模型 hₓ(s) = xᵀs,就是假设输入特征和输出之间存在线性关系。如果这个假设与数据的真实模式相符,模型效果会很好;如果不符,则可能出现欠拟合。

数据矩阵

在实际计算中,我们通常会将整个训练数据集表示为一个数据矩阵 S(或常记为X)。

  • 结构:这个矩阵通常是一个 m × n 的矩阵,其中有 m 行(代表 m 个样本)和 n 列(代表 n unleashing 个特征)。矩阵的第 i 行就是第 i 个样本的特征向量的转置 (sⁱ)ᵀ
  • 高效计算:使用数据矩阵,我们可以非常高效地一次性计算出所有样本的预测值。$$S=\begin{pmatrix}(s^1)^\top\\vdots\(s^m)^\top\end{pmatrix}\in\mathbb{R}^{m\times n},\quad S_{ij}=s_j^i$$ 则一次性预测为 $\hat{y}=Sx$,其中第 i 个分量 $\hat{y}^i=x^\top s^i$。若需要截距/偏置,可把输入扩展为$\tilde{s}=(1,s^\top)^\top$,参数扩展为$\tilde{x}=(b,x^\top)^\top$,仍写作$\hat{y}=\tilde{x}^\top\tilde{s}$。此时预测向量 ŷ(一个包含所有 m 个预测值的列向量)可以简单地表示为:$$\hat{y}=Sx$$

损失函数 (Loss Function)

  • 损失函数的定义:损失函数 l(y, ŷ) 是一个用于衡量模型预测输出 (predicted output) ŷ真实输出 (true output) y 之间差距的函数 。它的值通常是非负的,值越大代表模型的预测越不准确 。
  • 示例1:平方损失 (Squares Loss)
    • l(y, ŷ) = ½(y - ŷ)²
    • 主要用于回归 (regression) 任务,其中 y 是一个连续的实数 。
    • 平方损失就是画到二维平面上距离的平方(乘以1/2是为了后续求导方便),距离越大,损失就越大。
  • 示例2:0-1损失 (Zero-one Loss)
    • 如果预测错误 (y ≠ ŷ),损失为1;如果预测正确,损失为0 。
    • 元分类 (binary classification)** 任务,其中 y 的取值在一个有限集合内,例如 {-1, +1}
    • 它直接衡量了分类任务中“对”或“错”的次数,是最直接的性能指标。
  • 成本函数 (Cost Function)通常指衡量模型在整个训练数据集上平均表现的函数。它是所有单个样本损失的平均值(有时是总和):$$J(x)=\frac{1}{m}\sum_{i=1}^ml(y^i,h_x(s^i))$$ 我们进行优化时,真正要最小化的是这个成本函数 J(x)

代理损失函数

虽然0-1损失最直观地反映了分类的准确率,但在实际优化中却很少直接使用。主要原因是它的数学性质非常差:

  • 不连续、非凸:它的函数图像是阶梯状的。
  • 梯度几乎处处为零:除了在 y=ŷ 的点上不可导外,其他地方的导数(梯度)都为0。
  • 对优化算法不友好:像梯度下降这类依赖梯度的优化算法,无法从一个梯度为0的函数中获取“应该朝哪个方向更新参数”的信息。

因此,在实践中,我们通常会选择一个更“平滑”的函数来替代0-1损失,这些函数被称为代理损失函数 (Surrogate Loss Functions)

  • 用于分类的代理损失函数
    • Hinge Loss (合页损失)l(y, ŷ) = max(0, 1 - y·ŷ)
      • 来源:主要用于支持向量机 (SVM)。
      • 特点:它不仅惩罚错分的点 (y·ŷ < 0),也惩罚那些虽然分类正确但“不够自信”(即 0 < y·ŷ < 1,离决策边界太近)的点。它的目标是最大化分类间隔,鲁棒性更好。
    • Log Loss (对数损失 / 交叉熵损失)l(y, ŷ) = log(1 + exp(-y·ŷ))
      • 来源:主要用于逻辑回归 (Logistic Regression) 和神经网络。
      • 特点:它不仅给出一个分类结果,还能给出一个概率。当预测的概率偏离真实标签时,它会施加一个很大的惩罚。这是目前分类任务中最主流的损失函数之一。
  • 用于回归的其他损失函数
    • 绝对损失 (Absolute Loss / L1 Loss)l(y, ŷ) = |y - ŷ|
      • 特点:相比于平方损失,绝对损失对异常值 (outliers) 不那么敏感。因为平方损失会把大误差的惩罚放大,一个异常点可能会严重影响模型训练的结果。如果你怀疑数据中有较多异常值,使用绝对损失是更稳健的选择。

优化

机器学习是一个优化性问题。在机器学习中,所谓的“训练模型”其实就是寻找一组最佳的模型参数 x,来最小化一个被称为“目标函数 (Objective Function)” f(x) 的过程

这个 f(x) 由两部分构成:$$\min_{\mathbf{x}\in\Omega}f(\mathbf{x})=\underbrace{\frac{1}{m}\sum_{i=1}^m\ell(y^i,h_\mathbf{x}(s^i))}{\text{data-fitting term}}+\underbrace{\lambda\cdot r(\mathbf{x})}{\text{regularizer}}$$ a) 数据拟合项 (Data-fitting term)

  • 作用:衡量模型的预测结果与真实数据之间的差距。这一项越小,说明模型对训练数据的拟合程度越好。
  • $\frac{1}{m}\sum_{i=1}^m\ldots$: 表示计算所有 m 个训练样本的平均损失
  • $\ell(y^i,h_\mathbf{x}(s^i))$: 这就是我们之前讨论的损失函数 (Loss function)
    • $y^i$: 第 i 个样本的真实输出
    • $h_\mathbf{x}(s^i)$: 模型 (用 h 表示) 使用参数 x 对第 i 个样本的输入 $s_i$ 做出的预测输出

简而言之,第一项的目标是让模型尽可能地准确预测训练数据。

b) 正则化项 (Regularizer)

  • 作用:对模型的复杂度进行惩罚。这一项是为了防止模型变得过于复杂而产生过拟合 (Overfitting)。过拟合是指模型在训练数据上表现完美,但在新的、未见过的数据上表现很差。
  • $r(x)$: 这是一个正则化函数,它会衡量模型参数 x 的“大小”或“复杂度”。例如,它可以是所有参数的平方和(L2正则化)。
  • $λ$: 这是一个超参数 (hyperparameter),用来控制正则化惩罚的强度。$λ$ 越大,我们对模型复杂度的惩罚就越重,模型就会越简单。

线性回归 (Linear Regression)

线性模型

$$h_x(s)=x^\top s$$

这是机器学习中最基础也最重要的模型。

  • 内涵解读xᵀs 实际上是点积 x₁s₁ + x₂s₂ + ... + xₙsₙ。每个参数 xⱼ 可以被理解为第 j 个特征 sⱼ权重重要性
    • 如果 xⱼ 是一个较大的正数,说明特征 sⱼ 对结果有很强的正向影响。
    • 如果 xⱼ 是一个较大的负数,说明特征 sⱼ 对结果有很强的负向影响。
    • 如果 xⱼ 接近于0,说明该特征对结果影响不大。
    • 因此,学习的过程,就是寻找最佳权重组合的过程
  • 关于偏置项 (Bias Term):在实践中,线性模型通常写成 hₓ(s) = xᵀs + b,其中 b 是一个偏置项或截距项。一个常见的技巧是在所有特征向量 sⁱ 中增加一个恒为1的维度(例如 s₀ⁱ = 1),这样偏置项 b 就可以被吸收到参数向量 x 中(作为 x₀),从而统一为 hₓ(s) = xᵀs 的简洁形式。

最小二乘法

对于第 $i$ 个样本,我们定义数据的残差:$$e_i=y^i-x^\top s^i$$ 表示真实值与预测值之间的差距。我们希望它尽量接近 0。为了让所有残差“整体上”尽量小,定义平方损失函数:$$\ell(y,\hat{y})=\frac{1}{2}(y-\hat{y})^2$$ 对所有样本求和/平均,就得到经验风险最小化的目标函数。把所有样本求平均得到训练目标:$$f(x)=\frac{1}{2m}\sum_{i=1}^m\left(y^i-x^\top s^i\right)^2$$ 把样本行堆成设计矩阵 $S\in\mathbb{R}^{m\times n}$,标签向量 $y\in\mathbb{R}^m$,就有:$$f(x)=\frac{1}{2m}|Sx-y|_2^2$$ 将此二次型展开,得到:$$f(x)=\frac{1}{2m}(x^\top S^\top Sx-2x^\top S^\top y+y^\top y)$$ 可以清晰地看到它由三部分组成:一个关于 x二次项 (xᵀSᵀSx),一个关于 x一次项 (-2xᵀSᵀy),和一个常数项 (yᵀy) 。由于成本函数是 x 的二次函数,因此线性回归问题被归结为一个二次优化问题 (quadratic optimization problem) 。优化的目标是找到能使 f(x) 最小的参数向量,记为 x* 。一旦找到x*,就可以用它来对所有数据进行预测,预测结果为 ŷ = Sx*

过拟合与正则化 (Overfitting and Regularization)

数据集的划分

为了客观地评估模型的性能,必须将原始数据集划分为独立的训练集和测试集。一个常见的做法是使用80%的数据作为训练集,剩余的20%作为测试集 。在专业的机器学习实践中,我们通常会将数据划分为三部分

  • 训练集 (Training Set):用于训练模型的参数(例如,线性回归中的权重 x)。
  • 验证集 (Validation Set):用于选择模型调整超参数
    • 超参数 它们是需要我们在训练开始前就设定好的参数,例如学习率、正则化强度 λ、神经网络的层数等。
    • 我们会用训练集训练出多个不同超参数配置的模型,然后在验证集上比较它们的性能,选择表现最好的那个配置。
  • 测试集 (Test Set):在所有模型选择和超参数调整都完成后,我们才拿出的测试集,对最终选定的模型进行一次性的最终评估,得出最终成绩。这个成绩将被用来报告模型的性能。

常见的划分策略

  • 交叉验证 (Cross-Validation):当数据量较少时,单独划分出一个验证集会很“奢侈”。这时通常采用k-折交叉验证。它将训练数据分成k份,轮流将其中的k-1份作为训练集,1份作为验证集,重复k次。这样可以更充分地利用数据,得到更稳健的模型性能评估。
  • 分层抽样 (Stratified Sampling):在处理分类问题时,特别是当某些类别样本很少(类别不均衡)时,简单的随机划分可能导致某个数据集中该类别的样本过少甚至没有。分层抽样可以保证在划分后的各个集合中,不同类别的样本比例与原始数据集中保持一致。

训练误差与测试误差

误差的数学定义

  • 训练误差 f(x):被定义为模型在训练集上损失函数的平均值。
  • 测试误差 f_te(x):被定义为模型在测试集上损失函数的平均值。

$$f(x)=\frac{1}{m}\sum_{i=1}^m\ell(y^i,h_x(s^i)),$$ $$f_{\mathrm{te}}(x)=\frac{1}{m_{\mathrm{te}}}\sum_{i=1}^{m_{\mathrm{te}}}\ell(y_{\mathrm{te}}^i,h_x(s_{\mathrm{te}}^i)),$$

  • 我们在训练集上训练模型 hₓ,其直接目标是最小化训练误差 f(x)
  • 但我们真正关心和最终衡量的是模型在测试数据上的表现,即测试误差 f_te(x)

误差分解 (Error decomposition):$$f_{\mathrm{te}}(x)=f(x)+\left(f_{\mathrm{te}}(x)-f(x)\right)$$ 这里的泛化差距 (generalization gap) 就是测试误差与训练误差之间的差值 (f_te(x) - f(x))。一个理想的模型应该同时具有良好的训练表现(即低的训练误差)和小的泛化差距

  • 如果模型过于复杂,泛化差距通常会很大(即过拟合)。
  • 如果模型过于简单,训练误差通常会很大(即欠拟合)。

欠拟合与过拟合

一个模型的预期测试误差可以被理论上分解为三个部分:

  • 偏差 (Bias)²
    • 含义:由模型自身的根本性局限或错误假设所导致的系统性误差。高偏差意味着模型无法捕捉数据中真正的潜在规律。
    • 对应幻灯片:高偏差通常导致高训练误差。如果模型过于简单(例如,用直线去拟合复杂的曲线数据),它连训练数据都学不好,这就是欠拟合 (Underfitting)
  • 方差 (Variance)
    • 含义:表示模型对训练数据中微小变化的敏感度。高方差意味着模型过多地学习了训练数据中的噪声。如果换一组新的训练数据,训练出的模型将会大不相同。
    • 对应幻灯片:高方差通常导致巨大的泛化差距。模型因为过于复杂,完美地拟合了训练数据(低训练误差),但由于它学到的是噪声而非规律,因此在测试数据上表现极差(高测试误差)。这就是过拟合 (Overfitting)
  • 不可约误差 (Irreducible Error)
    • 含义:数据本身固有的噪声所带来的误差。这是任何模型都无法消除的误差下限。

模型的复杂度是调节偏差和方差的旋钮:

  • 简单模型(如线性回归):偏差高,方差低。不容易过拟合,但可能欠拟合。常见成因
    1. 模型选择不当:试图用线性模型去解决一个高度非线性的问题。
    2. 特征不足:提供给模型的信息太少。例如,预测房价只用了“房间面积”这一个特征,却忽略了“地理位置”和“楼层”。
    3. 训练不充分:优化算法还没有来得及收敛到最佳状态,训练就被提前终止了。
  • 复杂模型(如深度神经网络):偏差低,方差高。拟合能力强,但容易过拟合。常见成因
    1. 模型过于复杂:相对于数据量和数据复杂度而言,模型的能力“过剩”了。
    2. 数据量不足:训练数据太少,使得模型很容易“记住”所有数据点的特征,而不是学习其背后的普适规律。
    3. 特征维度过高:“维度灾难”的一种体现,当特征数量远大于样本数量时,模型更容易找到一些虚假的关联

正则化 (Regularization)

正则化可以用来来避免过拟合,以最经典的 L2 正则化最小二乘(Ridge) 为例。训练目标是这个公式:$$f(x)=\frac{1}{2m}\sum_{i=1}^m\left(x^\top s^i-y^i\right)^2+\frac{\lambda}{2}|x|_2^2$$ $λ>0$ 控制正则强度:$λ$ 越大,越不容易过拟合(但也更容易欠拟合)。$λ$ 的最佳值通常是通过在验证集 (validation set) 上的优化误差来确定的。

这个模型在统计学中被称为岭回归 (Ridge Regression),是解决过拟合问题的基石方法之一。另一种非常重要的正则化方法是L1正则化,它对应的模型被称为Lasso回归

  • L1正则化项:$r(x) = λ * ||x||₁ = λ * Σ |xⱼ|$。
  • 核心区别
    • L2 (岭回归):倾向于让所有参数的权重都变小,但很少会变为精确的0。它会保留所有特征,但减弱它们的影响力。
    • L1 (Lasso回归):倾向于让许多不那么重要的特征的权重直接变为0
  • L1的优势:由于L1正则化能产生稀疏解(即很多参数为0),它在实践中可以被用作一种自动的特征选择 (feature selection) 工具,帮助我们识别哪些特征是真正重要的,从而得到一个更简单、更易于解释的模型。

决定系数 (Coefficient of Determination)

R²,也称为决定系数 (Coefficient of Determination),衡量的是的模型能在多大程度上“解释”数据的变异性。

我们先想象一个没有模型的“基准”情况:

  • 总变异 (Total Variation):假设我们不知道任何输入特征 s,让我们预测输出 y,最好的策略就是猜所有 y 的平均值 ȳ。数据真实值 yᵢ 与这个平均值 ȳ 之间的总误差,就代表了数据本身的“总变异程度”。
  • 模型未解释的变异 (Unexplained Variation):现在我们有了模型,模型给出了预测值 ŷᵢ。真实值 yᵢ 和预测值 ŷᵢ 之间仍然存在误差(即残差),这部分误差是我们的模型没能解释的。
  • 模型已解释的变异 (Explained Variation):那么,总变异减去模型没能解释的变异,剩下的就是模型成功解释的部分。

R² 就是“模型成功解释的变异”占“总变异”的比例。这个直观理解可以直接转化为数学公式:$$R^2=\frac{\text{Explained Variation}}{\text{Total Variation}}=1-\frac{\text{Unexplained Variation}}{\text{Total Variation}}$$ 将其写成统计学的标准形式就是:$$R^2=1-\frac{\sum_{i=1}^m(y_i-\hat{y}i)^2}{\sum{i=1}^m(y_i-\bar{y})^2}=1-\frac{\mathrm{SSE}}{\mathrm{SST}}$$

  • yᵢ 是第 i 个样本的真实值
  • ŷᵢ 是模型对第 i 个样本的预测值
  • ȳ 是所有样本真实值的平均值
  • SSE (Sum of Squared Errors)Σ(yᵢ - ŷᵢ)²,残差平方和,代表模型未解释的变异。
  • SST (Total Sum of Squares)Σ(yᵢ - ȳ)²,总平方和,代表数据的总变异

R² 的值通常在0到1之间,其含义如下:

  • R² = 1
    • 含义:模型完美地拟合了数据。SSE为0,意味着模型解释了100%的数据变异。
    • 警惕:在训练集上出现 R² = 1 是一个强烈的过拟合信号。
  • 0 < R² < 1
    • 含义:这是最常见的情况。例如 R² = 0.88 意味着你的模型解释了数据中88%的变异性,剩下的12%是模型无法解释的。通常来说,R² 越高,模型的拟合效果越好。
  • R² = 0
    • 含义:你的模型和“瞎猜平均值”的效果一样差。模型没有解释任何数据的变异性。
  • R² < 0
    • 含义:这种情况是可能发生的!它意味着你的模型比“瞎猜平均值”还要糟糕。这通常说明你的模型选择非常不恰当。

R²的局限性

虽然R²很有用,但它也有一个重要的局限性:

  • 特征越多,R²越高:向模型中添加任何新的特征,即使这个特征毫无用处,R²的值也几乎总是会上升或保持不变。这可能会误导我们选择一个包含了许多无关特征的复杂模型。模型(比如线性回归)的任务是尽其所能地去拟合训练数据,目标是让残差平方和(SSE)尽可能地小。对于模型来说,它现在有了更多的“自由”或“工具”来拟合数据。在最坏的情况下,如果这个新特征真的与目标毫无关系,优化算法可以简单地将这个新特征的权重设置为0,并保持原先 k 个特征的权重不变。在这种情况下,模型的预测结果和之前完全一样,SSE不变,R²也不变。但是,在实际情况中,由于数据的偶然性,这个完全无用的“噪声”特征,在你的特定训练集上,几乎总会与目标值存在一些微小的、纯属巧合的虚假相关性。优化算法的目标是不惜一切代价降低训练误差SSE。它会敏锐地发现并利用这种虚假相关性,给这个新特征分配一个微小的、非零的权重,从而使SSE比之前再降低一点点。
    • 初始状态:你给了模型一组特征(比如 k 个特征),模型会找到这 k 个特征的最佳权重组合,以最小化SSE。
    • 添加新特征:现在,你给了模型一个新的、额外的特征(第 k+1 个),即使这个新特征是完全随机生成的、毫无用处的“噪声”。
  • 解决方案:为了解决这个问题,统计学家提出了调整后的R² (Adjusted R²)。它在R²的基础上,对模型中特征的数量进行了惩罚。当比较包含不同数量特征的模型时,使用调整后的R²会更加公平。$$R_\mathrm{adj}^2=1-(1-R^2)\frac{m-1}{m-n-1}$$
  • m 是样本数量。
  • n 是特征数量。

当一个无用的特征被加入模型时,虽然 会有微小的上升,但 (m-1)/(m-n-1) 这个惩罚项也会因为 n 的增加而变大。如果 的微小增益不足以抵消这个惩罚,调整后的R²反而会下降