- 训练集、验证集和测试集
- 泛化误差
- 过拟合(Overfitting)和 欠拟合(Underfitting)
- 如何区分过拟合和欠拟合?
- 欠拟合 —— 在训练集和验证集上都表现很差
- 过拟合 —— 在训练集上表现很好,但在验证集或测试集上表现很差
- 如何避免过拟合和欠拟合?
- 正则化(Regularization)—— 防止过拟合
- 正则化的原理
- 常见的正则化方法
- L2 正则化(Ridge Regularization)
- L1 正则化(Lasso Regularization)
- Elastic Net 正则化
- Dropout
- 为什么 Lasso 回归会导致特征选择,而岭回归只会将系数减小到接近零?
参考 Overfitting and underfitting in machine learning
训练集、验证集和测试集
假如你正在训练一个图像分类模型,要识别猫、狗和兔子的照片。
数据集划分:
- 训练集(Training Set): 你有 10,000 张图片(猫、狗、兔子),其中 7,000 张用于训练模型。
- 用途:用来 训练 模型的 参数(parameters),在神经网络中,就是 权重和偏置。
- 目标:模型通过 反向传播和梯度下降 等算法,不断调整参数 来 拟合训练数据。
- 验证集(Validation Set): 你从剩下的图片中抽出 2,000 张用于验证。
- 用途: 在训练过程中,用来 调整模型的 超参数(hyperparameters),比如 学习率、层数、每层的神经元数量、正则化系数 等。
超参数是 在训练过程中不会自动更新的值,需要手动或通过自动化方法(如网格搜索、随机搜索等)来优化。
- 目标: 找出在 未见过的验证数据上表现最好的模型配置。
- 测试集(Test Set): 你保留最后的 1,000 张图片作为测试集。
- 用途: 在你 完成训练和验证后,完全不再修改模型,只用这 1,000 张图片来 做最终评估。
- 目标: 测试集的表现是你报告给他人或者发布论文的最终指标,因为它能更真实地反映模型在 真实世界中未见过的数据上的表现。
类比理解,可以把整个过程想象成在做菜:
- 训练集: 像是你反复试验不同的配料组合(模型参数),不断尝试,直到做出某种味道。
- 验证集: 你邀请朋友品尝,根据他们的反馈来调整做菜的方式,比如火候、配料比例等(调超参数)。
- 测试集: 最终交给大厨品尝,不再做任何调整。这是你菜品的真实表现。
总结:
- 训练集 -> 优化模型参数。
- 验证集 -> 优化模型超参数。在训练过程中,你可以一次次用它来调整和改进模型。
- 测试集 -> 完全隔离的,只用于评估最终效果。一旦使用测试集来做优化,那它就变成了验证集,失去了真正评估泛化能力的意义。
如果模型在验证集上的准确率是 90%,但在测试集上只有 80%。这说明模型在验证集上过拟合了,因为你可能调整了太多次,特意针对验证集进行优化。
泛化误差
在监督学习中,主要目标是 利用训练数据构建一个模型,该模型能够根据 具有与初始训练集相同特征的 新、未见过的数据进行准确预测,这被称为 泛化。
所以 泛化误差的真正定义 是:模型在从未见过的新数据上的误差。这个值告诉我们 模型在从未迭代过的实例上的表现如何。
通过在 验证集上评估模型,可以得到 泛化误差的估计。
当我们训练模型时,我们 不断通过验证集来估计泛化误差,目的是:选择最优的超参数配置,避免过拟合或欠拟合。
- 训练过程中的验证集表现,是 对泛化误差的一个近似估计,但并不完全准确。因为我们 反复使用验证集来做调整,它就变得“熟悉”了。
- 测试集才是用于 真正评估泛化误差的,因为:测试集完全不参与模型的训练和调优,它是一次性的、纯粹的评估数据。
- 但如果我们 在训练过程中不停地查看测试集的表现,那它就不再是“全新数据”,而是变相的验证集了。
通常我们在训练过程中就说“泛化误差”是验证集的表现,因为那是我们唯一能看到、并用来指导训练的指标。测试集的泛化误差只有在所有训练过程结束后才会去看。
一个模型的泛化误差(也称为预测误差)可以表示为三个非常不同的误差之和:偏差误差、方差误差和不可减少误差。
-
偏差误差 被定义为由于 错误的机器学习假设而在机器学习模型中发生的系统性错误。偏差也是 模型预测与实际数据之间的平均平方差。
- 偏差误差 源于 错误的假设,例如认为数据是线性的,而实际上它是二次的。
- 具有更高偏差百分比的模型将无法匹配训练数据,偏差率较低的模型将与训练数据集相吻合。
-
方差误差,是由于 模型对训练数据中细微变化的敏感性,当数据的分割(比如训练集与验证集的不同划分)发生变化时,模型的表现波动有多大。如果你的模型泛化能力强,它从一个分割到另一个分割的变化不应该太大。
具有许多自由度(如高阶多项式模型)的模型可能具有高方差,而线性模型可能具有较低的方差。
可以想象你画一条曲线来拟合数据点:- 低方差模型(模型捕捉的是数据的主要趋势,而不是噪声): 曲线比较平滑,即使你换一批训练数据点,曲线变化也不大。
- 高方差模型(模型记住了训练数据的噪声和细节,而不是学习到真正的模式): 曲线非常复杂,会精准地穿过每一个数据点。稍微调整数据点的位置,曲线的形状也会大幅度改变。
-
不可减少的错误是由于数据本身的噪声造成的。减少这部分错误的 唯一方法是清理数据(例如,修复数据来源,如损坏的传感器,或检测并移除异常值)。
如果模型过于简单(线性模型),它将具有高偏差和低方差。相比之下,如果你的模型非常复杂并且具有许多参数,它将具有低偏差和高方差。如果你减少偏差误差,方差误差会增加,反之亦然。这种相关性被称为 偏差-方差权衡。
- 观察左侧的图表,我们可以预测出这条线并 没有覆盖图表中显示的所有点。这样的模型容易导致数据欠拟合,也称为 高偏差。
- 而右侧的图表显示预测的线覆盖了图表中的所有点。在这种情况下,你也可以认为这是一个很好的图表,因为它覆盖了所有点。但实际上并非如此,预测的线覆盖了图表中的所有噪声和异常值。这样的模型也因其复杂性而负责预测出较差的结果。这也被称为 高方差。
- 观察中间的图表,它显示了一个相当好的预测线。它 覆盖了图表中的大多数点,并在偏差和方差之间保持了平衡。
为了在欠拟合和过拟合之间找到平衡(最佳模型),需要找到一个 最小化总误差的模型。
Total Error = Bias 2 + Variance + Irreducible Error \text{Total Error} = \text{Bias}^2 + \text{Variance} + \text{Irreducible Error} Total Error=Bias2+Variance+Irreducible Error
过拟合(Overfitting)和 欠拟合(Underfitting)
过拟合和欠拟合 是机器学习中的两个基本概念,是 模型性能不佳 的两个主要原因。了解它们最初出现的原因并采取措施预防,可以在多个层面上提升模型性能。
假设有两个孩子必须参加一场数学考试。
- 由于时间限制,第一个孩子只学习了加法,无法学习减法、乘法或除法。
- 第二个孩子记忆力惊人,但数学能力不佳,因此他记住了所有的问题书中的问题。
在考试中,
- 第一个孩子只能解决与加法相关的数学问题,无法解决涉及其他三种基本算术运算的数学问题。
- 第二个孩子只能解决他从数学问题书中记住的问题,无法回答任何其他问题。
在这种情况下,如果数学考试题目来自另一本教科书,并且包括所有基本算术运算的问题,那么两个孩子都无法通过考试。
机器学习算法有时会表现出与这两个孩子相似的行为。
- 有时,机器学习模型 只从训练数据集的一小部分学习(类似于只学习加法的孩子)。在这种情况下,模型 欠拟合。
- 有时,机器学习模型会记住整个训练数据集(就像第二个孩子)并 在已知实例上表现出色,但 在未见过的数据上失败。在这种情况下,模型 过拟合。
如何区分过拟合和欠拟合?
使用飞镖类比说明过拟合和欠拟合,它提供了对过拟合和欠拟合的直观理解。
作为机器学习工程师,你的主要目标是构建一个泛化良好的模型,并完美预测正确的值(在飞镖的比喻中,这将是在靶心的位置)。
欠拟合 —— 在训练集和验证集上都表现很差
欠拟合发生在 模型无法根据训练数据做出准确预测,因此没有能力在新数据上很好地泛化。
另一种欠拟合的情况是,模型无法从训练数据中学习到足够的信息,这使得难以捕捉主导趋势(模型无法在输入和目标变量之间创建映射)。
如果模型欠拟合,训练和验证的损失都会相当高(就像那个只学会了加法而无法解决数学考试中其他基本算术操作相关问题的孩子)。欠拟合模型通常具有 高偏差和低方差。
过拟合 —— 在训练集上表现很好,但在验证集或测试集上表现很差
一个模型在 训练数据上表现极好,但在相同水平的 验证数据上表现不好,被认为是过拟合(就像那个记住了数学书中每一个数学问题的孩子,面对其他数学书的问题都会感到困难)。
过拟合的模型无法很好地泛化,因为它将训练数据的噪声和模式学习到极致,以至于对模型在新数据上的性能产生负面影响。如果模型过拟合,即使输出数据发生微小变化,也会导致模型发生显著变化。过拟合的模型通常具有 低偏差和高方差。
绿线代表过拟合模型,黑线代表正则化模型。虽然绿线完美的符合训练数据,但拟合得太过紧密或精确;并且与黑线相比,在新的测试数据上会有更高的错误率。
如何避免过拟合和欠拟合?
如何避免过拟合?
-
减少模型复杂度:比如从 10 次多项式降到 3 次多项式。在神经网络中,减少层数或每层的神经元数量。
-
正则化(Regularization):
- L1 正则化(Lasso): 惩罚模型中 参数的绝对值(使一些参数变为零)。
- L2 正则化(Ridge): 惩罚模型中 参数的平方(缩小参数值)。
- Dropout(深度学习中常用): 在训练时 随机丢弃一部分神经元,防止过于依赖特定路径。
-
增加训练数据:当数据量不足时,复杂模型容易记住每个数据点。更多的数据有助于模型学习更一般化的模式。
-
数据增强(Data Augmentation):对于图像识别,可以通过 旋转、缩放、裁剪 等操作生成新的训练样本。
如何避免欠拟合?
- 增加模型复杂度:比如从线性回归改为多项式回归,或者增加神经网络的层数与节点。
- 减少正则化力度:如果正则化参数设置过大(比如 L2 正则化中 λ λ λ 值过大),模型会变得过于简单。
- 训练更久:在深度学习中,如果网络还没收敛就停止训练,也会导致欠拟合。
正则化(Regularization)—— 防止过拟合
正则化(Regularization)是机器学习和深度学习中常用的一种技术,旨在防止模型过拟合。过拟合是指模型在训练数据上表现得非常好,但在新数据(测试数据)上表现较差,因为模型“记住”了训练数据的噪声和细节,而没有学到数据的普遍规律。
正则化通过 引入对模型复杂度的惩罚 来降低模型的过拟合程度,从而提高其泛化能力。
正则化的原理
正则化的核心思想是 在训练模型时,不仅优化损失函数(如均方误差、交叉熵等),还要加入一个额外的惩罚项(正则项),这个 惩罚项通常是模型复杂度的函数。这样,模型的训练目标 就不再仅仅是最小化训练数据上的损失,而是 同时最小化损失和复杂度 的组合。
具体来说,正则化的目标函数 通常是:
L total = L loss + λ ⋅ R ( W ) L_{\text{total}} = L_{\text{loss}} + \lambda \cdot R(W) Ltotal=Lloss+λ⋅R(W)
- L loss L_{\text{loss}} Lloss 是 损失函数(如均方误差、交叉熵等),衡量模型在训练数据上的表现。
- λ \lambda λ 是正则化项的系数,控制惩罚项对整体目标的影响。
- R ( W ) R(W) R(W) 是 正则化项,通常是模型权重 W W W 的某种函数,表示 模型的复杂度。
正则项通过引入对模型复杂度的控制,来约束模型的参数更新,从而达到以下目的:
- 防止过拟合:通过限制模型的复杂度,正则化可以 防止模型在训练集上学习到过多的噪声和细节,从而避免过拟合现象,提升模型的泛化能力。
- 简化模型:正则化鼓励模型的参数较小或较为平滑,这有助于生成更简单的模型,避免模型过于复杂。
- 提高稳定性:正则化有助于避免模型对训练数据中异常值(噪声)过度敏感,从而提高模型的稳定性和鲁棒性。
常见的正则化方法
有几种常用的正则化方法,它们通常会在损失函数中添加不同形式的惩罚项。
L2 正则化(Ridge Regularization)
L2 正则化是最常见的正则化形式,它的 惩罚项是所有模型参数的平方和,形式为:
R ( W ) = ∑ i W i 2 R(W) = \sum_i W_i^2 R(W)=i∑Wi2
L2 正则化的作用是 使得模型的权重尽量小,避免某些特征的权重过大。它有助于模型的平滑和稳定,因为它对每个权重施加了一个均匀的惩罚。
- 通过使参数尽量小,减少模型对数据中的噪声的依赖。
- 权重较小的参数意味着 模型不容易对某些输入特征过度拟合。
L1 正则化(Lasso Regularization)
L1 正则化的惩罚项是 所有模型参数的绝对值和,形式为:
R ( W ) = ∑ i ∣ W i ∣ R(W) = \sum_i |W_i| R(W)=i∑∣Wi∣
L1 正则化的特点是它 能产生稀疏解,也就是说,它 倾向于将一些权重压缩为零,进而使得一些特征完全从模型中移除。
- 生成稀疏模型,能够自动进行特征选择。
- 特别适用于高维数据,可以 帮助剔除不相关的特征。
Elastic Net 正则化
Elastic Net 是 L1 和 L2 正则化的组合,它结合了 L1 的特性(稀疏性)和 L2 的特性(平滑性)。其惩罚项为:
R ( W ) = α ∑ i ∣ W i ∣ + 1 − α 2 ∑ i W i 2 R(W) = \alpha \sum_i |W_i| + \frac{1-\alpha}{2} \sum_i W_i^2 R(W)=αi∑∣Wi∣+21−αi∑Wi2
其中, α \alpha α 是一个控制 L1 和 L2 正则化权重的超参数。
- 结合了 L1 和 L2 正则化的优点,能够同时进行特征选择和防止过拟合。
- 在特征较多且特征间存在相关性时,Elastic Net 通常表现得比 L1 和 L2 单独使用时更好。
Dropout
Dropout是一种常用于深度学习中的正则化方法。在训练过程中,Dropout 会 随机地“丢弃”部分神经元(即将其输出设为零),从而强制模型学习到更加健壮的特征。这样,神经网络的每一轮训练都会采用不同的网络结构,从而减少过拟合的风险。
- 防止神经网络中的神经元过于依赖某些特定的特征。
- 通过使网络结构变得更加多样化,增强网络的泛化能力。
为什么 Lasso 回归会导致特征选择,而岭回归只会将系数减小到接近零?
参考:Ridge and Lasso Regression: L1 and L2 Regularization
对于具有 p p p 个特征进行输出预测的简单线性模型,成本函数可以写成:
∑ i = 1 M ( y i − y i ^ ) 2 = ∑ i = 1 M ( y i − ∑ j = 0 p w j × x i j ) 2 \sum_{i=1}^{M} \left( y_i - \hat{y_i} \right)^2 = \sum_{i=1}^{M} \left( y_i - \sum_{j=0}^{p} w_j \times x_{ij} \right)^2 i=1∑M(yi−yi^)2=i=1∑M(yi−j=0∑pwj×xij)2
- M M M 是样本的总数量。 y i y_i yi 是第 i i i 个样本的真实值。 y i ^ \hat{y_i} yi^ 是第 i i i 个样本的预测值,计算方式为多个输入特征的加权和。
- p p p 是输入特征的总数量。 w j w_j wj 是第 j j j 个输入特征的权重(回归系数), x i j x_{ij} xij 是第 i i i 个样本的第 j j j 个输入特征的值。
Ridge 回归(Ridge Regression):在岭回归中,通过添加与系数幅度的平方相等的惩罚来改变损失函数。
∑ i = 1 M ( y i − y i ^ ) 2 = ∑ i = 1 M ( y i − ∑ j = 0 p w j × x i j ) 2 + α ∑ j = 0 p w j 2 \sum_{i=1}^{M} \left( y_i - \hat{y_i} \right)^2 = \sum_{i=1}^{M} \left( y_i - \sum_{j=0}^{p} w_j \times x_{ij} \right)^2 + \alpha \sum_{j=0}^{p} w_j^2 i=1∑M(yi−yi^)2=i=1∑M(yi−j=0∑pwj×xij)2+αj=0∑pwj2
- 第一项: ∑ i = 1 M ( y i − y i ^ ) 2 \sum_{i=1}^{M} \left( y_i - \hat{y_i} \right)^2 ∑i=1M(yi−yi^)2 是标准的均方误差(MSE)损失。
- 第二项: α ∑ j = 0 n w j 2 \alpha \sum_{j=0}^{n} w_j^2 α∑j=0nwj2 是正则化项(L2 正则化),用于抑制模型的复杂度,防止过拟合。 w j w_j wj 是模型的参数(权重)。
- α \alpha α 是正则化强度的超参数,决定了正则化项对损失函数的贡献大小。
α \alpha α 越低,模型就越类似于线性回归模型。下面是使用岭回归 缩小系数幅度 的例子,
在 X 轴上,我们绘制系数索引,对于波士顿房价预测数据,有 13 个特征。
- 当 α = 0.01 α = 0.01 α=0.01 较低时,系数的约束较少,系数的幅度几乎与线性回归相同。
- 当 α = 100 α=100 α=100 较高时,我们发现对于系数索引 3、4、5,其幅度与线性回归情况相比明显较小。
Lasso 回归: Lasso(最小绝对收缩和选择算子)回归的成本函数可以表示为:
∑ i = 1 M ( y i − y i ^ ) 2 = ∑ i = 1 M ( y i − ∑ j = 0 p w j × x i j ) 2 + λ ∑ j = 0 p ∣ w j ∣ \sum_{i=1}^{M} \left( y_i - \hat{y_i} \right)^2 = \sum_{i=1}^{M} \left( y_i - \sum_{j=0}^{p} w_j \times x_{ij} \right)^2 + \lambda \sum_{j=0}^{p} |w_j| i=1∑M(yi−yi^)2=i=1∑M(yi−j=0∑pwj×xij)2+λj=0∑p∣wj∣
就像岭回归的代价函数一样,当 α = 0 \alpha=0 α=0 时,上述方程简化为线性成本。唯一的区别是,它不是取系数的平方,而是考虑系数的绝对值。这种正则化(L1)可能导致系数为零,即某些特征在评估输出时被完全忽略。因此,Lasso 回归不仅有助于减少过拟合,还可以帮助我们进行特征选择。
之所以使用癌症数据而不是之前使用的波士顿房价数据,是因为癌症数据集有 30 个特征,而波士顿房价数据集只有 13 个特征。通过改变正则化参数,Lasso 回归的特征选择可以很好地展示出来。
左面板显示了两个不同 α \alpha α 值下的系数幅度比较。当 α = 1 \alpha=1 α=1 时,正则化强度较大,我们可以看到大部分系数为零或接近零,而 α = 0.01 \alpha=0.01 α=0.01 时则并非如此。
Lasso 回归中正则化参数的默认值(由 α α α 给出)为 1。在这个例子中,从癌症数据集中 30 个特征中,只有 4 个特征被使用(系数的非零值),大部分特征的系数被强行缩小到接近 0 或完全为 0。
由于只有 4 个特征,训练和测试分数都很低;得出结论,该模型对癌症数据集 欠拟合,因为 有用的信息被忽略了。
通过减小 α \alpha α 值和增加迭代次数来减少欠拟合。现在增大到 α = 0.01 α=0.01 α=0.01,非零特征=10,更多的特征被保留下来,训练和测试分数提高。
进一步减小 α = 0.0001 α = 0.0001 α=0.0001,非零特征 = 22。训练和测试分数与基本线性回归情况相似。在图右侧面板中,当 α = 0.0001 α = 0.0001 α=0.0001 时,Lasso 回归和线性回归的系数非常相似。
- 大 α α α 会过于严格地限制模型的复杂度,导致重要特征被忽略(欠拟合)。
- 小 α α α 会让模型保留更多特征,能够更好地拟合数据。
- 增大 α α α 值 = 增强正则化力度 = 增加欠拟合风险。
- 减小 α α α 值 = 减弱正则化力度 = 降低欠拟合风险,但可能增加过拟合风险。
为什么 Lasso 回归会导致特征选择,而岭回归只会将系数减小到接近零,而不是零?
对于二维特征空间,约束区域以青色和绿色绘制了 Lasso 和 Ridge 回归。椭圆轮廓是线性回归的成本函数。
- 现在如果我们 放松了对系数的条件,那么约束区域可以变得更大,最终它们会接触到椭圆的中心。这就是 Ridge 和 Lasso 回归类似于线性回归结果的情况。
- 否则,这两种方法都是通过 找到椭圆轮廓首次接触到约束区域的第一点来确定系数 的(这个点所表示的参数 w w w 的组合,可以使得损失函数最小化)。
- 菱形(Lasso)在轴上有角,而圆盘则没有,每当椭圆区域接触到这样的点时,其中一个特征就会完全消失!对于更高维度的特征空间,Lasso 回归在轴上可能有多个解,因此我们只能得到选中的重要特征。
🌟 Lasso 回归的特性:
- 菱形的形状意味着在二维情况下,约束区域 在坐标轴上有 尖角。
- 当椭圆轮廓扩大并与菱形的边界相交时,很容易触碰到这些尖角。
- 这些 尖角意味着 某些参数 w i w_i wi 会被精确地缩小到 0。
- 所以,Lasso 回归自然地 倾向于产生稀疏解(即许多特征的系数为零)。
🌟 Ridge 回归的特性:
- 圆盘的形状是光滑的,永远不会形成尖角。
- 当椭圆轮廓与圆盘相交时, 通常不会正好落在坐标轴上。
- 因此, 参数 w i w_i wi 会被缩小到很小的值,但 几乎不会等于 0。
特性 | Lasso 回归 (L1 正则化) | 岭回归 (Ridge 回归, L2 正则化) |
---|---|---|
约束区域形状 | 菱形(尖角) | 圆盘(光滑) |
参数的效果 | 许多参数 w i w_i wi 被缩小到 0(特征选择) | 参数 w i w_i wi 仅仅被缩小,不会为 0 |
稀疏解 | 是(特征选择) | 否(所有特征都会保留,只是权重变小) |
应用场景 | 特征选择、稀疏建模 | 防止过拟合但保留所有特征 |