k折交叉验证入门详解

交叉验证是一种用于估计机器学习模型技能的统计方法。

它在应用机器学习中常用于比较和选择给定预测建模问题的模型,因为它易于理解,易于实现,并且生成的技能估计通常比其他方法具有较低的偏差。

在本教程中,您将了解 k 折交叉验证程序,用于估计机器学习模型的技能。

完成本教程后,您将了解:

  • k 折交叉验证是一种用于估计模型在新数据上的技能的程序。
  • 您可以采用一些常见策略来为数据集选择 k 的值。
  • 在 scikit-learn 中,有一些常用的交叉验证变体,例如分层和重复交叉验证。

用我的新书《机器学习统计学》 启动您的项目,其中包括逐步教程和所有示例的Python 源代码文件。

让我们开始吧。

  • 2020 年 7 月更新:添加了指向相关交叉验证类型的链接。
A Gentle Introduction to k-fold Cross-Validation

k折交叉验证入门详解
图片由 Jon Baldock 拍摄,保留部分权利。

教程概述

本教程分为5个部分,它们是:

  1. k折交叉验证
  2. k 的配置
  3. 实例演示
  4. 交叉验证 API
  5. 交叉验证的变体

需要机器学习统计学方面的帮助吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

k折交叉验证

交叉验证是一种重采样过程,用于在有限的数据样本上评估机器学习模型。

如果您有一个机器学习模型和一些数据,您想知道您的模型是否能够拟合。您可以将数据分成训练集和测试集。使用训练集训练您的模型,并使用测试集评估结果。但是您只评估了一次模型,并且不确定您的好结果是运气还是其他原因。您想多次评估模型,以便对模型设计更有信心。

该过程有一个名为 k 的单个参数,它指的是给定数据样本将被分割成的组数。因此,该过程通常被称为 k 折交叉验证。当选择 k 的特定值时,它可以代替 k 在模型的引用中使用,例如 k=10 变为 10 折交叉验证。

交叉验证主要用于应用机器学习中,以估计机器学习模型在未见数据上的技能。也就是说,使用有限样本来估计模型在对训练模型期间未使用的进行预测时,总体预期性能如何。

它是一种流行的方法,因为它易于理解,并且通常比其他方法(例如简单的训练/测试划分)产生更少偏差或更少乐观的模型技能估计。

请注意,k 折交叉验证是为了评估模型设计,而不是特定的训练。因为您使用不同的训练集重新训练了相同设计的模型。

一般程序如下

  1. 随机打乱数据集。
  2. 将数据集分成 k 组
  3. 对于每个独立的组
    1. 将该组作为保留或测试数据集
    2. 将剩余的组作为训练数据集
    3. 在训练集上拟合模型并在测试集上进行评估
    4. 保留评估分数并丢弃模型
  4. 使用模型评估分数的样本总结模型的技能

重要的是,数据样本中的每个观测值都被分配到一个单独的组中,并且在该过程的持续时间内保持在该组中。这意味着每个样本都有机会在保留集中使用 1 次,并用于训练模型 k-1 次。

这种方法涉及将观测值集合随机划分为 k 个大小大致相等的组或折叠。第一个折叠被视为验证集,并在其余 k - 1 个折叠上拟合方法。

— 第 181 页,《统计学习导论》,2013 年。

同样重要的是,在模型拟合之前对数据进行的任何准备工作都应在循环内的 CV 分配训练数据集上进行,而不是在更广泛的数据集上进行。这也适用于任何超参数的调整。未能循环内执行这些操作可能导致数据泄露和对模型技能的乐观估计。

尽管统计方法学家做出了最大努力,但用户经常因无意中偷看测试数据而使结果失效。

— 第 708 页,《人工智能:一种现代方法(第 3 版)》,2009 年。

k 折交叉验证运行的结果通常用模型技能分数的平均值来概括。同时,包含技能分数方差的度量,例如标准差或标准误差,也是一个很好的实践。

k 的配置

k 值必须根据您的数据样本仔细选择。

选择不当的 k 值可能导致对模型技能的错误认识,例如具有高方差(可能根据用于拟合模型的数据而发生很大变化)或高偏差(例如高估模型技能)的分数。

选择 k 值的三个常见策略如下

  • 代表性:选择 k 值,使得每个训练/测试数据样本组都足够大,足以在统计学上代表更广泛的数据集。
  • k=10:k 值固定为 10,这个值经过实验发现通常能产生具有低偏差和适度方差的模型技能估计。
  • k=n:k 值固定为 n,其中 n 是数据集的大小,以便每个测试样本都有机会被用于保留数据集。这种方法被称为留一法交叉验证。

k 的选择通常是 5 或 10,但没有正式的规则。随着 k 变大,训练集和重采样子集的大小差异变小。随着这种差异减小,该技术的偏差也变小。

— 第 70 页,《应用预测建模》,2013 年。

在应用机器学习领域,k=10 的值非常常见,如果您在为数据集选择值时遇到困难,建议您使用该值。

总而言之,k 折交叉验证中 k 的选择存在偏差-方差权衡。通常,考虑到这些因素,人们使用 k = 5 或 k = 10 进行 k 折交叉验证,因为这些值已被经验证明可以产生既不会有过度高偏差也不会有非常高方差的测试错误率估计。

— 第 184 页,《统计学习导论》,2013 年。

如果选择的 k 值不能均匀地分割数据样本,那么其中一组将包含剩余的示例。最好将数据样本分割成 k 个具有相同样本数的组,这样模型技能分数样本都是等效的。

有关如何配置 k 折交叉验证的更多信息,请参阅教程

实例演示

为了使交叉验证过程具体化,我们来看一个实际例子。

假设我们有一个包含 6 个观测值的数据样本

第一步是选择 k 的值,以确定用于分割数据的折叠数。这里,我们将使用 k=3 的值。这意味着我们将打乱数据,然后将数据分成 3 组。因为我们有 6 个观测值,所以每个组将包含相等数量的 2 个观测值。

例如

然后我们可以利用样本,例如评估机器学习算法的技能。

训练和评估三个模型,每个折叠都有机会成为保留测试集。

例如

  • 模型 1:在折叠 1 + 折叠 2 上训练,在折叠 3 上测试
  • 模型 2:在折叠 2 + 折叠 3 上训练,在折叠 1 上测试
  • 模型 3:在折叠 1 + 折叠 3 上训练,在折叠 2 上测试

模型在评估后即被丢弃,因为它们已经完成了任务。

收集每个模型的技能分数并进行汇总以供使用。

交叉验证 API

我们不必手动实现 k 折交叉验证。scikit-learn 库提供了一个可以分割给定数据样本的实现。

可以使用 `KFold()` scikit-learn 类。它接受的参数包括分割次数、是否打乱样本,以及打乱前使用的伪随机数生成器的种子。

例如,我们可以创建一个实例,将数据集分割成 3 个折叠,在分割前进行打乱,并使用 1 作为伪随机数生成器的值。

然后可以在提供数据样本作为参数的类上调用 `split()` 函数。重复调用时,`split` 将返回每组训练集和测试集。具体来说,返回的数组包含原始数据样本中观测值的索引,用于每次迭代的训练集和测试集。

例如,我们可以使用创建的 `KFold` 实例来枚举数据样本索引的分割,如下所示

我们可以将所有这些与我们在上一节的示例中使用的小数据集结合起来。

运行示例会打印为每个训练集和测试集选择的特定观测值。索引直接用于原始数据数组以检索观测值。

值得注意的是,scikit-learn 中的 k 折交叉验证实现作为更广泛方法中的一个组件操作提供,例如网格搜索模型超参数和在数据集上对模型进行评分。

然而,可以直接使用 `KFold` 类来在建模之前分割数据集,以便所有模型都使用相同的数据分割。如果您正在处理非常大的数据样本,这尤其有用。在不同算法中使用相同的分割对于您以后可能希望对数据执行的统计测试很有益。

交叉验证的变体

k 折交叉验证过程有多种变体。

以下是三种常用的变体:

  • 训练/测试分割:极端情况下,k 可以设置为 2(而不是 1),这样就创建了一个单一的训练/测试分割来评估模型。
  • LOOCV:另一种极端情况是,k 可以设置为数据集中观测值的总数,这样每个观测值都有机会被保留在数据集之外。这称为留一法交叉验证,简称LOOCV
  • 分层:数据折叠的划分可以由标准来控制,例如确保每个折叠具有相同比例的具有给定类别值(例如类别结果值)的观测值。这称为分层交叉验证
  • 重复:这指的是将 k 折交叉验证程序重复 n 次,重要的是,在每次重复之前打乱数据样本,这会导致样本的不同分割。
  • 嵌套:这是指在交叉验证的每个折叠内执行 k 折交叉验证,通常用于在模型评估期间执行超参数调优。这称为嵌套交叉验证或双重交叉验证。

扩展

本节列出了一些您可能希望探索的扩展本教程的想法。

  • 找出 3 篇使用 k 折交叉验证值为 10 的机器学习研究论文。
  • 编写您自己的函数,使用 k 折交叉验证分割数据样本。
  • 开发示例来演示 scikit-learn 支持的每种主要交叉验证类型。

如果您探索了这些扩展中的任何一个,我很想知道。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

相关教程

书籍

API

文章

总结

在本教程中,您了解了 k 折交叉验证程序,用于估计机器学习模型的技能。

具体来说,你学到了:

  • k 折交叉验证是一种用于估计模型在新数据上的技能的程序。
  • 您可以采用一些常见策略来为数据集选择 k 的值。
  • 在 scikit-learn 中,有一些常用的交叉验证变体,例如分层和重复交叉验证。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

掌握机器学习统计学!

Statistical Methods for Machine Learning

培养对统计学的实用理解

...通过在 python 中编写代码

在我的新电子书中探索如何实现
机器学习的统计方法

它提供关于以下主题的自学教程
假设检验、相关性、非参数统计、重采样,以及更多...

探索如何将数据转化为知识

跳过学术理论。只看结果。

查看内容

《k 折交叉验证简介》的 306 条回复

  1. Kristian Lunow Nielsen 2018 年 5 月 25 日 下午 4:30 #

    嗨 Jason

    你做得真好!
    我有一个更技术性的问题;您能评论一下为什么通过 k 折交叉验证获得的误差估计几乎是无偏的吗?并强调其原因。

    我很难找到描述原因的文献。
    据我了解,当被问及 k 折交叉验证几乎无偏的特性时,每个人都会评论偏差/方差权衡。

  2. Vladislav Gladkikh 2018 年 5 月 25 日 下午 7:25 #

    另一个可能的扩展:回归的分层交叉验证。它在 Scikit-learn 中没有直接实现,并且关于是否值得实现存在争议:https://github.com/scikit-learn/scikit-learn/issues/4757 但这正是我在工作中需要的。我这样做:

    • Vladislav Gladkikh 2018 年 5 月 25 日 下午 7:26 #

      如何在这里进行代码格式化?

    • Jason Brownlee 2018 年 5 月 26 日 上午 5:53 #

      感谢分享!

  3. hayet 2018 年 5 月 29 日 晚上 10:46 #

    深度学习中应该使用 k 交叉验证吗?

    • Jason Brownlee 2018 年 5 月 30 日 上午 6:44 #

      对于小型网络/数据集可以。

      通常它太慢了。

  4. Chan 2018 年 6 月 8 日 晚上 9:45 #

    亲爱的 Jason,

    感谢您的见解,特别是实际示例部分。这对于理解基本原理非常有帮助。但是,我有一个基本的、我没有完全理解的问题。
    如果我们丢弃从每个组学习到的所有模型(您示例中显示的 3 个模型),那么预测未见/测试数据的最终模型是什么?

    它是否像

    我们只使用交叉验证来为模型选择正确的超参数?比如说 KNN 的 K。
    1. 我们固定 K 的值;训练并交叉验证以获得三个具有不同参数(/系数,如 Y=3x+2;Y=2x+3;Y=2.5X+3 = 只是随机值)的不同模型。
    2. 每个模型都有自己的错误率。将它们平均以获得该超参数设置/值的平均错误率。
    3. 尝试其他超参数值(对所有超参数值集重复步骤 1 和 2)。

    4. 选择平均错误率最低的超参数集。
    5. 使用新的超参数值训练整个训练数据集(这次不进行任何验证分割),并获得新模型 [例如 Y=2.75X+2.5]。
    6. 将其用作模型来预测新的/未见/测试数据。损失值将是该模型的最终错误。

    是这样吗?或者我可能完全理解错了。

    抱歉提出这个幼稚的问题,因为我是一个新手或刚刚入门。感谢您的理解 🙂

    • Jason Brownlee 2018 年 6 月 9 日 上午 6:52 #

      我在这里解释如何开发最终模型
      https://machinelearning.org.cn/train-final-machine-learning-model/

      • Vidyasankar 2020 年 6 月 5 日 上午 3:24 #

        嗨,我正在做一个项目,我有 200,000 个观测值,对测试集和交叉验证有点困惑。
        1. 我将此数据集分成训练集,其中包含 70% 的观测值,以及测试集,其中包含剩余 30% 的观测值。
        2. 我正在运行 Rweka 在训练数据集上创建决策树模型,然后利用此模型对测试数据集进行预测。
        3. 我的混淆矩阵将给我实际测试类别与预测类别,以评估模型。这正确吗?
        4. 我需要评估训练数据集上的 weka 分类器吗?当我这样做时,我应该使用交叉验证吗?或者这没有必要,因为我有一个测试集,并且我已计划在此处查看混淆矩阵以评估性能?我在这里有点困惑。您能提供的任何帮助都将不胜感激。
        谢谢

        • Jason Brownlee 2020 年 6 月 5 日 上午 8:20 #

          通常,您必须为您的数据集选择一个合适的模型评估策略。

          一种方法是使用训练/测试集。
          另一种是在所有数据集上使用 k 折交叉验证。

          如果您不确定,那么也许可以使用 k 折交叉验证。

          另外,这可能会有帮助
          https://machinelearning.org.cn/estimate-performance-machine-learning-algorithms-weka/

          • rakesh 2020 年 11 月 7 日 下午 4:16 #

            先生,是否可以将整个数据集分成训练样本和测试样本,然后对训练数据集应用 k 折交叉验证,并在测试数据集上评估性能。

            我有 2500 个数据样本。首先我将其分成 2000 个用于训练,500 个用于测试。
            然后我在训练数据集上应用了 10 折交叉验证,并评估了平均性能。
            然后我拟合到测试样本。我只是想知道这是否是正确的方法。

          • Jason Brownlee 2020 年 11 月 8 日 上午 6:37 #

            你可以,但为什么要这样做?

          • Jac 2022 年 2 月 17 日 上午 10:34 #

            所以,例如,你取一些单独的样本作为测试集——这种配置在现实生活中可能很有用。

          • James Carmichael 2022 年 2 月 17 日 下午 1:18 #

            嗨,Jac……感谢您的反馈!如果您有任何具体问题,我可以帮忙。

    • Hoc 2020 年 11 月 24 日 晚上 7:58 #

      亲爱的陈,

      你的问题很有趣,我也有和你一样的担忧,但我没有找到最好的答案。
      我想你已经有了问题的答案,你介意帮我解释一下吗?

      非常感谢。
      此致

      • 蒂娜 2021年8月25日 凌晨4:33 #

        你好 Hoc,我也有同样的问题。你解决了吗?

  5. teja_chebrole 2018年6月21日 晚上9:40 #

    很棒的文章……非常有用……

    • 杰森·布朗利 2018年6月22日 早上6:06 #

      很高兴它有帮助。

      • 泽伊纳布 2020年1月20日 凌晨5:27 #

        交叉验证和重复交叉验证有什么区别?

        • 杰森·布朗利 2020年1月20日 早上8:45 #

          重复交叉验证在每次重复时使用不同的数据分割(折叠)来重复交叉验证过程。

  6. M.萨拉特·钱德拉 2018年7月7日 晚上5:32 #

    如果进行留一交叉验证(LOOCV),它会随着数据集大小的增加而增加k的大小。您对此有何看法?
    何时对数据使用LOOCV。伪随机数生成器有什么用?

    • 杰森·布朗利 2018年7月8日 早上6:17 #

      反过来,它会增加要拟合的模型数量和评估所需的时间。

      只要您在实验中保持一致,随机数的选择并不重要。

  7. 马里森 2018年7月10日 晚上4:20 #

    你好,

    1. 您能否提供R中实现k折交叉验证的代码?

    2. 我们需要在完整数据集上进行交叉验证,还是在将数据集拆分为训练集和测试集后,仅在训练集上进行交叉验证?

  8. 志安 2018年7月16日 晚上7:36 #

    你好,

    感谢您提供的精彩教程。我有一个关于动态过程数据集交叉验证的问题。在这种情况下,如何进行交叉验证?假设我们有10个实验,其中系统状态是随时间变化的量(初始值问题)。我不确定这里是否应该打乱数据。我应该将整个实验作为一个用于交叉验证的集合,还是为每个实验选择一部分用于该目的?每个实验都包含控制系统状态的不同特征。当我想要验证时,我希望采用系统的初始状态,并使用特征向量随时间传播状态。这正是我在实践中需要的。

    请您对此提供评论。我希望我清楚地表达了我的问题。
    谢谢。

  9. 塔玛拉 2018年8月8日 凌晨5:29 #

    嗨,Jason,
    首先,您的教程非常棒,非常有帮助。非常感谢!
    我有一个关于使用k折交叉验证(k折CV)测试神经网络模型有效性(它对新数据的表现如何)的问题。我担心这个领域存在一些混淆,因为k折CV似乎是证明任何结果所必需的。
    到目前为止,我理解我们可以使用k折CV来在定义网络时找到最优参数(因为训练和测试数据的准确性会告诉何时过拟合或欠拟合),并且我们可以做出确保良好性能的选择。一旦我们做出这些选择,我们就可以对整个训练数据运行算法并生成一个模型。然后,必须对新数据(验证集和训练集)测试此模型。我的问题是:该模型需要在多少个新数据集上进行测试才能被认为是有效的?
    既然我们有了一个模型,再次使用k折CV并没有帮助(我们不寻找新模型)。我的理解是k折CV测试主要用于算法/方法优化,而最终模型应仅在新数据上进行测试。这是正确的吗?如果是这样,我应该将测试数据分成更小的集合,并将其用作多个测试,还是仅使用一个测试数据集就足够了?

    非常感谢,
    塔玛拉

  10. 阿希什 2018年8月14日 晚上7:21 #

    嗨,杰森,感谢您的精彩博客

    我的数据集大小是6000(图像数据)。我们如何知道应该使用哪种类型的交叉验证(简单的训练测试分割还是k折交叉验证)。

  11. 卡洛斯 2018年8月16日 凌晨2:46 #

    早上好!

    我是圣保罗大学的经济学学生,我正在研究信用风险的回测、压力测试和验证模型。因此,您能帮我回答一些问题吗?我正在研究如何创建良好的程序来验证试图预测代理人违约行为的预测模型。因此,假设一个违约概率的log-odds logit模型,它使用一些解释变量,如GDP、官方利率等。为了评估它,我使用一部分未用于估计的数据来计算稳定性和回测。在回测案例中,我使用基于相关变量回归的预测,以了解我的模型是否与具有置信区间的预测相符,以评估它们是否在范围内。此外,我评估参数的信号,以验证它是否符合经济学意义。
    阅读了一些论文,包括您在此处的出版物和巴塞尔的一篇(“反方信用风险模型回测的良好实践”),我有一些疑问。

    1) 模式回测程序能否完全解决过拟合问题?如果不能,有哪些建议可以解决?
    2) 模式回测程序未涵盖哪些问题,我们应该注意使用其他指标来处理它们?
    3) 您能推荐一些解释“回测反方信用风险模型良好实践”中引入的回定价概念的论文或文档吗?我没有找到其他文档,也没有理解他们的解释。
    “银行可以通过进行回定价来支持其模型的质量,进行额外的验证工作。回定价与回测类似,是对模型预测与实际结果的定量比较,但基于在历史市场数据上重新运行当前模型。为了对模型的性能做出有意义的陈述,历史数据需要为每个初始化日期划分为不同的校准和验证数据集,模型使用初始化日期之前的校准数据集进行校准,然后对初始化后的预测在验证数据集上进行测试。这种类型的分析有助于了解模型补救措施的有效性,即通过证明根据近期经验对模型进行的更改会改善过去和现在的性能。适当的回定价允许将回测数据集扩展到过去。”

    因此,我感谢您的关注和帮助。

    此致。

  12. 斯科特·米勒 2018年9月6日 晚上11:48 #

    嗨,杰森,我正在使用k折与正则化线性回归(Ridge),目的是确定最优正则化参数。

    对于每个正则化参数,我进行k折CV以计算CV误差。

    然后我选择获得最低CV误差的正则化参数。

    但是,在k折中,当我使用“shuffle=True”且k折中没有“random_state”时,每次运行程序时,最优正则化参数都会改变。

    kf=KFold(n_splits=n_kfolds, shuffle=True)

    如果我使用随机状态或“shuffle = False”,结果总是相同的。

    问题:您认为这是正常行为吗?有什么建议?

    注意:预测非常好,只是寻求一般性讨论。

    谢谢。

    • 杰森·布朗利 2018年9月7日 早上8:06 #

      是的,重复每个实验以抵消模型的方差可能是一个好主意。

      更进一步,您甚至可能希望使用统计测试来帮助确定“更好”是真实的还是噪声。我相信我在统计主题下有关于此的教程。

  13. 帕斯卡·施密特 2018年10月4日 晚上1:35 #

    嗨,Jason,

    感谢您提供的精彩教程。它帮助我更好地理解了交叉验证。
    我仍然不确定一个概念,我希望能请您为我解答。

    如果在交叉验证之前进行特征选择,那么我的误差将是有偏的,因为我根据训练集和测试集选择了特征(数据泄露)。因此,我认为我必须在交叉验证循环内只使用训练数据进行特征选择,然后用测试数据测试我的模型。

    所以我的问题是,如果不同的折叠最终得到不同的预测器,我是否应该选择出现次数最多的预测器?在那之后,我是否应该使用相同的预测器对该模型进行交叉验证?也就是说,对我的最终模型进行k折CV,其中每个预测器在不同的折叠中都是相同的?然后使用这个估计值作为我的CV误差?

    如果您能帮助我,那就太好了。再次感谢您的文章,并继续保持出色的工作。

    • 杰森·布朗利 2018年10月4日 晚上3:30 #

      谢谢。

      没错。是的,您会得到不同的特征,也许您可以取每个折叠结果的平均值。

      或者,您可以使用一个保留数据集来选择特征,并使用一个单独的集合来估计模型性能/调优。

      这取决于您有多少数据可以“花费”以及可以处理多少数据泄露/偏差。我们几乎从来没有足够的数据来做到纯粹。

      • 帕斯卡·施密特 2018年10月6日 凌晨3:32 #

        谢谢,杰森。我猜统计学不像数学那样是一门非黑即白的学科。有很多不同的方法来处理问题,没有一个最好的解决方案。这让我觉得它如此具有挑战性。处理所有这些独特的数据集需要大量的经验。

        • 杰森·布朗利 2018年10月6日 凌晨5:50 #

          是的,要变得优秀,最好的方法就是练习,就像编程、开车和我们生活中想做的所有其他事情一样。

  14. 比拉勒 2018年10月16日 晚上6:16 #

    我们计算任何数据集的标准差是为了什么?

  15. 莱昂蒂娜·哈姆 2018年10月16日 晚上9:21 #

    感谢您解释CV的基础知识。
    我正在使用重复(50次)5折交叉验证,但我正在尝试找出可以使用哪种统计测试来比较两个数据集。您能帮我吗?或者这超出了本博客的范围?

  16. 金沙克 2018年10月22日 凌晨1:27 #

    嗨,Jason,

    K折和分层K折有什么区别?

    • 杰森·布朗利 2018年10月22日 早上6:21 #

      K折将数据随机分割成k个折叠。
      分层K折尝试在为每个折叠随机选择样本时,保持目标变量的相同分布。

  17. 拉纳·穆罕默德·卡什夫 2018年12月5日 晚上3:30 #

    感谢这篇文章!

    我们能自己分割数据,然后训练一些数据,测试剩余的数据吗?
    例如,我的数据是关于板球的,我想根据0-6局和7-15局这两个分割来训练数据,并在20局比赛中测试16-20局的数据。这合理吗?如果合理,我们如何在R中实现?

  18. 鲁斯兰 2018年12月5日 晚上10:19 #

    嗨,杰森!好文章!

    当并非所有部分都相等时,我们该怎么办?假设我们有5 5 5 5 6或7 7 7 8或9 9 9 9 8

    我们应该跳过最大/最小的一个吗?我们应该以某种方式应用加权吗?还是像它大小相同一样处理?

    谢谢你。

    • 杰森·布朗利 2018年12月6日 凌晨5:55 #

      尽量使每个折叠相等,但如果它们大致相等,那也没关系。

  19. 杰森·夸德拉斯 2019年1月17日 凌晨1:08 #

    非常好的文章。简单易懂!

  20. 罗斯 2019年1月17日 晚上3:44 #

    嗨 Jason
    感谢这篇帖子!
    如何评估K折交叉验证中学习分类器的整体准确性?
    我认为
    准确率 = (每个折叠的准确率之和) / K;
    这是对还是错?

    • 杰森·布朗利 2019年1月18日 凌晨5:28 #

      是的,计算模型在测试折叠中的平均准确率得分。

  21. 奥斯卡 2019年1月22日 凌晨3:05 #

    你好 Jason,

    我发现的最好的CV教程之一。但我仍然不明白一些事情。如果最终只是丢弃模型,那么做这一切的意义何在?我在这方面遇到很多问题,因为我在不同的地方找到不同的信息。

    * 在一些教程中,据说你总是使用相同的模型进行迭代训练和验证,并保留一个独立的测试集,以便在你完成CV训练后,你可以检查你的模型是否良好。
    * 在另一些教程中,据说你在每次迭代中创建一个独立的模型,然后保留给你最好测试结果的模型。但如果是这种情况,那我为什么要计算准确性分数的平均值呢,如果我只关心最好的那个。

    希望你能帮助我,我真的在这一切中遇到了一些麻烦。

  22. 伊曼 2019年2月28日 晚上12:17 #

    我有一个关于选择数据的问题,当涉及到形式为 y = B0 + B1X1 + B2X2 的多元线性回归时
    比如说,
    Y (响应) = 数据集 0 (即 3,4,5,6,7,8)
    X1 (预测变量) = 数据集 1 (即 1,5,7,9,4,5)
    X2(预测变量) = 数据集 2 (即 7,4,6,-2,1,3)

    您是把所有数据都考虑进去并分成k组,
    即 [3,4],[5,6],[7,8],[1,5],[7,9],[4,5],[7,4],[6,-2],[1,3]

    还是一次只处理一个数据集,例如,
    Y 和对应的 X1 值
    即 [3,4] 到 [1,5] ……
    Y 和对应的 X2 值

    或者您选择数据的方式是其他方式?
    谢谢

    • 杰森·布朗利 2019年2月28日 晚上2:33 #

      好问题,您不能将k折交叉验证用于时间序列。

      相反,您可以使用步进验证,更多信息请点击此处
      https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/

      • 安东尼·考拉 2019年11月26日 凌晨5:10 #

        尊敬的Jason博士,
        同样地,您可以将“更简单”的训练测试和分割用于时间序列吗?

        谢谢你,
        悉尼的Anthony

  23. 旺达纳 2019年3月6日 晚上9:18 #

    您的文章是最棒的。每当我遇到疑问时,machinelearningmastery都能为我解决。非常感谢 🙂

  24. 海尔迪 2019年3月7日 晚上7:51 #

    先生解释得很好,谢谢 :) 对于如何确定分段多项式/回归样条中的结数以及结的位置,我还有一些不清楚的地方。请问您能解释一下吗?

    • 杰森·布朗利 2019年3月8日 早上7:47 #

      抱歉,我没有关于“回归样条”的教程。

      • 海尔迪 2019年3月8日 晚上9:48 #

        谢谢您的回复,先生,为了选择最适合的多项式次数,如何应用K折交叉验证,请先生解释,提前感谢:)

        • 杰森·布朗利 2019年3月9日 早上6:27 #

          我建议对不同的模型配置进行网格搜索,这与k折交叉验证无关,尽管CV可以用于测试的每个配置。

  25. 拉希尔 2019年3月22日 早上7:01 #

    嗨,杰森,非常感谢您的教程。它为我澄清了很多事情,但是,我是这个领域的新手。我的问题是,我们对一个模型可以进行多少次CV?
    例如,对我们的模型重复进行100次10折CV是合理的吗?
    我非常感谢任何可以帮助我的提示。
    谢谢!

    • 杰森·布朗利 2019年3月22日 早上8:44 #

      我们重复CV过程是为了解释模型本身的方差,例如由于随机学习算法(如SGD)。

      通常重复几次就足够了,例如10次,不超过30次。

      • 拉希尔 2019年3月22日 晚上7:23 #

        非常感谢杰森!
        我仍然很困惑。
        当我们使用10折交叉验证时。这意味着我们随机将数据分成10个相等的子样本,然后我们保留一个子样本用于测试,其余的(9个子样本)用于训练。
        所以在这种情况下,我们只能获得10次不同的结果,因为只有10种不同的选项可以保留用于测试,而其他的用于训练。
        我的意思是,10次之后,数据用于训练和测试的方式将与之前的某个状态相同,对吗?!那么,重复这个过程超过10次有什么好处呢?
        请帮我解开这个困惑。谢谢!

        • 杰森·布朗利 2019年3月23日 早上9:19 #

          由于学习算法的随机性质,有些算法会在相同的数据集上产生不同的结果。随机梯度下降就是一个例子。

          这将给模型性能的估计带来额外的方差,可以通过重复评估更多次来抵消。

          • 拉希尔 2019年3月23日 晚上6:17 #

            非常感谢杰森!!

  26. 费德里科 2019年3月26日 晚上10:51 #

    嗨,Jason,
    一个快速问题,如果您决定从未使用过的实例中收集性能指标
    该模型通过基于训练-测试分割的评估方案。哪种
    基于折叠的评估方案更合适?为什么?

    • 杰森·布朗利 2019年3月27日 早上9:00 #

      如果您不确定要使用什么,默认应该选择10折交叉验证。

      • 费德里科 2019年3月28日 凌晨2:52 #

        为什么会这样?

        • 杰森·布朗利 2019年3月28日 早上8:20 #

          事实证明,它在估计模型性能的偏差和方差之间取得了平衡,作为默认值是有效的。

          这在几十年前就已经确立,并且经受住了时间的考验。

  27. itisha 2019年3月28日 下午6:36 #

    你好,先生,
    我想在我的训练数据上,以准确率分数的形式获得10折交叉验证的结果。
    我进行了网格搜索以找到分类器的超参数,并在网格搜索函数中使用了cv值=10。我通过网格搜索结果获得了优化的参数值以及最佳准确率分数。
    a) 网格搜索得到的准确率可以认为是10折交叉验证的结果吗?
    b) 如果不是,那么我应该使用cross_val_score()来获取10折的平均准确率吗?
    c) 此外,在将分类器传递给cross_val_score()时,我应该使用分类器的优化参数吗?

    • Jason Brownlee 2019年3月29日 上午8:28 #

      如果你愿意,可以报告交叉验证的分数。

      我更倾向于在保留数据集或交叉验证上进行独立的最终评估以确认结果。

      是的,你应该使用找到的最佳参数来配置最终分类器。

  28. Itisha 2019年3月29日 上午10:25 #

    好的,谢谢老师

  29. Itisha 2019年3月29日 上午10:35 #

    我有一个不相关的问题。

    假设分类器1是具有优化超参数的最终分类器,我将在数据集A上进行测试。分类器1在大小为20的特征向量上进行训练。

    现在我想在A上再次测试,但这次特征数量减少了,只是为了检查不同特征的影响。

    这样,我想展示在测试集A上使用在完整特征集20上训练的分类器和使用在减少特征集上训练的相同分类器的结果。

    那么,我应该对在减少特征集上训练的分类器使用相同的优化超参数吗?

    • Jason Brownlee 2019年3月29日 下午2:02 #

      好问题。

      我建议在比较中只改变一件事,例如只改变特征,并使用相同的数据和模型。

      或者,你可以改变一件事,即特征,然后对每个特征子集使用相同的“调优过程”来调优每个模型。

      两者都合理。

  30. Itisha 2019年3月29日 下午5:28 #

    好的,如果我选择第一种方法……这意味着测试数据应该相同,并且用于测试原始特征和减少特征的分类器也应该相同,并且使用相同的优化超参数。?

    我只有一个困惑
    假设分类器是SVM,c=10(通过在训练数据上进行网格搜索获得)。
    现在我在整个训练集上用大小为20的特征向量训练SVM,c=10,然后在测试集T上进行评估。

    现在我想在相同的测试集T上评估相同的SVM,但特征大小为15。

    那么这次我应该再次使用c=10和SVM,还是应该再次执行网格搜索以获得新的c值?

    • Jason Brownlee 2019年3月30日 上午6:24 #

      这是你的选择,只要你在比较的两件事之间保持方法上的一致性即可。

  31. Maria 2019年3月31日 上午8:21 #

    对于一个不平衡数据集,其中正类别占0.7,负类别占0.3。如何进行交叉验证,同时在训练集和测试集中都保留50%的正样本和50%的负样本?

    • Jason Brownlee 2019年3月31日 上午9:32 #

      也许可以使用分层交叉验证?

      • Keyvan 2021年2月12日 上午4:33 #

        嗨 Jason,我也有同样的问题。

        我想在测试模型之前进行模型选择,而且我的数据是不平衡的。我首先使用分层K折交叉验证来确保测试折叠中包含少数类别。然后,我执行模型选择,并选择具有最小交叉验证误差的模型。问题是测试折叠已经在模型选择中使用了,那么我如何在没有测试集的情况下在新的数据上测试模型呢?

        • Keyvan 2021年2月12日 上午5:36 #

          我能像下面这样,用嵌套交叉验证来解决我的问题吗?
          1. 使用3折交叉验证
          2. 执行超参数调优
          3. 根据验证折叠上的最小误差选择超参数
          4. 使用选定的超参数调整机器学习算法
          5. 使用分层10折交叉验证
          6. 将折外预测视为测试/未见数据

        • Jason Brownlee 2021年2月12日 上午5:51 #

          分层 K 折交叉验证的平均结果可用于比较和选择模型。

          也许我没理解问题所在?

  32. AVIJIT PRASAD DAS 2019年4月4日 上午8:05 #

    真的很有价值

  33. syed 2019年4月16日 下午4:37 #

    不错的教程!!!很喜欢!!
    你能给我提供K折交叉验证的Matlab代码吗?
    谢谢你

  34. rolf 2019年5月27日 下午11:30 #

    我不太明白你说的意思

    > 训练/测试分割:在一种极端情况下,k 可以设置为 1,以便创建一个单一的训练/测试分割来评估模型。

    ...如果 k=1,那么你没有将数据分成多个部分:只有一个部分。

    你能解释一下你的意思吗?另外,请注意 sklearn.model_selection.kfold 不接受 k=1 作为输入。

    • Jason Brownlee 2019年5月28日 上午8:15 #

      你说的对,k=2是我们能做的最小值。

      我已更新了这篇文章,谢谢!

  35. Sara 2019年6月11日 上午6:50 #

    “scikit-learn train_test_split” 在打乱和分割数据集时是否考虑特征和目标的值?

    谢谢你

  36. toy 2019年7月4日 下午12:59 #

    谢谢你Jason :) 我是你的忠实粉丝。祝好!

  37. RAVI 2019年7月6日 上午12:59 #

    Jason 先生,这个 K 折交叉验证教程对我帮助很大。非常感谢您!!!!!!!!!!!!!!!!!!

  38. Quentin 2019年7月11日 下午7:13 #

    你好,感谢你的介绍,

    我正在处理一个非常小的数据集(31个数据),有107个特征。我必须应用特征选择。为此我使用了XGBOOST、RFECV和其他技术。

    我有一个问题

    我是否应该先将数据集分成80%的训练集和20%的测试集,然后对训练部分应用k折交叉验证,并用剩下的20%进行验证?或者,在不进行任何分割的情况下直接进行k折交叉验证?

    • Jason Brownlee 2019年7月12日 上午8:33 #

      在K折交叉验证的每个折叠中执行特征选择可能是一个好主意——例如,测试选择特征的过程,而不是特定的特征集。

      • Quentin 2019年7月16日 下午4:49 #

        谢谢,但是如果我想证明一个特定的特征集仍然是最好的。我该怎么做?
        我必须重复 n 次 K 折交叉验证,使用一种选择技术和不同的随机种子。然后我将比较 n 次循环中选择的所有特征数组与分数(准确率或 F1)。
        其他技术也是如此?

        • Jason Brownlee 2019年7月17日 上午8:16 #

          听起来是个合理的方法。

          请记住,我们无法得知什么是最好的,只能收集证据来证明与我们测试的其他方法相比什么是好的。

  39. Shivani 2019年7月18日 下午6:52 #

    我一直在进行10折交叉验证。在预测标签(逻辑回归分类器)中,我得到了这样的结果
    0.32460216486734716
    -1.6753312636704334
    1.811621906115853
    0.19109397406265038
    -2.11867198332618
    -1.4679812760800461
    0.02600304205260273
    -2.0000670438930332
    我不知道如何处理负值和非二进制值。请帮忙。

  40. R.Aser 2019年8月5日 下午6:29 #

    你好,
    我有两个问题
    1. 我有一个数据集,我使用了k=5和10,但有时我发现R2、MAE和RMSE存在很大差异(即K=10时,R=0.8 – MAE=3.5 – RMSE=6.5;K=5时,R=0.62 – MAE=4.8 – RMSE=9.4)。这种差异的原因是什么?换句话说,如何选择正确的K以提供可靠的结果?
    我知道使用K=5和10可能会有差异,但不会太大。

    2. 如果数据集包含8个独立变量,其中四个是用于回归问题的二元变量(0/1),我如何使用交叉验证来确保每个折叠都包含0和每个二元变量?因为如果这样不发生,Rstudio会给我警告说结果具有误导性。

    提前感谢,
    R.Aser

    • Ramy 2019年8月6日 上午9:02 #

      你好 Jason,
      你需要我更详细地描述我的观点吗

      • Jason Brownlee 2019年8月6日 下午2:04 #

        好问题。

        选择一个好的K很难。如果有疑问,请使用10。如果你有时间,也许可以评估不同K值数据描述性统计,并找到一个统计显著性检验报告分布差异的点——这很粗糙,但可能是一个有用的开始。

        也许你可以使用分层交叉验证,它不仅关注目标,还关注输入变量?

        希望这能有所帮助。

  41. Ponraj 2019年8月6日 下午5:48 #

    你好 Jason,

    我将此帖子拆分为“背景”和“问题”部分。

    背景
    我正在使用LSTM执行二元分类任务。(0或1)
    数据大小 (205, 100, 4) [205个样本中,110个属于类别0,95个属于类别1]

    训练测试分割:(训练集:85% & 测试集:15%,随机种子 = 7)
    固定训练数据形状 = (174,100,6)
    固定测试数据 = (31,100,6)

    步骤1:– 模型训练
    我训练模型(没有随机种子权重初始化(例如没有numpy种子或tf种子))
    1.1) 模型结构图片链接:https://imgur.com/2IljyvE
    1.2) 绘制准确率和损失图(训练和验证)
    – 图片链接:https://imgur.com/IduKcUp
    – 没有过拟合
    1.3) 预测结果:使用训练模型:31个测试数据中有3个错误。
    (91%的正确预测)

    步骤2:– 多次运行
    使用for循环
    并训练模型5次以根据您的帖子查看模型的行为(https://machinelearning.org.cn/diagnose-overfitting-underfitting-lstm-models/

    2.1) for i in range(5) : # 用相同的模型结构运行5次
    – 绘制准确率和损失图(图片链接:https://imgur.com/WNH6m9F
    – 结果:它遵循一个模式(发现了模型的行为)

    步骤3:– K折交叉验证 (CV)
    执行K折交叉验证(折叠数 – 7)(随机种子 = 7)(合并训练+测试数据 = 原始数据(205,100,6))
    3.1) 图片链接:https://imgur.com/cZfR1wJ
    3.2) 有些折叠结果出现过拟合
    3.3) 每个折叠都计算了准确率值,平均准确率值为79.46% (± 5.60%)
    (我参考了您的帖子:https://machinelearning.org.cn/evaluate-performance-machine-learning-algorithms-python-using-resampling/

    仅关于交叉验证的问题
    1. 在交叉验证结果中,发现了更多过拟合的模型/图表,

    a) 我能从CV结果中理解到什么?超参数不正确?
    b) +/- 6% 的标准差是很大还是正常?
    c) 我如何将我训练的模型结果(步骤1)与CV结果(步骤3)关联起来?我理解它的工作原理,但我的预测准确率为90%,我可以使用初始训练模型作为最终模型吗?
    d) 我减小了LSTM单元的大小,并再次执行了K折交叉验证。
    图片链接:https://imgur.com/UsU3zso(过拟合模型较少)
    平均准确率和标准差:79% +/- 3.91
    根据标准差,我是否应该在模型中固定这个超参数?
    e) 我的朋友建议我使用LOOCV,但这会和K折CV有什么不同吗?

    • Jason Brownlee 2019年8月6日 上午6:45 #

      那里发生了太多事情,抱歉,我无法跟上或投入时间来弄清楚。

      你能把你的问题浓缩成一个简短的问题吗?

      • Ponraj 2019年8月6日 下午7:36 #

        我训练了我的LSTM二分类模型,并获得了90%的预测准确率。
        没有发生过拟合。(https://imgur.com/IduKcUp

        但是当我进行K折交叉验证(K = 7)时,我发现这7个折叠中出现了过拟合模型。
        我能从交叉验证模型的过拟合中理解到什么?(https://imgur.com/cZfR1wJ

        在CV结果中,我得到了79.5%的平均准确率和+/- 6%的标准差。
        如果我的平均准确率值应大于某个百分比,才被认为是表现良好的模型,并且选择的超参数是最好的,那么是否存在任何限制?

        我减小了LSTM单元的大小,并再次执行了K折交叉验证。
        结果:平均准确率和标准差:79% +/- 3.91
        https://imgur.com/UsU3zso – 较少过拟合的模型)
        由于我的标准差与之前的模型相比较低,我是否应该在模型中固定这个超参数?

        我的朋友建议我使用LOOCV,但这会和K折CV有什么不同吗?

        • Jason Brownlee 2019年8月7日 上午7:49 #

          实际上,K折交叉验证对于序列数据/LSTM来说是个坏主意,相反,你必须使用步进式验证。
          https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/

          也许K折交叉验证中使用的数据集更小,代表性不足,从而导致过拟合?

          模型性能总是相对的
          https://machinelearning.org.cn/faq/single-faq/how-to-know-if-a-model-has-good-performance

          如果资源允许,LOOCV听起来是个好主意。

          • Ponraj 2019年8月8日 下午9:05 #

            感谢您的回复。
            我理解你关于步进式验证的帖子。但我很困惑,它是否适用于我的数据集。(因为我正在进行分类)

            我的数据集概述:X.shape= (205,100,4) 和 Y.shape = (205,)

            在X中,每个样本/序列的形状为(100, 4),其中100行中的每一行对应100毫秒。(1个样本需要10秒)
            在210个样本中,110个样本属于类别0,95个样本属于类别1。

            模型结构:https://imgur.com/2IljyvE
            模型:https://imgur.com/tdfxf3l
            注意:在密集层周围使用了TimeDistributed封装器,以便我的模型对每个100毫秒进行训练,对应于每个样本/序列的相应类别。

            我的目标是尽早预测类别,如果我输入形状为(10,60,4)的测试数据——
            (10个样本,60个(6秒),4个特征)它属于类别0还是1。

            在这种情况下,我如何进行步进式验证

          • Jason Brownlee 2019年8月9日 上午8:12 #

            是的,这将是一个时间序列分类任务,可以使用步进式验证进行评估。

            我在这里给出了一些时间序列分类的例子,你可以作为起点
            https://machinelearning.org.cn/start-here/#deep_learning_time_series

  42. Marshal 2019年8月9日 上午3:39 #

    日安 Jason,

    感谢您的所有教程,它们非常清晰且有帮助。

    哪种计算R2的方法适合评估测试集?

    我之所以问,是因为R中的caret包默认R2 = cor(obs, pred)^2,但我认为1 – sum((obs – pred)^2) / sum((obs – mean)^2) 最合适。这两种方法在完整数据集上给出相同的结果,但当我将它们用于测试集时,我得到了不同的结果(cor()^2的R2更高)。

    我正在使用caret包对构建的预测线性模型进行交叉验证。我使用trainControl方法=repeatedcv和RMSE和Rsquared的summary默认值来调用train函数。当我使用caret进行交叉验证时,我获得了很高的R2,但当我手动创建折叠并测试它们时,R2值较低。

    任何见解或指导都将不胜感激。

    谢谢你

  43. SHAIKH MOHD FARAZ 2019年8月11日 下午5:01 #

    嗨 Jason

    K折验证的教程非常棒,清晰明了。

    我有一个疑问。假设我们正在 K'-NN 算法上实现 K 折交叉验证。
    由于我们将使用交叉验证数据集来确定 K' 的最佳值,然后使用测试数据集来确定模型的准确性,您认为我们应该如何分割数据集?请举例解释一下。

  44. Abishek Balaji 2019年9月7日 下午8:05 #

    嘿 Jason,这是一个很棒的教程,但我只有一个问题,你在这篇文章中这句话到底是什么意思。

    “同样重要的是,在模型拟合之前对数据进行的任何准备工作都应在交叉验证分配的训练数据集内进行,而不是在更广泛的数据集上进行。这也适用于任何超参数调优。”

  45. Ralph 2019年9月11日 下午11:24 #

    嗨,感谢您这篇关于k折验证实际实现的清晰帖子。顺便感谢您在其他帖子中的回答;)

    我有一个关于这个主题的普遍问题:似乎所有现有方法都采用训练集和测试集的连续部分,而不是混合两者。

    更清楚地举个例子,假设我们有1000个样本,我们将其分成0:799作为训练集,800:999作为测试集。

    难道混合索引会更好吗?例如,[0,5,10,..,995]作为测试集,所有其他索引作为训练集。在这种情况下,例如,对于按时间顺序排列的数据,这样更有意义,因为没有样本偏向特定时间。

    • Jason Brownlee 2019年9月12日 上午5:17 #

      很好的问题!

      通常我们先打乱数据,然后将其分割。效果是一样的。

  46. Meriem 2019年9月19日 下午11:42 #

    你好,
    交叉验证后如何获取每个模型(1,2,3)的准确率?

    • Jason Brownlee 2019年9月20日 上午5:45 #

      你可以迭代每个折叠,对于每个折叠,在训练集上拟合模型,并在测试集上进行预测,然后计算预测的分数——然后打印该分数。

  47. krishna 2019年11月27日 上午5:02 #

    先生,您能举一个支持向量机分类器的工作示例吗?
    谢谢

  48. A 2019年11月28日 下午11:17 #

    嗨,Jason,

    我拥有作物生长、气候数据集,想建立机器学习预测模型来预测产量。我想使用回归,因为我希望知道具体数值,而不是进行分类。
    在此,我想请教您如何为产量创建标签?是否有任何链接或建议?

    完成标签创建后,我需要遵循哪些步骤来构建回归模型?任何链接或建议都将非常有帮助。

    此致
    Amora

  49. Anthony The Koala 2019年12月2日 上午3:08 #

    尊敬的Jason博士,
    我尝试了一个更大的数据集,大小为100,有10个折叠。
    改编自您上面的示例

    总而言之,原始数据大小是100。
    有10个折叠,每个测试数组中有10个元素。

    我的问题
    * 我如何改变训练集和测试集的长度?例如,我想要10个测试折叠,但训练集长度为0.66666,测试集长度为0.3333。

    谢谢你,
    悉尼的Anthony

    • Jason Brownlee 2019年12月2日 上午6:06 #

      它不是那样运作的。

      k折交叉验证要求您将数据集分成k个大小相等或大致相等的部分。

      • Anthony The Koala 2019年12月2日 上午7:47 #

        尊敬的Jason博士,
        当您说“……k折交叉验证要求您将数据集分成k个大小相等或大致相等的部分……”时,这意味着

        * 运用小学数学知识,您会发现折叠数必须是数据点数的因数。因此,如果您有63个数据点,折叠数必须是3、7、9、21。同样,如果您有100个数据点,折叠数必须是2、4、5、10、20、25、50。

        * 如果数据点数量是素数怎么办?例如71个数据点。

        * 因此,测试点的数量 = 数据点数量 / 折叠数量。

        * 由此可知,训练点的数量 = 数据点总数 - 测试点数量。

        谢谢你
        悉尼的Anthony

        • Anthony The Koala 2019年12月2日 上午8:45 #

          尊敬的Jason博士,
          我用素数和非素数做了一个实验,结果表明,如果一个数不是数据点数的因数,那么测试点的数量就是。

          复制的代码改编自上面的演示代码

          结论
          我做了一些实验,数据点数为素数和非素数,其中测试数据点数为

          因此,训练数据点数为

          谢谢你,
          悉尼的Anthony

        • Jason Brownlee 2019年12月2日 下午1:54 #

          是的,它不一定完全相等,只要尽可能相等即可,即一个折叠可能多一个或少一个示例。

  50. Kelvin 2019年12月11日 上午12:33 #

    嗨,Jason,

    如果不需要进行模型选择或超参数调整,那是否意味着不需要应用交叉验证?

    提前感谢。

    此致,
    凯尔文

    • Jason Brownlee 2019年12月11日 上午7:00 #

      是的,为了估计性能如何随数据变化,例如模型的方差。

  51. Mike Kelly 2019年12月14日 上午2:39 #

    对于二元分类器模型,当我们在训练期间希望类别平衡时,我们是否应该为类中的每个标签维护单独的 KFold() 对象以确保每个折叠都平衡,还是仅平衡整个数据集并让折叠随机采样就足够了?

  52. Yan 2020年1月8日 上午6:25 #

    嗨,Jason,

    不错的介绍!我使用k折交叉验证已经很长时间了,甚至在科学出版物中也用过,但我仍然觉得对它的统计显著性测试没有很好的理解。

    首先,我们应该打乱并完成整个过程多少次,即多少次“重复”才足够?假设我们有100个样本。对于10折交叉验证,50次或200次重复就足够了吗?

    其次,假设我们在200次重复后得到p=84%的正确率。我如何判断这个数字是否“统计显著”?我通常使用置信区间测试来得到CI = +-1.960*sqrt( p(1-p)/n )。我从不确定这里是否使用了正确的n,我将其设置为样本数(即100),而不是重复次数。

    我看到很多关于“比较两个k折模型”的在线资料,但没有关于单个模型测试的资料。

    非常感谢!

  53. Priyash 2020年2月1日 上午10:54 #

    嗨,Jason,

    “同样重要的是,在模型拟合之前对数据进行的任何准备工作都应在循环内的 CV 分配的训练数据集上进行,而不是在更广泛的数据集上进行。这同样适用于任何超参数调整。未能在此循环内执行这些操作可能会导致数据泄露和对模型技能的乐观估计。”

    这句话特别指出,任何数据准备,比如说数据清洗、特征工程和其他任务都不应在交叉验证之前完成,而应在交叉验证内部完成。

    您能花点时间解释一下吗?

  54. najeh 2020年2月10日 上午8:14 #

    KFold 和 StratifiedKFold 有什么用处?

    • Jason Brownlee 2020年2月10日 下午1:20 #

      更快、更简单、适用于回归而非回归。

  55. Marc 2020年2月12日 上午3:44 #

    嗨,Jason,

    感谢您的所有教程,它们非常清晰且有帮助。

    是先将所有数据分割成训练集和测试集,然后再只对训练数据进行交叉验证更有意义吗?
    最好的方法是什么?对所有数据进行交叉验证还是只对训练数据进行交叉验证?

  56. Kollol 2020年2月24日 上午2:45 #

    嗨,Jason,

    非常感谢您的精确解释。

    我有一个问题。在多标签分类的情况下,我们如何进行交叉验证?

    谢谢

  57. Yong 2020年3月1日 下午1:15 #

    如果数据集不平衡,在使用10折交叉验证时应如何处理?

    • Jason Brownlee 2020年3月2日 上午6:14 #

      使用分层交叉验证。

      如果您在训练集上使用数据采样,请通过管道在 CV 的每个折叠内使用它。

  58. lopamudra das 2020年3月31日 下午1:45 #

    您好,10折交叉验证是否适用于用于癌症分析的DNA序列数据?

  59. Joyce 2020年4月20日 上午6:32 #

    我能问一下为什么标准差在评估k折交叉验证时是一个重要因素吗?

  60. Tarik 2020年4月21日 上午12:33 #

    请问,我有一个关于交叉验证和GridSearchCV的问题。(这个问题Itisha在2019年3月28日下午6:36已经问过,但我没有理解你的回答)
    我有一个小型数据集,无法将其划分为测试/验证/训练集。我决定进行交叉验证以估计基于SVM分类器的模型性能。我的问题是,在这个交叉验证过程中应该使用哪些超参数?我是否可以执行GridSearchCV并报告最佳交叉验证性能(具有最佳超参数的CV)的结果作为最终的交叉验证结果?

    • Jason Brownlee 2020年4月21日 上午5:58 #

      是的,您可以在交叉验证中使用网格搜索,这称为嵌套交叉验证,它允许您评估模型的调优版本。

      • Tarik 2020年4月21日 上午7:10 #

        非常感谢您的回答,我现在明白了。

  61. Anand 2020年5月9日 下午7:25 #

    感谢这篇文章!太棒了,但我脑中仍有一个问题,我想澄清我的困惑。
    如果我在训练数据集上使用10折交叉验证,那么该训练数据集被分成10个集合,所以现在我有10次迭代,每次迭代使用9折数据训练模型,1折数据进行测试,对吗?除此之外,我们还有在训练模型之前分割出来的测试数据用于测试,对吗?

    如果我上面的疑问是正确的,那么,如果我们对整个数据集应用k折交叉验证,那对我们是利大于弊还是弊大于利呢?只是一个问题!

    谢谢!

    • Jason Brownlee 2020年5月10日 上午6:07 #

      不客气!

      不,通常我们会使用交叉验证或训练-测试集划分。而不是两者都用。是的,如果数据集适中/较小,交叉验证用于整个数据集。

      如果数据量很大,我们可能会首先将其划分为训练/测试集,然后在训练集上使用交叉验证,并对所选模型进行调优或在测试集上进行最终验证。

      • K S 2020年5月23日 下午7:24 #

        只有一个澄清——在交叉验证中,如上所述,一个数据集(训练集或测试集)被分成10个折叠(例如)。然后使用9个折叠进行训练,1个折叠进行测试,这部分数据是之前给定数据集的一部分。这个过程重复进行,每个10个折叠都会成为测试集的一部分一次。因此,根据上述理解,只使用一个作为K折输入的数据集,而不是两个。请澄清,因为在上面的回答中它指定两个集合(训练集和测试集)都使用了。

      • Yulia 2021年12月21日 下午6:20 #

        亲爱的杰森,非常感谢您的教程!
        您能澄清一下困惑吗?

        https://machinelearning.org.cn/training-validation-test-split-and-cross-validation-done-right/
        这篇文章介绍了这种方法:首先将数据分为训练集/测试集,然后在训练集上进行交叉验证并选择模型,之后在整个训练集上训练模型,最后在测试集上评估模型。

        从这里的评论来看,这种方法似乎只适用于“大量数据”的情况?如果不是“大量数据”的情况,那么:对整个数据集进行交叉验证,选择模型,然后就完成了?

  62. Vidhan 2020年5月19日 下午1:58 #

    你好,杰森,

    这是一篇非常好的文章。我对k折交叉验证有一个疑问。请帮助我解决。我对k折交叉验证的使用感到困惑。它是用来比较两种不同的算法模型(如SVM和随机森林),还是用来比较相同算法但超参数不同的模型?

  63. K S 2020年5月23日 下午7:13 #

    这是一篇非常有用的文章,也是我读过的关于交叉验证最好的文章之一。我对交叉验证的实际工作方式有疑问,需要您的帮助来澄清。在10折交叉验证中,我们需要从一个参数的3个不同值中进行选择(请注意,参数是一个,但可能有3个值需要选择),在这种情况下,10折交叉验证如何工作……有多少模型被训练和评估?是10个模型,还是3个模型,还是30个模型?

    其次,我怀疑这些模型是否只在训练集的一部分上进行训练和评估?对吗?

    请您帮助澄清这两个部分。

    • Jason Brownlee 2020年5月24日 上午6:05 #

      谢谢。

      在这种情况下,我们对每个配置使用CV,并比较每次运行的均值。是的,3 * 10折CV是30个模型。所有这些模型在最后都会被丢弃。

      每个模型都在训练折叠上进行训练,并在测试折叠上进行测试,因为折叠是枚举的。

      • K S 2020年5月24日 下午3:31 #

        非常感谢您。您是天才,我们可以从您那里学到很多。这里再澄清一下——我只想分享一下,我上面问题中提到的参数只有一个(比如说cp参数),它可能有0.1、0.2、0.3这三个值,然后我们需要使用交叉验证来选择cp的最佳可能值。那么,在这种情况下,模型的数量不会是10个吗?我理解的是,在10折交叉验证的每次迭代中,我们将使用9折数据构建模型,然后对所有3个可能的cp值(0.1、0.2和0.3)在第10折(在该迭代中未用于训练的数据折)上验证这个模型。所以,每次迭代创建的模型将是一个,但会为每个可能的cp值(0.1、0.2和0.3)测试3次。还是每次迭代会有3个模型,因此10折交叉验证总共会产生30个模型。请求您帮助澄清。

        那么,为了“最佳描述在选择3个不同值(即0.1、0.2或0.3)的cp参数时10折交叉验证是如何工作的?”请使用以下语句

        “X”个模型在训练集的子集上创建并由“Y”评估

        X和Y的值会是多少?

        X是多少 – 10还是30
        Y是多少 – “测试集”还是“训练集的一部分”

        这里的假设是,在交叉验证之前,数据被分割成训练数据和测试数据,交叉验证是在训练集上进行的。所以,考虑到这个假设,请帮助说明上面语句中Y的值会是多少。

        • Jason Brownlee 2020年5月25日上午5:44 #

          每个配置都会被评估 (3),并且每个配置的评估都使用交叉验证 (10)。每个配置的评估都是一个独立的过程。

          • K S 2020年5月25日上午5:59 #

            谢谢,但您能帮我澄清一下吗?我的课程中提出的问题是,在给定此场景(如上所述)的情况下,将生成多少个模型?以及这些模型将在何处进行评估——它们将作为交叉验证的一部分在训练集的一部分还是测试集上进行评估?问题陈述还确认在启动交叉验证之前单独划分了测试集,并且交叉验证是在训练集上运行的。因此,考虑到这一点,请帮助澄清。

          • Jason Brownlee 2020年5月25日下午1:22 #

            也许直接和你的老师谈谈你的家庭作业。毕竟你已经付钱给他们了……

          • K S 2020年5月25日上午6:11 #

            进一步补充,我的理解是

            “在训练集的子集上创建了30个模型,并在训练集的一部分上进行了评估” 这种理解是否正确,或者会是“在训练集的子集上创建了30个模型,并在测试集上进行了评估”,其中测试集是交叉验证开始前单独划分的集合,交叉验证在训练集上进行?

  64. Cuong 2020年5月28日上午12:23 #

    嗨,Jason Brownlee,
    我将数据分为80%用于训练,20%用于测试(未见过的数据)。然后,我使用训练数据进行训练,并比较机器学习模型,并通过训练模型使用K折交叉验证。最后,我使用选定的模型来检查测试数据(未见过的数据,占数据总量的20%)的准确性。
    您能解释一下我做得对还是错吗?

    谢谢你。

    X. C Nguyen

    • Jason Brownlee 2020年5月28日上午6:16 #

      这不是对与错的问题,而是你选择了一种不同的方法。

      如果它对你有效,那就去做吧。

  65. Rouzbeh Talebi 2020年6月5日上午7:52 #

    你好 Jason,
    我有点困惑。
    我将数据分为训练集和测试集。是否可以通过交叉验证训练模型,然后将模型应用于测试数据?
    我在互联网上看到的所有内容都针对整个数据集。
    例子
    cross_val_score (model, X, y, cv=4, scoring=”neg_mean_squared_error”)
    或者
    cross_val_predict (model, X, y, cv=4, scoring=”neg_mean_squared_error”)

    但我希望从训练数据集构建模型,然后将其应用于测试数据集。我不知道如何在 Python 中编写代码
    我只想要
    CV = ?(model, X_train, y_train, cv=4, scoring=”neg_mean_squared_error”)
    然后
    prediction = CV.predict(X_test)

    这可能吗?如果可能,我应该写什么代替“?”?或者有没有其他方法可以达到我的目标?
    如果您能帮助我,我将不胜感激。

  66. Nilarun Mukherjee 2020年6月20日下午6:18 #

    我想知道两件事
    1. 折叠之间权重是否保留(在之前的折叠中更新),还是权重在每个折叠中随机初始化?
    2. 如果我想保存某个折叠的最佳模型,该怎么办?

    • Jason Brownlee 2020年6月21日上午6:20 #

      每次折叠我们都训练一个全新的模型,并在折叠结束时丢弃该模型。

      无需保存最佳模型,因为我们只评估建模流程的性能。一旦我们知道它的表现如何,我们就可以将其与其他模型/流程进行比较,选择一个,然后在所有可用数据上拟合它并开始使用它。

  67. RAKESH KUMAR 2020年7月6日上午5:11 #

    由于有7个经验性能测量模型,K折交叉验证是否可以应用于选择最佳性能测量模型。如果可以,那么如何应用?

    • Jason Brownlee 2020年7月6日上午6:40 #

      我们无法知道最佳模型或如何为给定的预测建模问题选择它。

      我们能做的最好的是使用稳健的方法,并尝试在有限的时间内以可靠的方式发现表现最佳的模型。

  68. RAKESH KUMAR 2020年7月13日上午7:07 #

    尊敬的先生,我想知道,如果我们有三个绩效衡量模型,例如——平衡计分卡、关键绩效指标(KPI)模型和能力成熟度模型(CMM),那么K折交叉验证是否可以用于在这些模型中进行选择?如果可以,那么如何进行?请在这方面指导我。

    • Jason Brownlee 2020年7月13日下午1:34 #

      我建议选择一个指标并使用它来选择模型。

      • RAKESH KUMAR 2020年7月31日上午5:17 #

        尊敬的先生,

        请简单介绍一下我该如何进行。

  69. Adnan Bin Amanat Ali 2020年7月14日下午4:12 #

    分层K折交叉验证有助于处理不平衡数据吗?

  70. gio 2020年7月21日上午1:57 #

    嘿,文章很有趣。

    我想问您是否认为K折交叉验证可用于A/B测试。

    假设我有一个80/20的A/B测试,我可以将80分成4个随机的20,然后将第5个数据集作为这4个数据集的平均值,并与我的变体进行比较吗?

    这种方法有什么问题吗?

    谢谢你。

    • Jason Brownlee 2020年7月21日上午6:07 #

      不,它们是针对不同问题的不同方法。

      交叉验证(CV)评估模型在对训练期间未见过的数据进行预测时的技能。

      A/B测试通过采样来估计二项式或多项式概率分布。

  71. Gamze 2020年7月27日上午6:30 #

    亲爱的 Jason,

    我进行了手动5折交叉验证,因为我的方法不同。因此,每个折叠都有单独的R平方值。我只想问一下,我是否可以取每个折叠的R平方值的平均值。

    • Jason Brownlee 2020年7月27日下午1:02 #

      是的。

      • Gamze 2020年7月27日下午1:13 #

        非常感谢您的回复。

        但是,我无法向自己解释这一点。我搜索过,有很多困惑。据说总体R2或RMSE不等于折叠结果的平均值。

  72. sajad 2020年7月28日上午7:20 #

    你好,

    感谢您的文章。

    我在浅水中有一个激光雷达测深数据集。我想将交叉验证用于我的模型。

    请逐步指导我。

    谢谢。

    • Jason Brownlee 2020年7月28日上午8:35 #

      也许您可以使用教程中的代码作为起点,并根据您的数据进行调整。

  73. Josseline Perdomo 2020年7月28日下午5:20 #

    你好杰森!首先,感谢您的解释,它非常有帮助,尤其是对于像我这样的新手。:)。

    我正在处理一个包含900个样本的数据集,我想应用10折交叉验证,但我不知道这是否只是一种用于训练和验证拆分的策略,或者我应该如何处理3个拆分?我知道在一篇论文中,结果应该在测试集上报告,我正在考虑只对训练和验证应用K折,并使用常规的hold out来获取测试拆分。您能给我一些关于在论文中使用这种K折CV方法的最佳实践的建议吗?

    谢谢!

    • Jason Brownlee 2020年7月29日上午5:48 #

      使用10个拆分并报告在每个测试集上计算的性能指标的均值和标准差是一种好习惯。

  74. Balaji Sundararaman 2020年7月31日下午10:32 #

    嗨,Jason,
    感谢您的教程。当我尝试您教程中的代码时,我使用了以下代码

    data = [0.1,0.2,0.3,0.4,0.5,0.6]
    kfold = KFold(n_splits=3, shuffle= True, random_state= 1)

    for trn_idx, tst_idx in kfold.split(data)
    print(‘Training Index : {}, Test Index : {}’.format(trn_idx,tst_idx))

    现在,我如何使用trn_idx和tst.idx来分割原始数据?

    当我尝试
    train_data = data[trn_idx]
    test_data = data[tst_idx]

    我收到以下错误

    —————————————————————————
    TypeError Traceback (most recent call last)
    in
    —-> 1 train_data = data[trn_idx]
    2 test_data = data[tst_idx]

    TypeError: only integer scalar arrays can be converted to a scalar index

  75. Eric La Rosa 2020年8月8日上午12:04 #

    杰森 – 您在机器学习领域发布了一系列撰写精良、易于理解的文章,我发现它们非常有用。感谢您的出色工作……

    – 埃里克

  76. Terrell 2020年8月9日下午12:59 #

    大家好,看完这篇精彩的文章后,我也很高兴在这里和朋友们分享我的经验。
    很高兴在这里和朋友们分享我的经验。

  77. Pedro 2020年8月10日下午1:38 #

    感谢您的内容。

    K折交叉验证结合GridSearchCV是否取代了传统模型在训练模型时的model.fit()?以及如何正确执行GridSearchCV?我的意思是,如果我想对batch_size+neurons+learning_rate+dropout_rates进行GridSearch,我应该同时将它们混合在一起吗?

    • Jason Brownlee 2020年8月11日上午6:26 #

      交叉验证仅用于评估模型的性能。

      您可以将“网格搜索”作为模型使用,在这种情况下,它将自动为您找到最佳配置。

      是的,您可以一次调整多个超参数,但这可能会非常慢。

      • MS 2020年8月14日上午2:51 #

        假设我根据准确性(客户需求)评估我的结果。在比较我的CV准确性和训练集准确性后,我发现我的模型过拟合了。我执行了Randomsearch CV并获得了最佳超参数。使用这些最佳超参数,训练准确性下降,但新的CV准确性提高很少(2%)。我的问题是我是否能够解决过拟合问题?另一个问题是,我选择的最佳超参数是通过CV(Randomsearch CV)过程选择的。当我在训练数据上使用它们时,它们是否有效?

        • Jason Brownlee 2020年8月14日上午6:10 #

          在这种情况下,您可以通过使用稳健的测试工具,并根据样本外预测技能的平均值来选择最佳模型,从而克服过拟合。

          不要根据训练数据集上的技能选择模型或模型超参数,这不是项目的目标。

          • MS 2020年8月14日下午7:00 #

            那么我应该基于什么来选择模型或模型超参数呢?对于调整了超参数的学习器,其评估标准应该是什么?

          • Jason Brownlee 2020年8月15日上午6:20 #

            K折交叉验证允许您在用于对新数据进行预测时评估模型/配置性能。

            根据K折交叉验证的平均技能选择模型,理想情况下,对于分类,选择重复+分层K折交叉验证;对于回归,选择重复K折交叉验证;对于超参数调优,选择嵌套/双重K折交叉验证。

          • MS 2020年8月14日下午7:05 #

            我不能使用测试集,因为我仍然不确定我的学习器是否已经解决了过拟合问题。

          • Jason Brownlee 2020年8月15日上午6:21 #

            对抗过拟合只是对增量学习算法(如神经网络和提升集成)来说是一个实际问题。

          • MS 2020年8月16日上午12:34 #

            谢谢你,Jason。

          • Jason Brownlee 2020年8月16日上午5:53 #

            不客气。

  78. Sakorpio 2020年8月15日上午5:56 #

    假设我的数据集中有1000张图片,我的训练测试分割是80/10,我选择k=10,它将如何执行10折?
    它的数据会重复在折叠中吗?

    • Jason Brownlee 2020年8月15日上午6:37 #

      您只能使用训练/测试或者交叉验证,不能同时使用两者。

      数据不会在折叠中重复。

  79. toufik 2020年8月25日下午7:22 #

    谢谢你,杰森,谢谢这篇文章,用k-fold=5的数据集迭代100次是可能的吗?

  80. khairi 2020年10月29日下午11:34 #

    感谢您的解释。但是,我可以问一些问题吗?

    我使用了K折交叉验证的一些样本结果中的准确率分数。
    例如,我使用n_split = 5,然后使用每个样本找出预测值并计算其准确率。

    从这个准确率值中,我得到了一个不太好的样本。我应该如何处理这些样本数据?

    • Jason Brownlee 2020年10月30日上午6:52 #

      抱歉,我不明白。也许您可以重新措辞您的问题?

  81. Sakura 2020年10月30日下午4:42 #

    你好,我不确定这是否是提问的最佳页面,但如果我有一个n个样本集和一个k折叠,我们正在训练多少个分类器?

    • Jason Brownlee 2020年10月31日上午6:46 #

      它将训练k个分类器。

      在根据结果的平均值估计模型性能后,所有分类器都将被丢弃。

  82. Matthew 2020年10月31日上午5:43 #

    感谢您出色的教程,杰森。我有一个问题。

    执行交叉验证时,将数据集的一部分作为测试数据集以在以后评估模型性能是否重要,还是仅获得交叉验证过程中获得的模型技能分数的均值和方差就足够了?

    再次感谢您的文章。

  83. rakesh 2020年11月7日下午6:10 #

    先生,我有1000个数据,我将其分成80%(训练数据集)和20%(测试数据集)。然后我将使用训练数据集执行10折验证,其中它将内部进一步将训练数据集分成10%(来自1000个的8%)验证数据和90%(来自1000个的72%)训练数据,并旋转每个折叠,并根据生成的准确性选择我的模型(模型选择)。一旦选择了模型,我将使用保留的20%测试数据(来自1000个的20%)对其进行测试。

    这种方法正确吗?

    • Jason Brownlee 2020年11月8日上午6:39 #

      您可以随意评估模型,只要您相信结果即可。

  84. Jay 2020年11月18日上午8:17 #

    嘿,我看到很多网站都提到k=n比k=10或任何其他k值有更高的方差,您能对此进行解释吗?

  85. Jeremy Moss 2020年11月24日上午6:57 #

    您好,感谢本教程。我知道我来晚了,但我很难理解交叉验证给出的分数。对于在我的数据集上运行的某个模型,我得到以下分数
    [0.93625769, 0.89561599, 1.07315671, 0.69597903, 0.62485697, 1.67434609, 1.3102791, 1.42337181, 0.80694321, 1.15642967]

    深度为2时的平均得分:1.0597236282939932
    平均绝对误差:0.4903895091309324

    我只想知道,我如何判断这个分数是好是坏?

    再次感谢。

  86. Ahmet SOLAK 2021年1月28日下午7:06 #

    嗨,Jason,
    首先,感谢您的这篇帖子。我有一个问题。
    当模型训练完成后,是使用最后一个模型(例如,训练了1000个epoch,使用第1000个epoch的模型)来测试图像,还是使用最好的模型(例如,训练了1000个epoch,但最好的模型出现在第978个epoch)来测试图像?

    • Jason Brownlee 2021年1月29日 上午6:01 #

      不客气。

      不,模型在训练折叠上拟合(所有epoch),并在保留折叠上进行测试,然后重复,让每个折叠都作为保留折叠使用。

      • Ahmet SOLAK 2021年1月30日 晚上11:51 #

        我想你误解我了。
        假设我使用5折交叉验证训练模型,每个折叠模型训练1000个epoch。对于每个折叠,保存最好的模型(例如;根据最小损失),最好的模型出现在第978个epoch,而不是第1000个epoch。当第一个折叠训练完成后,使用第一个折叠的测试图像评估模型。此时,测试阶段是使用第1000个epoch的模型(最后一个模型)还是第978个epoch的模型(最好的模型)?

        • Jason Brownlee 2021年1月31日 上午5:35 #

          如果你在交叉验证中使用提前停止,那么是的,每个折叠的性能将在提前停止停止训练或保存最佳模型时计算。

  87. Ahmet SOLAK 2021年1月30日 晚上11:55 #

    我还有一个额外的问题。当我进行10折交叉验证时,它在第6或第7折时中断。当我更改epoch或批量大小时,它会继续。这是由于资源不足(GPU、CPU等)还是其他原因?

    • Jason Brownlee 2021年1月31日 上午5:35 #

      这听起来是你的机器特有的问题。也许你可以调试原因。

  88. Shahbaz 2021年1月31日 凌晨12:20 #

    这是什么意思……请解释一下
    重要的是,数据样本中的每个观测值都被分配到一个单独的组中,并且在该过程的持续时间内保持在该组中。这意味着每个样本都有机会在保留集中使用 1 次,并用于训练模型 k-1 次。

    • Jason Brownlee 2021年1月31日 上午5:37 #

      这意味着每一行数据都属于一个折叠。算法对数据的折叠而不是数据的行进行操作。

  89. Kimia 2021年2月17日 凌晨3:59 #

    嗨,Jason,

    谢谢!我有一个问题。在用于训练模型的数据集上进行k折交叉验证是否可行?

    一些背景:我正在使用Cox回归模型,我使用整个数据集来训练模型,现在我想在该数据集上使用k折交叉验证来检查模型的技能……这可以吗?还是我应该有一个单独的未见测试数据?

    • Jason Brownlee 2021年2月17日 上午5:31 #

      不,在k折交叉验证中,模型在训练折叠上进行拟合,并在保留折叠上进行评估,重复k次用于不同的折叠。

  90. nd 2021年2月25日 凌晨3:36 #

    在k折交叉验证中,找到每个模型在测试数据集上的损失后,如何找到模型的损失、标准差和准确性?

    • Jason Brownlee 2021年2月25日 上午5:36 #

      抱歉,我听不懂你的问题,你能重述或详细说明一下吗?

  91. nd 2021年2月25日 上午7:53 #

    我在k折交叉验证中得到了不同模型的不同损失。我想知道如何从中找到最终损失和标准差值以及准确性?

  92. Bert 2021年2月28日 晚上11:06 #

    在学习了多层感知机的k折交叉验证3天后,我发现我找不到关于以下问题的任何答案

    我有k个不同的学习集。设j为学习集的编号,其中第j个折叠是验证集。

    我是否只关注学习集1,通过大量迭代和epoch计算所有最终权重,然后检查网络在折叠1上的验证准确性,然后对所有学习集做同样的操作,得到k个准确性值?
    如果是这样,为什么我要平均所有这些具有**不同权重**的准确性值呢?对于每个学习集,我在所有计算的epoch结束时得到一个不同的多层感知机。
    那么,我最终应该使用哪些权重呢???是学习集1或k建立的权重,还是平均值???

    • Jason Brownlee 2021年3月1日 上午5:38 #

      好问题。

      是的,k个折叠中的每一个都轮流用作测试集,而所有其他折叠都用作训练集。如果需要进行调优或其他操作,训练集可以进一步分为训练集和验证集。

      模型技能以所有测试集上的平均性能报告。

      一旦你得到一个估计,所有模型都会被丢弃。你将所有数据拟合到一个最终模型上,并开始对新数据进行预测。

  93. Danny 2021年3月5日 上午10:23 #

    我不明白这句话:“k的选择通常是5或10,但没有正式的规则。随着k变大,训练集和重采样子集之间的尺寸差异变小。随着这种差异减小,技术的偏差也变小。”你能解释一下“重采样子集”是什么意思吗?它们是折叠吗?

    • Jason Brownlee 2021年3月5日 下午1:35 #

      这意味着数据被分割后。例如,在给定的分割中,用于训练模型和测试模型的实际行。

  94. Danny 2021年3月5日 上午10:27 #

    事实上,差异不是越来越大吗?

    • Jason Brownlee 2021年3月5日 下午1:36 #

      不,它指的是你拥有的所有行与训练模型所用行的数量。

      如果k=n-1(除一行外的所有数据),那么训练集与整个数据集之间的差异就是1。

  95. Mariana 2021年3月8日 凌晨4:03 #

    我没有问题!我只是想感谢您总结了这么多重要主题!!!

  96. Alessandra 2021年4月6日 晚上9:13 #

    谢谢您的信息……在K折交叉验证的情况下,我该如何处理ROC分析呢?我应该每次都计算曲线,然后最后平均K个结果吗?
    谢谢!

    • Jason Brownlee 2021年4月7日 上午5:09 #

      通常你不会这样做,你会使用训练/测试分割来估计ROC曲线。

  97. Shahbaz Khan 2021年5月4日 下午4:34 #

    你好,k折准确率是什么?它是一样的吗?

    • Jason Brownlee 2021年5月5日 上午6:08 #

      也许它是通过k折交叉验证计算出的平均准确率。

  98. skyler 2021年5月21日 凌晨12:57 #

    你好,
    非常感谢这篇好文章。我正在从事一个SED项目,我正在使用DCASE 2017 Task 3数据集进行多声部SED。数据集分为两个阶段,即开发和评估。在开发数据集中,有现成的4折训练和评估数据。在训练折叠中,每个折叠大约有15个片段,在评估中,每个折叠有5个片段。但是,我不确定这些评估片段是否应该用作验证数据,或者我是否应该从训练数据中获取验证数据。请指导我,如果我从训练数据折叠中获取验证数据(例如10%),如何将评估数据折叠用作测试数据折叠。

    • Jason Brownlee 2021年5月21日 上午6:02 #

      我不熟悉那个数据集,也许你可以和提供它的利益相关者讨论一下数据。

  99. Maha 2021年7月30日 上午8:17 #


    是否有好的参考文献可引用交叉验证?

    • Jason Brownlee 2021年7月31日 上午5:33 #

      手头不确定,也许可以查一下scholar.google.com上的第一篇论文。

  100. Sumayya 2021年8月29日 凌晨5:03 #

    你好,谢谢你的详细解释!我有一个问题

    当我们使用k折交叉验证将数据分成训练集和测试集时,如果我们将其与接受模型的gridSearch一起使用,我们会执行gridSearch.fit(X_train, y_train)。k折交叉验证的测试部分是否用于拟合模型,或者它们是否用于我们执行.predict()时?
    我猜所有k折数据(训练和测试)都用于拟合数据,对吗?

    • Adrian Tam
      Adrian Tam 2021年8月29日 中午12:30 #

      k折交叉验证总是保留一个折叠。除非你编写代码这样做,否则它们不会用于predict()。但是保留的集合将在训练期间用于验证。

  101. ali 2021年9月25日 凌晨2:39 #

    你需要根据Iris数据集中提供的萼片和花瓣特征,使用KNN对Iris花进行分类。
    每个类别有50个样本。将数据按80%-20%的比例分成训练
    —每个类别的测试样本,进行5折交叉验证。
    尝试不同的K值(例如1、3、5、7——)和不同的距离(L1和L2)。
    报告哪个K值和距离度量(L1/L2)在“准确性”方面给出最佳结果

    参考文献
    https://machinelearning.org.cn/k-fold-cross-validation/
    https://scikit-learn.cn/stable/modules/cross_validation.html

    如何解决?

  102. Alexandre 2021年11月29日 晚上6:50 #

    嗨,Jason,

    你在这里提到“交叉验证是一种重采样过程,用于评估有限数据样本上的机器学习模型”

    我想知道这个数据样本必须有多大/多小才能拒绝或接受k折交叉验证这样的方法?

    谢谢

    • Adrian Tam
      Adrian Tam 2021年12月2日 凌晨12:30 #

      信不信由你——回答这个问题可能需要很多页。实际上,我希望每个训练集的数据量都足够,以便训练模型,并足以说明测试结果是可靠的。例如,决策树可能几百个数据点就足够了。但要获得严谨的答案,你需要考虑置信区间、t检验等。

  103. Barney 2021年12月4日 上午8:58 #

    如果你还没有遇到过,你可能会觉得这个很有趣

    https://onlinelibrary.wiley.com/doi/10.1111/ecog.02881

    • Adrian Tam
      Adrian Tam 2021年12月8日 上午7:22 #

      感谢分享!

  104. AGGELOS PAPOUTSIS 2022年1月6日 凌晨4:55 #

    你好,

    这里 https://scikit-learn.cn/stable/modules/cross_validation.html

    声明“应该保留一个测试集用于最终评估”

    既然我们不使用训练/测试分割,这怎么可能呢?

    谢谢你

  105. Mahmud Kiru 2022年1月7日 凌晨6:31 #

    我对6个不同的模型运行了交叉验证方法,k的范围从1到20。我意识到随着k值的增加,模型的性能变得更好。这个趋势在我所有的实验模型中都存在。请问原因可能是什么?

    • James Carmichael 2022年1月7日 上午8:04 #

      你好 Mahmud...你能把你的问题重新表述为原始博客文章或其他我们提供的材料中的具体代码清单吗?

      此致,

  106. Jullian 2022年2月16日 晚上7:11 #

    如果假设剩余数据 K 被分成大小相等的块。这些块应该选择多大?

  107. Sophia Yue 2022年3月13日 下午5:15 #

    嗨,Jason,
    k折交叉验证、网格搜索交叉验证可以用在无监督学习中吗?

  108. Adi 2022年3月31日 下午1:19 #

    请有人帮我好好理解这件事。

    当我们使用K折交叉验证时,我们可以输入完整的原始数据集进行交叉验证,还是只输入数据集的训练部分进行交叉验证?
    就像大多数研究都描述了训练、验证、测试的概念一样。

    假设我的数据集有1000条记录。
    我用train_test_split将其分成2:1的比例(666条用于训练,334条用于测试)

    现在我应该只提供这666条记录进行K折交叉验证,还是全部1000条记录?如果只提供666条记录。

    那么如果我们对K-1部分训练模型,并在每次迭代中对1部分进行验证,最终通过cross_val_score得到模型的平均得分,即96.09。

    这是我模型的最终准确率吗?
    那么剩下的334条记录用于测试有什么用呢?

  109. Tayfun Han 2022年11月30日 上午8:31 #

    非常感谢这篇优秀的文章。

    我仍然无法弄清楚一件事。

    例如,我使用PLS-DA分类和SIMPLS算法(通常不用于scikit-learn中的PLSRegression)。最后,我得到得分和载荷,然后我可以制作一个与潜在变量相关的漂亮图表。

    然而,在这个分类之后,我想实现k折交叉验证,只是为了验证我的模型。不幸的是,互联网上的教程通常用原始数据(X)和目标(y)来解释。因此,我不确定在实现模型之后应该使用哪些数据进行验证。

    这里的关键是找到一种逻辑方法,通过k折交叉验证来验证我的模型。

    感谢任何建议。
    祝好。

  110. Zilah Maria Cheuiche 2023年7月12日 上午6:46 #

    你好 Jason,感谢你这篇出色的文章!我进行了3折验证来测量等位基因插补的准确性,但在所有三次验证中都得到了相同的结果。我的导师说有些地方不对劲,但我找不到错误。你觉得呢?

  111. Murilo 2023年8月7日 上午6:22 #

    你好,我有一个问题。

    进行交叉验证后,我们放弃所有模型,因为我们知道模型在未见数据上的平均性能。之后,我读到我们应该使用整个数据集训练一个新模型,这正确吗?或者还有其他方法?

    您能分享一本参考书或一篇论文,以便我能更深入地阅读这方面的内容(即,交叉验证之后应该执行的程序)吗?

  112. sam 2023年11月29日 上午11:55 #

    嗨,Jason,

    我想如果折叠数是10,数据将被训练10次。这是否意味着生成了10个模型?K折交叉验证是否会再用所有数据训练模型一次以获得最终模型?所以这意味着前10次只是为了评估模型的平均性能。最后一次用所有数据是为了生成最终模型。我不确定我的理解是否正确。

    谢谢,
    山姆

  113. shanu 2024年3月5日 凌晨4:10 #

    如何分析每个k折的验证输出?假设选择准确率来验证模型

    假设 K=1 得到 acc = 90%
    假设 K=2 得到 acc = 80%
    假设 K=3 得到 acc = 50%
    假设 K=4 得到 acc = 99%
    假设 K=5 得到 acc = 40%

    我们是否应该只说模型是一致的?或者这次验证还有其他结果吗?

    • James Carmichael 2024年3月5日 上午10:33 #

      你好 Shanu...你的模型在训练和测试中从未见过的数据上表现如何?

  114. Bashar 2024年5月26日 晚上7:26 #

    在k折交叉验证过程中,是否通常建议使用这些技术:提前停止(Early Stopping)和模型检查点(ModelCheckpoint),以增强模型评估和选择的鲁棒性和可靠性?
    这是否与k折交叉验证的目标一致?

    • James Carmichael 2024年5月27日 凌晨4:10 #

      你好 Bashar...即使在k折交叉验证过程中,使用诸如提前停止和模型检查点之类的技术也可以增强模型评估和选择的鲁棒性和可靠性。以下是这些技术如何与k折交叉验证的目标保持一致:

      ### 提前停止
      提前停止用于在模型在验证集上的性能停止改进时停止训练过程,从而防止过拟合。这通过以下方式与k折交叉验证的目标保持一致:
      – **防止过拟合**:通过在验证折叠上的性能趋于平稳时提前停止训练,可以确保模型更好地泛化到未见过的数据。
      – **节省资源**:它减少了不必要地训练更多epoch的计算成本,使交叉验证过程更高效。

      ### 模型检查点
      模型检查点在模型在验证折叠上表现最佳的epoch保存模型。此技术通过以下方式支持k折交叉验证的目标:
      – **保留最佳模型**:在每个折叠期间,您保存产生最佳验证性能的模型参数,确保在每个折叠训练结束时拥有最有效的模型。
      – **一致性**:它有助于在不同折叠之间保持一致的性能,因为您始终可以在每个训练周期中恢复到模型表现最佳的状态。

      ### 与K折交叉验证目标的对齐
      k折交叉验证的主要目标是通过在数据的不同子集上训练和验证模型,更可靠地评估模型的性能,确保模型能够很好地泛化到未见过的数据。将提前停止和模型检查点技术集成到此过程中,通过以下方式增强了这些目标:
      – **改进泛化能力**:提前停止有助于避免过拟合,确保模型不仅在训练数据上表现良好,而且在验证(以及由此扩展到测试)数据上也表现良好。
      – **最佳模型性能**:模型检查点确保保留模型的最佳版本,这在您以后汇总不同折叠的结果以评估整体模型性能时至关重要。
      – **效率和可靠性**:这两种技术都有助于更高效的训练过程,节省计算资源,并提供跨不同折叠的模型性能的可靠度量。

      ### 实际操作
      在 k 折交叉验证中实施这些技术时,请确保:
      1. **提前停止 (Early Stopping) 和模型检查点 (ModelCheckpoint) 在每个折叠中单独应用**:每个折叠都应有其自己的验证集,提前停止和模型检查点应根据在该特定验证集上的表现来应用。
      2. **一致的标准**:在所有折叠中对提前停止和模型检查点使用一致的标准,以确保模型评估的统一性。
      3. **汇总结果**:在所有折叠训练完成后,汇总结果以获得模型性能的总体估计。

      总而言之,提前停止和模型检查点确实可以很好地与 k 折交叉验证的目标保持一致,从而增强模型评估和选择过程的鲁棒性、效率和可靠性。

  115. Amin 2024年7月15日上午9:37 #

    嗨,Jason。如果你能回答这个问题,我将不胜感激。
    在使用 BERT/Transformer 模型进行 k 折(10 折)交叉验证时,在每个折叠上应用提前停止(不同 epoch 数)是否是好方法?还是使用固定 epoch 代替提前停止?谢谢。

    • James Carmichael 2024年7月16日上午3:32 #

      嗨,Amin……不客气!在对 BERT/Transformer 模型进行 10 折交叉验证的每个折叠中应用提前停止,基于以下几个原因,可能是一个非常有效的策略:

      ### 在每个折叠中提前停止的益处

      1. **自适应训练**:提前停止允许训练过程适应每个折叠的复杂性和难度。由于训练数据的可变性,有些折叠可能比其他折叠收敛得更快。提前停止确保你不会在任何特定折叠上过拟合。

      2. **资源效率**:通过在验证集性能停止提升时停止训练过程,而不是在所有折叠中都训练固定数量的 epoch,它有助于节省计算资源。

      3. **改善泛化能力**:通过避免在每个折叠上过拟合,提前停止可以带来更好的泛化能力和对模型性能更稳健的评估。

      ### 实施策略

      1. **提前停止标准**:定义一个适当的提前停止指标,例如验证损失或验证准确率,以及一个耐心参数,该参数确定在停止之前要等待多少个 epoch 才能看到改进。

      2. **一致的配置**:确保在所有折叠中一致应用提前停止标准。这意味着在每个折叠中使用相同的耐心参数并监控相同的指标。

      3. **模型检查点**:在每个折叠中,将验证集上表现最佳的 epoch 的模型权重保存下来。这样可以让你在汇总结果时使用每个折叠的最佳模型。

      ### 固定 epoch 与提前停止

      使用固定 epoch 训练每个折叠有其自身的优缺点:

      – **简单性**:固定 epoch 提供了一个直接且统一的训练过程。
      – **潜在的过拟合**:如果没有提前停止,你可能会面临一些折叠过拟合的风险,特别是如果它们以不同的速率收敛。

      ### 建议

      鉴于 BERT/Transformer 模型的性质以及它们需要仔细训练以避免过拟合的倾向,通常建议使用提前停止。它允许更具适应性和效率的训练,并可以带来更好的泛化能力和模型性能。

      ### 实施提前停止的实用步骤

      1. **定义提前停止回调函数**:在大多数深度学习框架中,都有内置的提前停止机制。例如,在 PyTorch 中,你可以使用像 `torch` 和 `transformers` 这样的库来实现提前停止。

      2. **与交叉验证集成**:使用循环遍历交叉验证的每个折叠,并在每个折叠的训练期间应用提前停止回调函数。

      3. **监控指标**:确保你正在监控相关指标(例如,验证损失、验证准确率)并保存最佳模型权重。

      4. **评估**:训练后,评估所有折叠的性能并汇总结果以获得模型的整体评估。

      这是一个简化的伪代码示例:

      python
      from sklearn.model_selection import KFold
      from transformers import BertForSequenceClassification, AdamW, get_linear_schedule_with_warmup
      import torch

      # 定义你的模型、优化器、调度器等。
      model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
      optimizer = AdamW(model.parameters(), lr=2e-5)

      # 定义 KFold 交叉验证器
      kf = KFold(n_splits=10)

      for train_index, val_index in kf.split(data)
      train_data = data[train_index]
      val_data = data[val_index]

      # 初始化提前停止参数
      best_val_loss = float('inf')
      patience = 3
      wait = 0

      for epoch in range(max_epochs)
      # 训练步骤
      model.train()
      for batch in train_data
      # 训练代码在此...
      pass

      # 验证步骤
      model.eval()
      val_loss = 0
      for batch in val_data
      # 验证代码在此...
      val_loss += compute_val_loss(batch)

      val_loss /= len(val_data)

      # 提前停止检查
      if val_loss < best_val_loss: best_val_loss = val_loss wait = 0 # 保存最佳模型 torch.save(model.state_dict(), 'best_model.pth') else: wait += 1 if wait >= patience
      print(f"在 epoch {epoch} 提前停止")
      break

      # 加载最佳模型进行评估
      model.load_state_dict(torch.load('best_model.pth'))

      这种方法确保每个折叠都得到高效和自适应的训练,从而为你的模型提供更可靠的评估。

      • Amin 2024年7月17日下午5:22 #

        非常感谢您的回答,James。现在,我更放心地将其用于我的论文了。

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。