ML 中的 LOOCV (留一法交叉验证)

2025 年 6 月 23 日 | 阅读 11 分钟

引言

留一法交叉验证 (LOOCV) 是一种特殊的交叉验证类型,用于检查机器学习模型的有效性。在这种情况下,LOOCV 将数据集分成 n 个子集,n 等于数据集中样本的总数。在验证过程中,一个样本作为测试样本,其余 n-1 个样本用作训练样本。然后重复此过程 n 次,这意味着每个样本在测试集中只使用一次。在所有这些迭代中,最终的性能指标(准确率或均方误差)取平均值。

交叉验证在机器学习中的重要性

使用强大可靠的机器学习进行模型构建是重要的一步,通常包括最著名的步骤——交叉验证。这确保了模型在未见过的数据上评估性能,从而降低了过拟合的风险,并对泛化能力进行了更现实的衡量。

  • 小数据集场景:LOOCV 通过在每次迭代中几乎在全部数据上训练模型,最大限度地利用有限的数据。
  • 模型评估:总的来说,它提供了完整的模型评估,因为所有数据点都用于训练和测试。
  • 最小化性能估计中的方差:LOOCV 可以通过在每次迭代中使用试验样本作为测试集来分析偏差-方差权衡。

LOOCV 的主要特点

  • LOOCV – 穷尽验证:在 LOOCV 中,模型被验证 n 次,每次测试数据都不同,因为我们使用一个数据点进行测试,其余数据点用于训练。
  • 性能估计的低方差:LOOCV 测量所有数据点的性能,以避免与使用随机子集的方法相关的低方差错误。
  • 计算密集型:LOOCV 的计算成本很高,尤其是在数据集较大时,因为它需要重复训练。
  • 异常值:每个测试集都只有一个样本;因此,如果数据存在异常值,性能指标可能会高度敏感地波动。
  • 充分利用训练数据:在每次迭代中,n-1 个样本用于训练,因此始终为鲁棒学习提供最大的训练数据。

LOOCV 如何工作?

LOOCV 的分步过程

留一法交叉验证 (LOOCV) 是一种交叉验证,其中 (n) 个观测值被划分,除了一个之外的所有观测值都用作训练集,其余部分用作验证集。然后重复此过程,直到每个观测值都被用作验证点一次。

  • 数据集划分:考虑一个包含 N 个观测值的数据集。对于每次迭代,随机选择一个观测值作为验证集,其余的用作训练集。
  • 训练模型:在 N-1 个训练观测值上训练机器学习模型。
  • 模型评估:使用单个验证观测值评估模型的性能(例如,计算误差或准确率)。
  • 重复过程:对数据集中每个 N 个观测值重复步骤 2 和 3;总的来说,每个数据点应恰好用作验证集一次。
  • 聚合结果:计算所有迭代后,我们确定在所有 N 个折叠上定义的总体性能指标(例如,平均误差或准确率)以估计模型的性能。

示例

观察特性目标
12.00
23.51
31.80
44.21

第一次迭代:

  • 验证集:观测值 1(特征:2.0,目标:0)
  • 训练集:观测值 2、3 和 4
  • 在观测值 2、3 和 4 上训练模型,并在观测值 1 上进行评估。

第二次迭代:

  • 验证集:观测值 2(特征:3.5,目标:1)
  • 训练集:观测值 1、3 和 4
  • 在观测值 1、3 和 4 上训练模型,并在观测值 2 上进行评估。

第三次迭代:

  • 验证集:观测值 3(特征:1.8,目标:0)
  • 训练集:观测值 1、2 和 4
  • 在观测值 1、2 和 4 上训练模型,并在观测值 3 上评估模型。

第 4 次迭代:

  • 验证集:观测值 4(特征:4.2,目标:1)
  • 训练集:观测值 1、2 和 3
  • 在观测值 1、2 和 3 上训练模型,并在观测值 4 上进行测试。

聚合性能:

  • 通过计算所有四个迭代的平均误差或准确率来获得最终性能指标。

与其他交叉验证技术的比较

方面LOOCVk 折交叉验证
折叠数等于观测值数 (N)通常为 5 或 10
训练集大小N-1 个观测值(k-1)/k × N
计算成本高,由于 N 次迭代中等,k 折迭代
偏差-方差权衡低偏差但高方差平衡偏差和方差
处理小数据集理想可能在某些折叠中丢失信息

LOOCV 的数学基础

留一法交叉验证 (LOOCV) 是一种特殊的交叉验证形式,其中数据点总数为 n,数据集被分成 n 个子集。每个 n 个数据点都用作验证集一次,而其他 n-1 个数据点用作训练集。

LOOCV 的数学表示

以下是如何从数学上计算 LOOCV 误差

  1. 将数据集 D={(x1y1)(x2y2)…(xnyn)} 分成 n 个子集,每个子集包含一个数据点。
  2. 对于第 i 次迭代
    1. (xiyi) 应作为验证数据。
    2. 使用剩余的 n-1 个数据点,训练模型 f−i 如下:D−i=D∖{(xi,yi)}。
    3. 预测 xi 的结果:ŷi=f−i(xi)。
  3. 使用损失函数 L(例如,均方误差 (MSE))计算每次迭代的误差
    ei=L(yi,ŷi)。
  4. 将不同的误差重新表述为单个总误差以获得 LOOCV 评估结果
    LOOCV 误差 = 1/n ∑ni-1ei

该方法在处理小数据集时为模型提供几乎无偏的性能估计。

与训练和验证拆分的关系

LOOCV 使用训练和验证拆分,它们的具体功能如下

  • 验证拆分:存在一个数据点 (xi)。
  • 训练拆分:剩余的 n-1 个数据点 (D−i) 构成训练拆分。

在 LOOCV 中,数据点被验证一次,而不是像其他交叉验证方法那样使用更大的验证子集。该方法保证了每个数据点在完全相同的时间用于训练和验证。该过程有效地利用了所有数据集数据。

主要关系

  • 训练数据大小 = n-1。
  • 验证数据大小为 1。

因此,LOOCV 对于小数据集很有用,因为它通过系统地包含和排除单个数据点,能够对所有数据点上的模型进行全面评估。

计算复杂度分析

训练模型的复杂性和数据点 n 的数量决定了 LOOCV 的计算复杂度。

  • 模型训练次数:LOOCV 所需的模型训练迭代次数为 n,因为每次迭代都省略一个点用于模型验证。
  • 模型复杂度:如果模型对 n-1 个数据点的训练复杂度为 O(T),则 LOOCV 的总训练成本大致如下。
    O(n⋅T)。
  • 验证复杂度:一般来说,预测每个排除数据点的验证输出所需的计算能力比训练少。在大多数情况下,这种开销与训练过程相比微不足道。
  • 总体复杂度:以下是 LOOCV 总体复杂度的表达式
    O(n⋅T),其中算法决定 T
    • 对于线性模型:T∼O(n2),导致 O(n3)。
    • 对于非线性模型或深度学习LOOCV 对于大型数据集来说计算成本很高,因为 T 随着数据大小和模型复杂度的增加而增加。
  • 权衡:LOOCV 高计算成本是一个主要缺点,尤其是对于大型数据集或复杂模型。然而,它在数据量少的情况下很有用,因为它提供了模型性能的低方差估计。

LOOCV 的优点

模型性能的准确估计

  • LOOCV 通过使用几乎整个数据集进行训练并仅使用一个数据点进行验证,提供了几乎完全准确且无偏的模型性能。
  • 通过这种方式,模型在每个数据点上进行了评估,以便模型能够充分理解它从未知数据中学到的东西。
  • 该方法降低了高估风险,因此,对于评估对高精度要求至关重要的场景中的预测精度,它是一种合适的方法。

对小数据集的实用性

  • 然而,当我们拥有较小的数据集时,我们可以使用 LOOCV,因为它会将数据分成单独的训练集和测试集,从而减少训练数据量。
  • LOOCV 有助于利用大部分数据进行训练(每次迭代 n-1 个样本),这使得模型能够使用几乎所有数据来学习模式,从而有助于更好地泛化。
  • 实践者将能够最大限度地利用有限的数据,而不会损害评估的可靠性。

性能指标的低方差

  • 由于所有数据点仅用作验证点一次,因此 LOOCV 计算出稳定无变化的性能指标。
  • LOOCV 不存在 k 折交叉验证等方法中存在的 결과 的变异性问题,其中折叠的选择会影响结果。
  • LOOCV 产生一致的结果,因此在比较多个模型时可以将其作为性能基准测试的可靠依据。

LOOCV 的局限性

大型数据集的高计算成本

  • LOOCV 执行 n 次训练,其中 n 是数据集中的数据点数量。每次迭代都将一个数据点作为验证数据,因此 n-1 个数据点用于训练。
  • 这个过程的计算成本可能很高,如果数据集的实例数量很大,则更高。例如,对于包含 10,000 个样本的数据集,模型将被训练 10,000 次。
  • 然而,对于高度复杂的模型,例如神经网络或集成方法,整个训练过程可能是资源密集型的,并且这种计算开销会进一步增加。

对异常值的敏感性

  • LOOCV 对数据集中的异常值非常敏感。在其中一次迭代中,异常值将不成比例地影响模型的评估,因为它被用作每个数据点的验证集。
  • 如果一个点被排除在训练之外是异常值,可能会导致在其余 n-1 个点上训练的模型预测失败,从而导致误导性的差性能指标。
  • 如果训练集中存在异常值,它可能导致模型对其他验证样本的预测被高估,并且模型将高估其泛化能力。

LOOCV 的应用

在小数据集场景中的使用

  • LOOCV 更适用于小数据量:LOOCV 对小数据量特别有用。由于所有数据点都用于训练和验证模型,因此每个数据点都经过一次训练和验证。
  • 小数据偏差:当数据“拆分”成新的、老式的训练集和测试集时,并且数据的方差很高时,就会出现小数据偏差。LOOCV 通过系统地测试模型在每个数据点上的性能,有助于平滑这种偏差,并提供更真实的模型性能视图。
  • 示例:用于难以收集大量数据的领域(例如,不常见物种的分类、一组小临床样本的分析等)。

敏感模型的评估

  • 在高风险决策制定领域:医疗诊断只是一个例子,其中任何预测都将产生严重后果。由于 LOOCV 对每个单独的案例进行广泛的敏感模型测试,因此它是评估敏感模型的可靠方法。
  • 有效处理不平衡数据集:不平衡的医疗数据集非常常见,例如:(健康病例多于患病病例)。LOOCV 有助于改进罕见病症的模型评估,即使少数病例也得到验证。
  • 应用:涉及需要访问大量数据(罕见物种、异常罕见的事件、难以找到的数据、非常规数据等,这些可能存在于科学工作中)的应用。

模型性能基准测试的研究用例

  • 研究中的标准化评估:在医学诊断领域,单个预测可能会产生重大影响。LOOCV 肯定会关注敏感模型,因为它们会在各种情况下彻底测试模型。
  • 公平的模型比较:与其他方法不同,LOOCV 消除了随机变量,因此结果可以重现,模型比较是公平的。

在机器学习框架中实现 LOOCV

示例

LOOCV 可以轻松地在 Python 的 Scikit Learn 库的 LeaveOneOut 类中实现。

输出

 
LOOCV Accuracy: 0.97   

说明

  • 数据集准备:鸢尾花数据集以及特征 (X) 和标签 (y) 被拆分。
  • LeaveOneOut 类:它将执行训练测试拆分,其中一个实例将被拆分为测试,其余案例将用于训练。
  • 模型训练和预测:训练集用于训练 LogisticRegression 模型,并且该模型预测测试集中的一个实例(此处指定一个实例)。
  • 准确率计算:所有 LOOCV 迭代的预测与标签的准确率百分比。

Scikit-Learn 中 LeaveOneOut 类的解释

Scikit Learn 中的 LeaveOneOut 类是执行 LOOCV 的简单方法。

  • 拆分机制:对于大小为 n 的数据集的拆分机制,LeaveOneOut 产生 n 个训练测试拆分,其中第 i 个样本恰好是测试样本一次。
  • 易于与其他 Sklearn 工具一起使用:该类可以与 Sklearn 管道用于模型评估以及 sklearn 中的其他工具一起使用。
  • 首选用法语法:用法语法是使用 LeaveOneOut().split(X) 的结果,它返回每次迭代的训练和测试索引。

例如

输出

 
Train indices: [1 2 3] Test index: [0]
Train indices: [0 2 3] Test index: [1]
Train indices: [0 1 3] Test index: [2]
Train indices: [0 1 2] Test index: [3]   

自定义实现以实现更大的灵活性

然而,由于独特的场景,您可能需要一些自定义实现;Scikit Learn 已经提供了足够好的实现。

示例

输出

 
Custom LOOCV Accuracy: 0.97   

自定义实现的主要特点

  • 灵活性:修改针对特殊场景的训练-测试拆分逻辑。
  • 独立性:避免对外部库进行 LOOCV 的依赖。