如何使用学习曲线诊断机器学习模型性能

学习曲线是模型学习性能随经验或时间变化的图表。

学习曲线在机器学习中是一种广泛使用的诊断工具,适用于从训练数据集逐步学习的算法。在训练过程中每次更新后,可以在训练数据集和保留的验证数据集上评估模型,并创建测量性能的图表以显示学习曲线。

审查训练过程中模型的学习曲线可用于诊断学习问题,例如模型欠拟合或过拟合,以及训练和验证数据集是否具有足够的代表性。

在这篇文章中,您将了解学习曲线以及如何使用它们来诊断机器学习模型的学习和泛化行为,并附有显示常见学习问题的示例图。

阅读本文后,你将了解:

  • 学习曲线是显示学习性能随经验变化而变化的图表。
  • 模型在训练和验证数据集上的学习曲线可用于诊断欠拟合、过拟合或良好拟合的模型。
  • 模型性能的学习曲线可用于诊断训练或验证数据集是否未相对代表问题领域。

用我的新书《更好的深度学习》来启动你的项目,书中包含分步教程和所有示例的 Python 源代码文件

让我们开始吧。

A Gentle Introduction to Learning Curves for Diagnosing Deep Learning Model Performance

学习曲线在诊断深度学习模型性能中的简要介绍
图片由Mike Sutherland提供,保留部分权利。

概述

本教程分为三个部分;它们是:

  1. 学习曲线
  2. 诊断模型行为
  3. 诊断无代表性的数据集

机器学习中的学习曲线

一般来说,学习曲线是一种图表,其中x轴表示时间或经验,y轴表示学习或改进。

学习曲线(LCs)被认为是监测接触新任务的工人表现的有效工具。LCs提供了随着任务重复而发生的学习过程的数学表示。

学习曲线模型与应用:文献综述与研究方向, 2011。

例如,如果您正在学习一种乐器,可以在一年中每周评估您在乐器上的技能并赋予一个数值分数。这些分数在52周内的图表就是一条学习曲线,它将显示您学习乐器的情况如何随时间变化。

  • 学习曲线:学习(y轴)随经验(x轴)变化的线图。

学习曲线在机器学习中被广泛使用,适用于那些随时间逐步学习(优化其内部参数)的算法,例如深度学习神经网络。

用于评估学习的指标可能是最大化的,这意味着更好的分数(更大的数字)表示更多的学习。一个例子是分类准确度。

更常见的是使用最小化分数,例如损失或误差,其中更好的分数(更小的数字)表示更多的学习,而值为0.0表示训练数据集被完美学习且没有犯错误。

在机器学习模型的训练过程中,可以评估训练算法每一步的模型当前状态。可以在训练数据集上进行评估,以了解模型“学习”得如何。也可以在不属于训练数据集的保留验证数据集上进行评估。在验证数据集上的评估可以了解模型“泛化”得如何。

  • 训练学习曲线:根据训练数据集计算的学习曲线,可了解模型学习情况。
  • 验证学习曲线:根据保留验证数据集计算的学习曲线,可了解模型泛化情况。

通常会为机器学习模型在训练和验证数据集上创建双重学习曲线。

在某些情况下,也常为多个指标创建学习曲线,例如在分类预测建模问题中,模型可能会根据交叉熵损失进行优化,而模型性能则使用分类准确率进行评估。在这种情况下,会创建两个图,每个图对应一个指标的学习曲线,每个图可以显示两条学习曲线,分别对应训练和验证数据集。

  • 优化学习曲线:根据模型参数优化所依据的指标(例如损失)计算的学习曲线。
  • 性能学习曲线:根据模型将要评估和选择的指标(例如准确率)计算的学习曲线。

既然我们已经熟悉了学习曲线在机器学习中的使用,接下来让我们看看学习曲线图中观察到的一些常见形状。

想要通过深度学习获得更好的结果吗?

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

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

诊断模型行为

学习曲线的形状和动态可用于诊断机器学习模型的行为,进而可能建议可以进行哪些类型的配置更改以改进学习和/或性能。

在学习曲线中,您可能会观察到三种常见的动态;它们是:

  • 欠拟合。
  • 过拟合。
  • 良好拟合。

我们将通过示例更仔细地研究每一种情况。示例将假定我们正在查看一个最小化指标,这意味着y轴上较小的相对分数表示更多或更好的学习。

欠拟合学习曲线

欠拟合是指模型无法学习训练数据集。

当模型在训练集上无法获得足够低的误差值时,就会发生欠拟合。

— 第111页,深度学习,2016年。

欠拟合模型可以仅从训练损失的学习曲线中识别出来。

它可能显示一条平线或相对较高的损失的噪声值,表明模型根本无法学习训练数据集。

下面提供了此示例,当模型容量不足以处理数据集的复杂性时,这种情况很常见。

Example of Training Learning Curve Showing An Underfit Model That Does Not Have Sufficient Capacity

训练学习曲线显示容量不足的欠拟合模型示例

欠拟合模型也可以通过训练损失在图的末尾持续下降来识别。

这表明模型有能力进一步学习并可能进一步改进,并且训练过程过早停止。

Example of Training Learning Curve Showing an Underfit Model That Does Not Have Sufficient Capacity

训练学习曲线显示需要进一步训练的欠拟合模型示例

学习曲线图显示欠拟合,如果:

  • 训练损失无论训练如何保持平坦。
  • 训练损失持续下降直至训练结束。

过拟合学习曲线

过拟合是指模型对训练数据集学习得太好,包括训练数据集中的统计噪声或随机波动。

……拟合一个更灵活的模型需要估计更多的参数。这些更复杂的模型可能导致一种称为数据过拟合的现象,这基本上意味着它们过于紧密地跟随误差或噪声。

— 第22页,统计学习导论:附R应用,2013年。

过拟合的问题在于,模型对训练数据越是专门化,其对新数据的泛化能力就越差,导致泛化误差增加。这种泛化误差的增加可以通过模型在验证数据集上的性能来衡量。

这是数据过拟合的一个例子,[…]。这是一种不理想的情况,因为获得的拟合在未包含在原始训练数据集中的新观测值上无法产生准确的响应估计。

— 第24页,统计学习导论:附R应用,2013年。

这种情况通常发生在模型容量超出问题所需,从而导致灵活性过大。如果模型训练时间过长,也可能发生这种情况。

学习曲线图显示过拟合,如果:

  • 训练损失图随经验持续下降。
  • 验证损失图下降到某一点后开始再次上升。

验证损失的拐点可能是训练可以停止的点,因为该点之后的经验显示了过拟合的动态。

下面的示例图演示了一个过拟合的案例。

Example of Train and Validation Learning Curves Showing an Overfit Model

训练和验证学习曲线显示过拟合模型示例

良好拟合学习曲线

良好拟合是学习算法的目标,介于过拟合和欠拟合模型之间。

良好拟合通过训练和验证损失下降到稳定点,并且两个最终损失值之间存在最小差距来识别。

模型在训练数据集上的损失几乎总是低于验证数据集。这意味着我们应该期望训练和验证损失学习曲线之间存在一些差距。这个差距被称为“泛化差距”。

学习曲线图显示良好拟合,如果:

  • 训练损失图下降到稳定点。
  • 验证损失图下降到稳定点,并且与训练损失之间存在一个小差距。

良好拟合的持续训练很可能导致过拟合。

下面的示例图演示了一个良好拟合的案例。

Example of Train and Validation Learning Curves Showing a Good Fit

训练和验证学习曲线显示良好拟合示例

诊断无代表性的数据集

学习曲线还可用于诊断数据集的特性以及它是否具有相对代表性。

无代表性的数据集是指可能无法捕捉与从同一领域提取的另一个数据集(例如训练数据集和验证数据集之间)相关的统计特征的数据集。当数据集中的样本数量相对于另一个数据集而言过小时,通常会发生这种情况。

可能观察到两种常见情况;它们是:

  • 训练数据集相对不具代表性。
  • 验证数据集相对不具代表性。

无代表性训练数据集

无代表性的训练数据集意味着与用于评估的验证数据集相比,训练数据集没有提供足够的信息来学习问题。

如果训练数据集的示例数量与验证数据集相比过少,可能会发生这种情况。

这种情况可以通过训练损失的学习曲线显示出改进,同样,验证损失的学习曲线也显示出改进,但两条曲线之间仍然存在很大差距来识别。

Example of Train and Validation Learning Curves Showing a Training Dataset That May Be too Small Relative to the Validation Dataset

训练和验证学习曲线显示训练数据集可能相对于验证数据集过小的情况示例

无代表性验证数据集

无代表性验证数据集意味着验证数据集没有提供足够的信息来评估模型泛化能力。

如果验证数据集的示例数量与训练数据集相比过少,可能会发生这种情况。

这种情况可以通过训练损失的学习曲线看起来像良好拟合(或其他拟合),而验证损失的学习曲线显示出围绕训练损失的嘈杂波动来识别。

Example of Train and Validation Learning Curves Showing a Validation Dataset That May Be too Small Relative to the Training Dataset

训练和验证学习曲线显示验证数据集可能相对于训练数据集过小的情况示例

它也可以通过验证损失低于训练损失来识别。在这种情况下,它表明验证数据集可能比训练数据集更容易让模型预测。

Example of Train and Validation Learning Curves Showing a Validation Dataset That Is Easier to Predict Than the Training Dataset

训练和验证学习曲线显示验证数据集比训练数据集更容易预测的示例

进一步阅读

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

书籍

论文

文章

文章

总结

在这篇文章中,您了解了学习曲线以及如何使用它们来诊断机器学习模型的学习和泛化行为。

具体来说,你学到了:

  • 学习曲线是显示学习性能随经验变化而变化的图表。
  • 模型在训练和验证数据集上的学习曲线可用于诊断欠拟合、过拟合或良好拟合的模型。
  • 模型性能的学习曲线可用于诊断训练或验证数据集是否未相对代表问题领域。

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

今天就开发更好的深度学习模型!

Better Deep Learning

更快地训练,减少过拟合,以及集成方法

...只需几行python代码

在我的新电子书中探索如何实现
更好的深度学习

它提供关于以下主题的自学教程
权重衰减批量归一化dropout模型堆叠等等...

为你的项目带来更好的深度学习!

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

查看内容

如何使用学习曲线诊断机器学习模型性能的248个回复

  1. 罗兰·费尔南德斯 2019年2月28日 上午4:09 #

    感谢这篇关于核心机器学习技术的文章。第一个学习曲线示例似乎是欠拟合的一个糟糕例子,因为y轴上的损失已经很低了。另外,也许第二个图上显示的情况应该称为“训练不足”,以避免与欠拟合的“难以学习更多”的情况混淆。此外,欠拟合的总结段落有打字错误和数据“过拟合”。

  2. 罗兰·费尔南德斯 2019年2月28日 上午4:11 #

    我自己的打字错误 :)。上面倒数第二个词应该是“says”

  3. 安吉洛斯·安吉利达基斯 2019年2月28日 上午5:26 #

    信息量很大!

    • 杰森·布朗利 2019年2月28日 上午6:46 #

      谢谢。

      • phz 2019年4月3日 晚上7:18 #

        这里仍然有错别字
        学习曲线图显示过拟合,如果:

        训练损失无论训练如何保持平坦。
        训练损失持续下降直至训练结束。

        => 这是欠拟合。

  4. 阿希什 2019年3月6日 上午1:10 #

    泛化等方法是否只适用于这些情况?

    • 杰森·布朗利 2019年3月6日 上午7:56 #

      抱歉,我不明白,您能详细说明或重新措辞问题吗?

  5. 阿德里安·基纳特 2019年3月21日 晚上8:06 #

    我本会说,训练集上的误差应该增加以收敛到验证集上的误差,这表示拟合良好。您对此有何看法?(https://www.dataquest.io/blog/learning-curves-machine-learning )

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

      根据我的经验,在实践中不会发生,因为通常测试/验证集比训练集小且代表性不足,并且具有不同的误差配置文件。

  6. 乔治 2019年4月3日 晚上6:22 #

    嗨,杰森,谢谢你的帖子。

    我有一个与此帖子无关的问题,想听听您的意见。

    假设我正在训练一些数据,在预处理过程中我正在清理这些数据。我从中删除了一些奇怪/错误的值。

    现在,当我将预测应用于未见过的新数据时,在进行预测之前,我是否需要对这些数据应用相同的清理?

    这样做或不这样做有什么需要注意的地方吗?

    我想我应该进行相同的清理,但这让我很困惑,我们有未见过的数据,它可以是任何东西……

    (我不是在谈论缩放或那种我已经在训练和未见过的数据上应用的预处理)

    非常感谢!

    George

    • 杰森·布朗利 2019年4月4日 上午7:41 #

      很好的问题。

      是的,如果您可以使用通用但特定于领域的知识来准备/过滤数据,那么在拟合和评估模型以及未来进行预测时,始终如一地使用此过程是一个好主意。

      风险在于数据泄露,例如,利用关于“未见”/测试数据的知识来帮助更好地拟合模型。这可能有所帮助(而且可能有点过于严格)
      https://machinelearning.org.cn/data-leakage-machine-learning/

  7. JG 2019年4月3日 晚上9:35 #

    杰森,这篇帖子写得太棒了。谢谢。

    ——我的总结,如果您能评估我是否对所有这些内容都理解正确,我将不胜感激:

    过拟合发生在我们学习了太多与要学习的主流思想(通用概念)无关的细节时。这种情况可能是,一方面您有一个非常庞大复杂的模型(有很多层和很多需要调整的权重,即具有非常“高熵信息容量”),另一方面只有少量数据可供训练……因此解决方案可以是简化模型或增加训练数据集。
    另一方面,欠拟合发生在我们模型需要更多经验(更多迭代次数)来训练时,因此学习曲线趋势持续下降……直到您通过适当的迭代次数获得正确的稳定。

    ——我的第二个问题是,当验证数据获得比训练数据更好的性能(高水平)时,您如何解释这种情况……这是良好泛化的一个好迹象吗?

    杰森,感谢您允许我们分享您的知识!!

    • 杰森·布朗利 2019年4月4日 上午7:56 #

      是的,但是如果模型没有足够的容量来从数据中学习,您可能会出现欠拟合。这可能来自迭代次数,也可能来自模型的复杂性/大小。

      这表明验证数据集太小,无法代表问题——非常常见。

  8. 雅各布 2019年5月21日 晚上8:27 #

    好文章!
    非常感谢。

    • 杰森·布朗利 2019年5月22日 上午8:04 #

      不客气,很高兴能帮到您。

    • 塔努贾·什雷斯塔 2020年1月27日 上午4:53 #

      嗨,Jason,

      抱歉,我在领英上也问过这个问题。再次发布在这里,以便大家思考。

      我用非常少量的数据运行了一个VGG16模型——验证准确率约为83%。
      然而,当我预测测试数据集时,我只得到了大约53%的准确率。我的数据分为训练集、验证集和测试集。

      这里可能出了什么问题?任何解释都会非常有帮助。另外,感谢您的学习曲线博客。确实很有帮助……

      另外,您可以使用验证数据进行预测吗?这里可能出了什么问题/正确?

      • 杰森·布朗利 2020年1月27日 上午7:09 #

        也许测试数据集太小或不能代表更广泛的数据集。

        也许尝试50/50分割?或者获取更多数据?

        • 塔努贾·什雷斯塔 2020年1月27日 下午3:37 #

          谢谢!

  9. 普里坦 2019年6月29日 晚上10:15 #

    先生,虽然这是个有点偏题的问题,但我还是想问一下。我如何“数学上”解释居中和缩放数据对机器学习模型的益处,而不是原始数据。归一化数据的准确性和收敛性无疑会提高,但我能用数学证明吗?

  10. 弗兰克 2019年7月4日 上午3:32 #

    使用三组数据(训练、验证和测试)创建学习曲线图是否正确?使用“训练”集来训练模型,并使用“验证”和“测试”集来生成学习曲线?

  11. 2019年7月5日 下午12:25 #

    感谢您的帖子!!它帮助很大!!您能帮我检查一下我得到的学习曲线吗(http://zhuchen.org.cn/wp-content/uploads/2019/07/lc.png),是否欠拟合?这是一个使用随机森林的多分类问题。

  12. 泽娜布 2019年7月22日 上午9:11 #

    一个非常棒且有用的教程,谢谢

  13. 泽娜布 2019年7月22日 上午10:54 #

    我可以问一下欠拟合情况下“平线”的含义吗?

  14. 泽娜布 2019年7月23日 上午12:58 #

    如果损失增加然后减少,然后又增加然后减少,如此反复……
    这意味着什么?
    它意味着数据在该模型中不具代表性吗?或者
    它意味着发生了过拟合吗?

  15. 泽娜布 2019年7月23日 下午1:43 #

    我使用皮尔逊相关系数作为回归问题的准确性指标。

    我可以使用相关系数作为优化学习曲线吗?

  16. 杰克 2019年7月27日 上午3:28 #

    你好,Jason。

    我在这里发布了两张我的训练模型图片

    https://stackoverflow.com/questions/57224353/is-my-training-data-set-too-complex-for-my-neural-network

    您能告诉我我的模型是过拟合还是欠拟合吗?我认为是欠拟合。

    我该如何解决这些问题?

    再次感谢杰森,您对我的帮助之大无法言喻

  17. 泽娜布 2019年8月4日 晚上11:40 #

    我可以问一下性能学习曲线的必要性吗?
    我从本教程中了解到,优化学习曲线用于检查模型的拟合度?
    但性能学习曲线的重要性是什么?

    • 杰森·布朗利 2019年8月5日 上午6:53 #

      你说的性能学习曲线是什么意思?

      • 泽娜布 2019年8月5日 下午12:23 #

        性能学习曲线代表了每个epoch的准确性

        • 杰森·布朗利 2019年8月5日 下午2:04 #

          我明白了,好问题。

          性能曲线可以让你了解损失的变化是否与问题中技能的实际实质性提升相关。

  18. 泽娜布 2019年8月4日 晚上11:41 #

    我应该在模型达到最小损失时停止训练吗?

    • 杰森·布朗利 2019年8月5日 上午6:53 #

      是的,在验证集上。

      • 泽娜布 2019年8月5日 晚上8:22 #

        如果我达到了最小验证损失值,
        然而,验证准确率不高。
        在这种情况下,我应该停止学习吗?

        • 杰森·布朗利 2019年8月6日 上午6:35 #

          最小损失是0,如果达到0损失,则表明问题微不足道(不需要机器学习)或者模型过拟合。

          • 泽娜布 2019年8月6日 晚上11:16 #

            抱歉,我想说的是,如果我达到了最小验证损失值(不是0),但在这一迭代中验证准确率不是最高值(此迭代后,验证准确率更高)。

            在这种情况下,我应该停止训练吗?

          • 杰森·布朗利 2019年8月7日 上午7:57 #

            也许可以尝试一下。

  19. 泽娜布 2019年8月5日 下午12:26 #

    我可以使用准确率学习曲线而不是损失学习曲线来衡量模型的拟合度吗?

    • 杰森·布朗利 2019年8月5日 下午2:04 #

      当然。只是它在诊断学习动态方面可能没有那么有用。

      • 泽娜布 2019年8月5日 晚上10:50 #

        你说的学习动态是什么意思?

  20. 泽娜布 2019年8月5日 下午12:37 #

    如果损失曲线是一条在迭代过程中下降的直线,这有问题吗?

  21. 泽娜布 2019年8月5日 下午12:38 #

    如果您愿意,可以为我推荐一些阅读更多关于学习曲线的优秀参考资料吗?

  22. 泽娜布 2019年8月5日 晚上8:01 #

    验证损失值必须低于训练损失值吗?

    • 杰森·布朗利 2019年8月6日 上午6:34 #

      对于一个拟合良好的模型,验证损失和训练损失应该非常相似。

  23. 泽娜布 2019年8月6日 上午4:22 #

    哪个更受青睐?
    ——提早停止训练,或者
    ——分析输出以找到最小验证损失

    • 杰森·布朗利 2019年8月6日 上午6:41 #

      这取决于模型和数据集。

      也许可以进行实验,看看哪种方法适用于您的特定场景。

  24. 泽娜布 2019年8月6日 上午11:19 #

    哪个更优选:使用低容忍度值的提前停止还是高容忍度值?

    • 杰森·布朗利 2019年8月6日 下午2:05 #

      这取决于您选择的模型和数据集。也许可以尝试一下?

  25. 泽娜布 2019年8月6日 上午11:22 #

    如果我达到了最小验证损失值,而在这个epoch,训练准确率和验证准确率之间存在差距。
    我应该停止学习还是不停止?

  26. 泽娜布 2019年8月6日 晚上11:19 #

    为什么我应该在达到最小验证损失时停止,而不是在达到验证损失和训练损失之间最小差距时停止?

    • 杰森·布朗利 2019年8月7日 上午7:58 #

      尝试各种方法,看看哪种方法能为您的数据集产生一个健壮且熟练的模型。

      一般来说,您希望在训练和验证损失最低,并且在验证损失开始上升之前停止训练。

  27. 吉姆·佩顿 2019年8月17日 上午12:12 #

    很棒的教程!

    在显示训练不足模型的第二个图上,验证数据损失似乎应该高于训练数据损失,这与图中显示的不同。也许是编辑错误?

    再次,这里的工作很棒。感谢分享。

    • 杰森·布朗利 2019年8月17日 上午5:48 #

      没有错误,在这种情况下,验证集可能代表性不足。重点是训练/验证曲线的形状,表明进行更多有意义的训练是完全可能的。

  28. 切坦·帕蒂尔 2019年9月6日 下午5:23 #

    嗨,杰森,这是一篇非常有用的文章。但是,关于“无代表性验证数据集”一节有一个问题:-

    无代表性验证数据集意味着验证数据集没有提供足够的信息来评估模型泛化能力。
    如果验证数据集的示例数量与训练数据集相比过少,可能会发生这种情况。

    我的问题是,如果您有更多的验证示例,例如占整个数据集的30%,那么曲线会变得平滑吗?

    或者,错误在于验证集本身的分布?(验证数据可能不包含与训练数据相同的分布)。

    如果上述句子不是无代表性验证数据集的情况,那么当验证数据分布与训练数据集完全不同时,曲线会是什么样子?以及解决此问题的补救措施是什么?

    • 杰森·布朗利 2019年9月7日 上午5:21 #

      这取决于数据的具体情况和您正在采样的数据集大小。

      一个好的解决方案是获取更多数据并使用50/50的分割。

  29. 哈迈德 2019年9月7日 上午8:44 #

    非常好!如果您能告诉我当应用于相同的训练/验证集时,以下哪个模型更好,我将不胜感激:一个产生较低验证损失和较低训练损失,但泛化差距高于另一个具有较高验证和训练集损失的模型。我给您举个例子。
    模型1:训练损失 = 0.5 验证损失 = 1.5 差距 = 1
    模型2:训练损失 = 0.8 验证损失 = 1.6 差距 = 0.8

    谢谢!

    • 杰森·布朗利 2019年9月8日 上午5:09 #

      一般来说,模型选择是项目特有的,我的建议可能帮不上忙。

      选择一个符合项目利益相关者要求的模型是一个好主意,通常这意味着在保留数据集上表现良好且复杂度较低。

      • 哈迈德 2019年9月8日 上午7:12 #

        我明白了!
        谢谢!

  30. 费利佩 2019年9月21日 下午1:41 #

    这个噪声有多糟糕?

    https://imgur.com/sSL3DRJ

  31. 拉德胡安·巴巴 2019年9月30日 上午12:59 #

    嗨,Jason,

    训练曲线能否用于评估预测时间序列的模型?
    据我所知,时间序列不能使用交叉验证(只能使用步进验证),

    那么使用学习曲线的意义何在?
    “经验”是训练大小?还是迭代次数?

    • 杰森·布朗利 2019年9月30日 上午6:12 #

      是的,每次模型拟合时,学习曲线都可以成为学习行为的宝贵诊断工具。

      • 拉德胡安·巴巴 2019年9月30日 上午7:15 #

        那么经验就是训练大小?
        我如何在时间序列中获得更多的训练大小?(通过向后追溯(例如,每次增加1天并追加上次训练和测试损失)?

        • 杰森·布朗利 2019年9月30日 下午2:24 #

          抱歉,我不太明白。

          您可以通过增加历史数据,或者增加每个时间步测量到的输入变量来获得更多数据以训练时间序列模型。

          不确定这与学习曲线有什么关系?

          • 拉德胡安·巴巴 2019年10月1日 上午12:43 #

            据我所知,学习曲线中的X轴不是迭代次数,
            而是我们训练集的大小,对吗?

          • 杰森·布朗利 2019年10月1日 上午6:54 #

            不行。

            学习曲线图的x轴是迭代次数。

  32. 亚历克斯·塔格博 2019年10月10日 晚上8:02 #

    嗨,Jason,

    我一直关注您的教程,非常有帮助!非常感谢!

    我的问题是关于无代表性验证数据集(第二个图),在这种情况下,除了获取更多数据等之外,您会推荐什么补救措施?

    是否也可以应用 dropout 技术,或者它仅限于过拟合?

    谢谢!

    亚历克斯..

  33. 格哈德·莱默 2019年10月11日 晚上10:36 #

    这很正常。深度学习器(和一些经典机器学习算法)具有高度随机性。这就是为什么您应该始终进行多次实验并获取结果的统计数据。例如,对具有相同超参数的多次实验(仅通过RNG种子不同)的训练/验证损失和损失的标准差进行平均。这里有一些关于此博客上结果随机性的其他文章:https://machinelearning.org.cn/reproducible-results-neural-networks-keras/https://machinelearning.org.cn/evaluate-skill-deep-learning-models/https://machinelearning.org.cn/randomness-in-machine-learning/

    另外:一些伪随机数生成器在小种子下效果不佳。因此,如果您用多个不同的小种子获得了某些结果,而用显著更大的种子获得了不同的结果,这可能表明您的库使用的RNG在小种子下效果不佳。请改用更大的种子。

    • 杰森·布朗利 2019年10月12日 上午6:59 #

      完全正确!

      除了种子方面。我认为现在所有的库都使用良好的随机数生成器,不同种子下的结果很可能是“幸运的”,不具有代表性。

  34. 亚历克斯·塔格博 2019年10月14日 下午4:13 #

    好的,这回答了我的问题!

    非常感谢!

    Alex

  35. 穆罕默德 2019年10月19日 上午1:09 #

    这些图中发生了一些非常奇怪的事情。训练损失似乎总是远高于验证损失。但这怎么可能呢?除了数据不具代表性的情况,当您训练模型时,您会期望在训练集上看到一个低得多的损失(模型的参数针对该集进行了优化),而在验证集上,训练模型需要泛化(参数并未针对该集进行优化)。
    请查看吴恩达的笔记:http://www.holehouse.org/mlclass/10_Advice_for_applying_machine_learning.html
    训练损失总是(除了特殊情况)低于验证集。

    • 杰森·布朗利 2019年10月19日 上午6:46 #

      通常人们会使用训练集的30%或更小的部分作为验证集,这使得该集上的损失嘈杂/不可靠。

      这很常见,可悲的是。

      如果有足够的数据,50%的分割可能更合适。

      • 穆罕默德 2019年10月21日 下午1:37 #

        我认为损失函数需要根据数据集的大小进行归一化。也就是说,在计算训练损失函数时使用1/m_{训练大小},对于另一个集使用1/m_{交叉验证大小}。

  36. OXPHOS 2019年10月21日 晚上8:26 #

    嗨,Jason,

    感谢您的详细解释。帮助很大。我想知道我是否可以将其翻译成中文,并在我的博客上转载,并注明您的帖子地址?

    谢谢!

  37. 沙布南 2019年10月22日 上午5:29 #

    我想知道您是否能澄清损失值和边界。换句话说,损失值大于1意味着什么?
    (对于每个epoch的准确率,所有值都在0和1之间——或0%和100%之间)

    • 沙布南 2019年10月22日 上午5:32 #

      我还有另一个问题。根据这篇帖子,损失随迭代次数的变化在拟合方面提供了信息。那么准确率随迭代次数的变化(训练集和验证集的准确率)呢?

    • 杰森·布朗利 2019年10月22日 上午6:00 #

      损失是相对于模型/数据集而言的。

      我建议只解释大体的动态,而不是具体的值。

      • 沙布南 2019年10月22日 上午9:28 #

        非常感谢您的解释和澄清。

  38. 沙布南 2019年10月23日 下午4:15 #

    我有一些情况是损失图在迭代过程中呈上升趋势。我在您的帖子中没有看到这个例子。我想知道它属于哪个类别。

    • Jason Brownlee 2019年10月24日上午5:35 #

      如果训练损失增加,这可能表明过拟合。

      在上面的教程中就有这样的例子。

  39. 亚当 2019年11月28日下午2:51 #

    您好,Jason,我实现了一个RNN,我的验证损失在2个epoch后开始增加,表明模型可能过拟合了。然而,我比较了2个epoch和10个epoch的精确度和召回率的评估结果,发现它们几乎相似。

    我该如何解释呢?这是否意味着模型在2个epoch内收敛,不需要更多的训练?即使验证损失在2个epoch后增加并表明过拟合,我是否可以认为在2个epoch后停止是最佳点?

    谢谢!

    • Jason Brownlee 2019年11月29日上午6:42 #

      是的,你的推理听起来不错。也许可以尝试更小的学习率来减缓学习速度?

  40. 阿比尔 2019年12月20日上午10:29 #

    验证损失和训练损失之间的差距多大是可接受的?

    • Jason Brownlee 2019年12月20日下午1:07 #

      好问题。

      越小越好。在某个时候,这需要主观判断。

      • 阿比尔 2019年12月21日上午7:06 #

        谢谢杰森。

  41. 岸川至 2020年1月24日下午12:23 #

    您是如何生成这些图表的?另外,对于每种情况,我们需要调整什么参数?

  42. Gabriele Valvo 2020年1月25日下午7:09 #

    早上好,我构建了一个神经网络来预测物理量(回归任务),我绘制了“训练损失/验证损失 vs epoch”图表,我可以看到,起初两者都在下降,然后变得恒定,但验证损失总是略低于训练损失(这个差异非常小)。这是过拟合吗?如果两者(训练和验证损失)都变得恒定(下降后),其中一个在另一个之上或之下重要吗?
    我想给你发一些图表,但我不知道怎么做。

  43. Joglas 2020年2月25日上午10:11 #

    嗨,Jason,

    感谢您的帖子。在训练数据集经过重采样的不平衡分类问题中,我们很可能会得到一个像您在“不具代表性的验证数据集”中解释的图表,因为验证数据集仍然不平衡,代表真实世界。在这种情况下,我们是否必须以不同的方式分析模型的性能?

    谢谢。

    • Jason Brownlee 2020年2月25日上午11:19 #

      也许吧。您可以尝试绘制用于评估的指标,而不是损失。

  44. 薛波 2020年3月3日下午4:47 #

    谢谢,这篇文章很有帮助。

    但我仍然对如何定义一个好的拟合有疑问。你说可能存在一个小的泛化差距。但我应该如何定义“小”呢?

    我得到了一条曲线,验证损失下降到0.06左右的稳定点,而训练损失稳定在0.03左右。我应该如何评估它?

    • Jason Brownlee 2020年3月4日上午5:50 #

      好问题。它是相对的,例如,差距是否相对较小、正在缩小、稳定。

  45. 大卫 2020年3月10日下午3:34 #

    嘿,杰森,一如既往的棒。
    关于罗兰·费尔南德斯的回复,也就是这篇文章的第一个回复。我建立了一些模型并用“mse”损失进行编译,在第一个epoch得到了0.0090的值,在第二个epoch得到了0.0077的值,并且它一直在学习,只是每个epoch学习得很少,最后绘制出一条几乎平坦的线,就像第一个学习曲线“显示容量不足的欠拟合模型的训练学习曲线示例”中的那条。所以我想听听你的看法。
    这些模型是否像罗兰所说的那样,由于值很低而不代表欠拟合,或者实际上像您在文章中指出的那样是欠拟合?
    我必须补充的是,这些模型获得的预测结果在预期范围内。

    • Jason Brownlee 2020年3月11日上午5:19 #

      如果损失在学习过程中保持平坦,那就很奇怪了。这可能是问题要么微不足道,要么无法学习——在这种情况下,任何一组小权重都能产生良好预测,也许是前者。只是猜测,可能需要更多的研究。

  46. 大卫 2020年3月11日上午7:51 #

    那么您建议我该怎么做才能确定这些模型的可靠性,或者它们是否是该问题的适用解决方案。

    • Jason Brownlee 2020年3月11日上午8:07 #

      首先选择一个最能体现您和利益相关者项目目标的指标。

      然后设计一个测试工具,使用可用数据评估模型。例如,对于适量的数据进行回归/分类,请使用重复分层K折交叉验证。

      使用每个得分样本的平均值比较结果。使用统计假设检验支持决策,以证明差异是真实的。

      使用方差来评论模型的稳定性。使用集成方法来减少最终预测中的方差。

      这些主题都在博客中涵盖,请使用搜索功能或联系我。

      学习曲线可以为单个模型的单次运行提供有用的诊断,以帮助调整模型超参数。

  47. 大卫 2020年3月11日上午8:45 #

    非常感谢

    • Jason Brownlee 2020年3月11日上午8:47 #

      不客气。

      • 大卫 2020年3月11日下午12:40 #

        嗨,又来了,我之前解释的损失结果是每个epoch拟合所有样本,持续了将近100个epoch。
        数据维度如下:
        输入 5395,23,1。
        输出 5395,23。
        每个样本的格式,正如我之前解释的:
        输入:________输出
        1,2,3___________4, 5,6
        2,3,4___________5, 6,7
        3,4,5___________6, 7,8
        这是否可能导致学习曲线几乎是平坦的?我应该按批次大小进行训练吗?

        • Jason Brownlee 2020年3月11日下午1:58 #

          也许吧,很难说。

          也许可以探索其他模型架构?其他学习率?其他优化器?等等。

  48. 法蒂赫 2020年3月25日上午12:46 #

    嗨,Jason,

    我尝试对CNN进行微调,用于14类图像分类。数据集有2000张图像。每个模型产生的损失值都在0.1到0.4之间。例如

    最佳epoch:20/50
    训练准确率:0.9268600344657898 训练损失:0.27140530943870544
    验证准确率:0.9145728349685669 验证损失:0.358508825302124

    您认为这些模型适合发表吗,还是一个好的模型损失值必须低于0.1?

  49. 贝尔 2020年4月5日下午5:35 #

    你好 Jason,
    损失值(y轴)是否有被认为是好的范围,比如说,最高损失值必须高于某个特定值?
    还是说每个问题都有自己的值范围,只有曲线的形状才重要?
    谢谢你

  50. ENGİN SEVEN 2020年4月14日上午10:33 #

    您好,杰森。我两周前发现了您的网站。您激励了我。我希望能见到您并与您握手致谢。请不要停止写作。

    伊斯坦布尔..

  51. 希瓦AB 2020年4月14日下午10:48 #

    您好,先生
    如果我获得了很高的验证准确率,但曲线不平滑怎么办?
    造成这种情况的原因是什么?
    谢谢

    • Jason Brownlee 2020年4月15日上午7:59 #

      可能是数据集太小或者模型方差太大。

      • 希瓦AB 2020年4月15日上午9:36 #

        那么这是好是坏呢?如果是坏的,我该如何解决这个问题?
        就我的情况而言:我使用AlexNet模型,数据集有1GB的.dicom文件(1000个.dicom),分为2个类别。

        谢谢您,先生。

        • Jason Brownlee 2020年4月15日下午1:21 #

          它只有相对于你在数据集上能达到的其他结果,例如相对于一个朴素模型,才是好或坏的。

  52. 阿克莎 2020年6月16日上午2:59 #

    什么是泛化误差?它是训练损失和验证损失之间的差距吗?

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

      泛化误差是模型在未用于训练模型的数据上产生的误差。即在新数据上的误差。

  53. 萨蒂卡 2020年6月22日上午3:12 #

    你好,我不清楚学习曲线是否可以作为LSTM的准确率度量?我们可以在任何预测模型上使用学习曲线,无论使用何种预测算法吗?深度学习算法的最佳准确率度量是什么?

  54. 2020年6月24日上午5:53 #

    这篇文章和图表非常有帮助。如果能提供Python代码以供详细理解,代码和图表可以并排显示,那就更好了。

    您是否可以提供带代码的示例???

  55. 腹肌 2020年6月28日上午9:16 #

    嗨,Jason,

    我有一个问题要问你。这与这篇帖子无关。

    我正在做一个基于深度学习的小型研究项目。我试图根据用户给其他电影的评分来预测用户将给一部未看过的电影的评分。我正在使用movielens数据集。主文件夹ml-100k包含100,000部电影的信息。为了创建推荐系统,使用了“堆叠自编码器”模型。我正在使用PyTorch进行编码实现。

    我将数据集分成训练集(80%)和测试集(20%)。我的损失函数是MSE。当我绘制训练损失曲线和验证曲线时,损失曲线看起来不错。它们之间显示出最小的差距。
    但是当我把损失函数改为RMSE并绘制损失曲线时。训练损失曲线和验证损失曲线之间存在巨大的差距。(epoch:200 训练损失:0.0757。测试损失:0.1079)

    在我的代码中,我只更改了损失函数部分(MSE到RMSE)。我应用了批量归一化和Dropout等正则化技术,但曲线之间仍然存在很大的差距。
    我是深度学习新手,但你知道为什么应用RMSE时曲线之间会有巨大的差距吗?
    这与评估指标有关,还是编码部分有问题?
    谢谢。

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

      我建议使用MSE损失,但可以计算RMSE的度量,例如不要使用RMSE训练模型,而只用于评估预测。

      • 腹肌 2020年6月29日上午9:28 #

        你好,Jason。
        感谢您的反馈。
        那么我只在测试模型时使用“RMSE”(损失函数)吗?
        而对于训练模型,我是否忽略损失函数部分,或者使用“MSE”作为训练模型的损失函数?

        • 腹肌 2020年6月29日上午10:27 #

          https://towardsdatascience.com/stacked-auto-encoder-as-a-recommendation-system-for-movie-rating-prediction-33842386338

          我的项目就是基于此。(点击链接)。

        • Jason Brownlee 2020年6月29日下午1:20 #

          使用RMSE作为度量。不要使用RMSE作为损失函数(例如,在拟合模型时不要最小化RMSE),使用MSE。

          • 腹肌 2020年7月1日上午9:51 #

            谢谢 Jason。
            我会尝试一下。
            顺便问一下,我有一些问题要请教你。
            我刚接触深度学习,对验证损失和测试损失的术语感到困惑。它们是相同的还是完全不同的?

            而且你不能在测试数据上训练模型吗?
            它是否只用于测试(评估预测)?

            我知道您不能审查我的数据,但是当我在代码中添加验证损失时,我重新使用了训练循环并删除了backward和optimizer.step()调用。我的度量标准是MSE。我假设验证损失与测试损失相同。但我可能错了。

            我想听听你对此的反馈。

          • Jason Brownlee 2020年7月1日上午11:22 #

            是的,我们可以在训练期间计算不同数据集上的损失,例如测试集和验证集,请参阅此处定义它们
            https://machinelearning.org.cn/difference-test-validation-datasets/

            选择模型和配置后,我们可以在所有可用数据上拟合最终模型。我们不能在测试数据上拟合模型来评估它,因为模型必须在未用于训练的数据上进行评估,才能给出公平的性能估计。

  56. 腹肌 2020年7月4日上午10:48 #

    谢谢 Jason。
    现在我理解了验证集和训练集的概念。

    在我的小项目中,我根据用户给其他电影的评分来预测用户将给一部未看过的电影的评分。我使用的模型是堆叠自编码器。
    对于我的另一个任务,我想与其他深度学习模型进行比较。例如,我想使用MLP(多层感知器)或逻辑回归(机器学习模型)。是否可以使用这些模型进行0到5的电影评分预测?
    谢谢。

  57. 亚伦 2020年7月14日上午12:04 #

    我正在构建一个用于预测的LSTM模型。验证误差曲线是平坦的,最终验证MSE小于训练MSE。val_loss=0.00002,training_loss = 0.013533。

    我仔细阅读了您的文章,但我不敢确定我的验证集是否不具代表性。我应该扩大我的验证集吗?

    这是图表和问题
    https://stackoverflow.com/questions/62877425/validation-loss-curve-is-flat-and-training-loss-curve-is-higher-than-validation

    谢谢。

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

      可能您的验证集不具有训练的代表性,或者太小。

  58. QUANG HUY CHU 2020年7月21日下午9:46 #

    你好,Jason。

    感谢您的帖子,我知道了什么是欠拟合、过拟合和良好拟合。

    我目前也在构建一个小型ANN模型(95个输入,3个类别输出,2个隐藏层分别有200个节点和30个节点)。

    我的数据集很小(105个样本,每个样本有95个特征),形状为(105, 95)。我将数据分为训练数据(80个样本)、验证数据(10个样本)和测试数据(15个样本)。

    我的问题是我尝试训练、验证和预测我的模型10次。大约7或8次我观察到良好的拟合(训练-验证准确率和损失图),而另外3或2次我得到了过拟合。这种现象正常吗?即使它过拟合,对测试数据的预测也相当好(超过85%)。

    非常感谢您的帮助。

    • Jason Brownlee 2020年7月22日上午5:31 #

      也许您可以更改配置,使模型平均而言更稳定。

  59. QUANG HUY CHU 2020年7月22日上午10:13 #

    嗨,杰森。谢谢你的回复。

    您这里说的配置是指超参数(比如层数、节点数或训练测试拆分等)对吗?

  60. 2020年7月23日上午5:01 #

    我们有学习曲线的真实世界例子吗????

    那样会更好地理解和绘制它。

  61. nkm 2020年7月23日下午4:47 #

    嗨,Jason,

    感谢您的巨大支持。

    我想问一下,在训练周期中,验证曲线呈锯齿状/拥挤的可能原因,以及如何最小化/缓解它。通常,训练曲线变化平滑,但验证曲线不平滑。请指导。

  62. 朱莉娅 2020年8月5日上午3:57 #

    嗨,Jason,
    有没有办法将这些行为归因于模型架构/超参数设置,而不是训练/验证数据分布?我之所以问,是因为我在使用完全相同的训练/验证数据进行超参数搜索时,得到了具有与您给出的上述三个示例相似的训练/验证曲线的模型(如果我能在这里嵌入图片,我会的)。

    模型1:曲线看起来像您给出的“不具代表性的训练数据集”示例;模型2:看起来像您给出的“不具代表性的验证数据集”示例;模型3:看起来像您给出的“验证数据集可能比训练数据集更容易让模型预测”示例。

    您对此有什么直觉吗?不胜感激。

    感谢您的博客,我多次引用它!

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

      学习曲线受模型结构和学习算法配置的影响较大,数据的影响较小——如果处理得当的话。

      这里“不具代表性”意味着您的样本太小。

  63. 丑丑 2020年8月11日下午8:27 #

    你好!

    这篇帖子很有趣,谢谢。不过,我有一个关于我所做的训练的问题。我是深度学习的新手,我使用了一个已经写好的代码。我未能成功绘制验证曲线(我想你指的是我所说的“测试”)。我只有训练+验证的损失曲线,但没有测试的损失曲线。我训练我的神经网络50个epoch,我只知道
    -验证(不是测试)的中间准确率值(在每5个epoch保存权重后)
    -所有epoch结束后训练+验证的准确率值
    -测试集的准确率。

    我在训练+验证后获得了94%的准确率,在测试后获得了89.5%的准确率。关于训练+验证的损失函数,它在35个训练epoch后稳定在0.1以下的值。总共有50个训练epoch。

    训练+验证和测试的准确率之间只有很小的差异,是否足以说明我的网络没有过拟合?

    • 丑丑 2020年8月11日下午8:30 #

      我想说的是“它停滞在一个值...”

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

      谢谢!

      没问题,用val代替test。

      如果保留数据集太小,结果会不稳定。

      • 丑丑 2020年8月12日上午6:30 #

        谢谢您的回答。我不明白您为什么说“用val代替test”。实际上,我的代码唯一能做的就是
        -绘制验证的准确率曲线(每5个epoch已知准确率)
        -已知50个epoch后验证的准确率值
        -已知测试的准确率值

  64. 米歇尔 2020年8月15日上午12:13 #

    嗨,Jason,
    再次感谢您的文章。
    在整个深度网络训练过程中,验证数据损失和训练数据损失都随着epoch的增加而减少。但是验证数据损失的减少量远小于训练数据损失的减少量,这正常且具有代表性吗?

    当epoch从0开始较小时,训练数据损失曲线开始时较高,然后随着epoch的增加而减少,但验证数据损失曲线已经开始较小,然后随着epoch的增加而略微减少。
    谢谢你。

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

      也许你的验证数据集太小了?

      • 米歇尔 2020年8月17日上午2:35 #

        谢谢您,Jason,我尝试从训练数据中获取更多样本到验证数据中以增加验证数据样本大小,但学习曲线仍然显示,尽管验证数据损失和训练数据损失都随着epoch的增加而减少,但验证数据损失的减少量远小于训练数据,最终,训练数据损失(mse,均值0和标准差1的标准化数据)为0.25,而验证数据损失为0.41,这仍然是过拟合吗?
        不同的文献总是说好的拟合是验证损失略高于训练损失,但“略高于”有多高,您能否给些提示?

        一如既往地感谢您。

        • Jason Brownlee 2020年8月17日上午5:49 #

          干得不错。

          也许可以尝试使用备用学习率或添加正则化来减缓学习速度。

          如果行为顽固地保持不变,也许您已达到了所选模型在您的数据集上的极限。

  65. 丑丑 2020年8月26日下午6:54 #

    感谢您8月12日的回复。但我仍然不确定是否理解。在这篇文章(本页面)中,您所说的“训练”和“验证”是指什么?它的含义与这篇文章中相同吗?:https://machinelearning.org.cn/difference-test-validation-datasets/

    我在神经网络的最后一次验证(=最终模型在验证数据集上的结果)后得到了结果(F1分数、精确度、召回率等)。我还使用测试集评估了神经网络在新图像上的性能后的结果。验证集和测试集上的结果略有不同(准确率相差4.5%),测试集上的准确率略差(4.5%)。这就是我们所说的“泛化差距”吗?为什么测试集上的结果会略差(4.5%)?

    感谢您的帮助

  66. 丑丑 2020年8月28日上午1:35 #

    非常感谢您的回答。这篇其他文章非常有趣。就我的情况而言,我使用神经网络进行语义分割(SegNet)。在最后一次验证(=最终模型在验证数据集上的结果)后,我获得了91.1%的准确率。使用此最终模型在测试数据集上,我获得了85.9%的准确率。从您的文章“每次结果都不同……”来看,我猜测我可以将这种差异解释为我的模型具有高方差(验证数据集和测试数据集具有不同的图像,每张5000*5000像素的图像有3张)。这是正确的吗?在您的文章中,您似乎只谈论训练数据的方差,所以我不确定我的假设是否正确。

    感谢您的帮助

  67. 塞萨尔 2020年9月1日下午11:32 #

    嗨,Jason,感谢您的这篇帖子和您的博客!我最近开始了我的ML/DL之旅,我发现您的博客非常有帮助。

    我有一个关于训练/验证损失的问题。如果一个模型只在最初的n次迭代中学习,然后损失和准确率在第一个epoch期间就达到了一个平台,并且第一个epoch后的验证损失很大,那该怎么办?我正在使用Adam,参数默认。

    • Jason Brownlee 2020年9月2日上午6:29 #

      当模型停止学习时就停止训练。也许可以尝试模型或学习算法的其他配置。

  68. 忒提斯 2020年9月15日上午9:16 #

    对于第三个图,它显然是过拟合现象。但是继续训练有害吗?因为继续训练无论如何都不会增加验证损失,至少目前是这样。我之所以问这个问题,是因为我见过一种特定的行为,即模型像第三个图一样过拟合,但如果训练过程继续,验证集的准确率和IoU仍然会增加。您怎么看?

    • Jason Brownlee 2020年9月15日下午2:50 #

      第三张图名为“训练和验证学习曲线示例,显示过拟合模型”,显示了过拟合。

      在这种情况下继续训练将导致训练集上的性能更好,而在保留集和任何其他新数据上的泛化误差更差。

      损失的行为通常与其他指标相对应。但这是一个好点,也许可以绘制您打算用来选择模型的指标。

  69. 阿耶什 2020年11月3日下午4:47 #

    在训练数据集不具代表性的情况下(如果我无法增加数据集),可以采取哪些改进措施?

    • Jason Brownlee 2020年11月4日上午6:35 #

      您的模型效果只与您的训练数据集一样有效。

      也许可以尝试过采样,例如SMOTE。
      也许可以尝试数据清洗,使决策边界更清晰。
      也许可以尝试变换以找到更合适的表示。

  70. 科乔维 2020年11月13日上午12:19 #

    您好,文章很棒。不过我有一个问题。
    以下两者有什么区别?
    – 机器学习学习曲线(如本文所述)和
    – 学习曲线理论作为图形表示人对某项任务的熟练程度与经验量之间关系的方式)https://en.wikipedia.org/wiki/Learning_curve

    感谢您的宝贵时间

  71. Tanuja Shrestha 2020年11月19日下午9:07 #

    嗨,Jason,

    您对模型学习曲线在第一个epoch就出现损失0和准确率1的现象有什么建议?

    另外,这可能的原因是什么?

    有没有相关链接讨论这个问题?

    一如既往地感谢。

  72. 马龙·洛尔巴赫 2020年12月22日上午3:58 #

    你好 Jason,

    我有一个关于我的学习曲线的问题。我本来想把我的问题发布到stat.stackexchange上,但我觉得我更信任你....

    1. 我有一个包含23,000条记录的数据集,我有一个二分类任务。目标变量的分布是87%对13%。XGB分类器在我的数据上表现最好,总体准确率达到97.88%。

    我的曲线看起来像这样:
    https://ibb.co/NsnY1qH

    如您所见,我正在使用对数损失进行评估。我的解释是它没有过拟合或欠拟合数据,并且我可以继续。

    2. 我对数据的最后13%(正样本)有一个回归任务,我必须预测不同的合同值。

    我的学习曲线看起来像这样
    https://ibb.co/MnZbB15

    我在这里的解释是,我需要更多数据才能做出好的预测。合同价值范围从0到200,000美元,分布非常偏斜…

    一如既往地感谢您的支持!

    马龙

    • Jason Brownlee 2020年12月22日上午6:50 #

      抱歉,我尽量避免为读者解释结果。

      相反,我提供一般性建议,以便您自己解释结果。或许可以探索额外的模型、配置和数据预处理,看看是否能取得更好的结果,否则可能您已经达到了数据集的极限。

      • 马龙 2020年12月22日下午5:11 #

        对不起,我不知道,谢谢

  73. 费利佩·阿拉亚 2021年1月27日上午11:04 #

    非常棒的帖子,信息量很大。如果您不介意,我还有几个问题想问。

    1. 当您提到验证集时,您实际上是指三部分数据集(训练/验证/测试)中的验证集吗?只是想确认一下,因为有些地方将测试集称为验证测试。

    2. 有没有可用的代码,我们可以用来复现您展示的图表?(如果能提供,将不胜感激)

    3. 如果我错了,请纠正我,如果我进行嵌套交叉验证,我认为我不需要绘制学习曲线,因为我理论上已经达到了最佳可能的模型性能和泛化(在数据量充足、迭代次数和特征数量正确以及超参数值正确的情况下)。所以,在我看来,通过使用嵌套交叉验证,我无法再做任何事情来减少过拟合,因此学习曲线是不必要的,对吗?

  74. 维什纳维 2021年2月12日上午12:07 #

    嗨,Jason,

    如果数据集有3个或更多特征X1、X2、…,我想绘制一个输出变化与所有特征X1、X2、…的图表,我该怎么做?它在机器学习中有什么意义?

    谢谢你

  75. Tanuja Shrestha 2021年2月12日下午9:17 #

    嗨,Jason
    我的模型学习曲线,损失曲线——训练和测试——都正常,但是训练和测试的准确率从第一个epoch开始就达到了100%。

    我该怎么办?

    有什么建议吗?

    一如既往地感谢您!

  76. 本尼 2021年3月31日下午11:36 #

    你好,
    如果您能诊断我的学习曲线,我将不胜感激:https://imgur.com/a/z5ge9QI
    我得到的准确率是97%,但我不知道根据我得到的学习曲线,模型是过拟合还是欠拟合。
    谢谢你。

    • Jason Brownlee 2021年4月1日上午8:19 #

      抱歉,我避免尝试为读者解释结果。

      相反,我提供一般性建议,以便您自己解释结果。

  77. 盖肯 2021年4月28日下午1:36 #

    嗨,谢谢您的信息丰富的帖子!如果我的Python应用程序每次运行时生成的学习曲线彼此差异太大怎么办?有时验证曲线太嘈杂,有时它与训练曲线收敛。这说明了数据集什么问题,还是我的曲线生成代码有问题?谢谢!

  78. 大卫·埃斯皮诺萨 2021年6月2日下午2:38 #

    你好 Jason,

    谢谢教程,没有什么比刷新基础知识更好的了。

    你知道,我多次遇到与标有“训练和验证学习曲线示例,显示验证数据集比训练数据集更容易预测”的图表相似的行为。我们应该增加验证集的大小,并减少训练集的大小,对吗?

    举个例子:如果我以80%训练和20%验证的比例获得了这个图表,那么为了更好地拟合,一个好的方法是尝试70%-30%吗?我希望在这里得到一些“基于经验”的回答,因为你知道,“试错法”有时可能需要几个小时……

    我一直通过使用回调来解决这个问题,但也许我限制了模型的学习能力,所以这可能是意识到我(可能)一直做错了什么的时机……

    谢谢你,祝好。

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

      谢谢。

      我经常选择50-50,然后重复几次实验来平均结果。

  79. 伊卜蒂萨姆 2021年6月10日下午11:16 #

    您好,先生,

    我的问题是回归,我有两个模型
    当我用第一个模型绘图时:得到了一个很好的拟合,但RMSE的值不好
    但当我用第二个模型绘图时,测试损失曲线位于训练损失曲线下方,两者之间的差异与“不具代表性的验证数据集”的情况几乎相似(训练损失下降并稳定),但RMSE值优于第一个模型
    我有191981个训练样本/47996个测试样本
    请问第二个模型正确吗?

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

      也许可以测试一套不同的模型,然后使用针对您选择的特定指标表现最佳的模型。

  80. 西尔维娅 2021年6月16日下午5:35 #

    感谢Jason的信息丰富文章。

    请问有什么可能的解决方案来解决不具代表性的验证数据集问题吗?

    我正在将其应用于心电图问题,其中不同患者具有不同的心动周期模式。因此,尽管有大约4000个正常的训练模式可供学习,但由于问题本身的固有性质(即每个患者的心电图模式都有一些差异),它们看起来都不同。

    谢谢。

    • Jason Brownlee 2021年6月17日上午6:14 #

      您可以尝试使用大型数据集进行验证,例如50/50的训练分割。

      不确定验证集如何用于时间序列,可能不是一个有效的概念。

  81. 比尔 2021年6月23日下午11:26 #

    你好,
    这是过拟合吗?
    https://ibb.co/Z6nrXM4

    非常感谢

  82. 西尔维娅 2021年6月30日上午2:00 #

    好的,非常感谢您提供的参考资料。

  83. 普尼特·赛 2021年8月12日上午3:55 #

    https://docs.google.com/document/d/1Va__vfW7JaXSLOsRuC5mXX4T1333AUPI/edit?usp=sharing&ouid=107190645093315861813&rtpof=true&sd=true

    我想问Jason,找到拐点的最佳实践是什么?

    在上面的学习曲线中,我们可以看到损失持续下降,但val_loss有一个突起。

    val_loss@ 0,01 ( epoch 0 – 20) 点A 拐点给出更接近的预测。

    人们是否使用相同时间内损失的百分比下降和val_loss的百分比增加来识别拐点。

    我之前在epoch 40-60之间使用拐点B,当时val_loss约为0.02,但这会产生较大的预测误差。

    然后我观察到,在epoch 15-50之间(这些是近似值),损失下降了8%,而val_loss增加了100%。

    这是否足以作为停止训练并选择点A作为拐点的标准?

    谢谢

    • Adrian Tam
      艾德里安·谭 2021年8月12日上午6:09 #

      在训练时,损失持续下降而验证损失在一段时间后可能上升是正常的。那就是过拟合的开始。你可以查看关于提前停止的帖子以了解更多信息:https://machinelearning.org.cn/how-to-stop-training-deep-neural-networks-at-the-right-time-using-early-stopping/

      • 普尼特 2021年8月13日上午4:27 #

        除非我没有正确理解提前停止和最佳模型,否则我认为以下算法将给出最佳epoch,而且我不认为它是由两者中的任何一个给出的。

        对于一个epoch要成为最佳epoch,损失在所有epoch中应该是最小的,并且该epoch的验证损失也应该是最小的。例如,如果最佳epoch的损失为0.01,验证损失为0.001,则不存在其他epoch的损失小于等于0.01且验证损失小于0.001。

        最佳模型只单独考虑验证损失。它应该与损失协调一致。

        因此,我们需要实现上述算法来获得最佳epoch,因为并非所有的学习曲线都是平滑的,并且存在凹凸不平的情况。
        不确定提前停止在这里也有助于准确地获得那个最佳epoch。

        想法?

        • Adrian Tam
          艾德里安·谭 2021年8月13日上午5:03 #

          根据Keras关于提前停止模块的文档,“当监控的指标停止改进时停止训练。”您可以决定要监控哪个指标。默认是val_loss,希望能有所帮助。

  84. 奥努尔 2021年8月13日下午9:19 #

    你好,

    我正在尝试构建一个3D CNN回归网络。我的输入数据是(64,64,64)体素。输出是0-5之间的数值。我尝试了一些文献中的模型进行特征选择。我还对输出数据使用了最小-最大归一化、对数归一化和标准化。尽管我使用了Dropout和小型网络以及全连接部分的节点,但我的验证损失并没有像训练损失那样得到很好的下降。

    验证损失略有增加,例如从 0.016 增加到 0.018。但即使在第一个 epoch 中,验证损失也以非常小的数字开始。我该怎么办?

    谢谢回复

    • Adrian Tam
      Adrian Tam 2021 年 8 月 14 日凌晨 3:22 #

      验证损失值取决于数据的规模。值 0.016 可能没问题(例如,预测一天的股票市场回报),也可能太小(例如,预测股票市场的总交易量)。要检查,您可以查看验证损失的定义方式以及输入的规模,并思考这是否有意义。

  85. HackerCop 2021 年 9 月 5 日晚上 8:41 #

    先生,这些是我的模型结果。https://snipboard.io/7kWsuz.jpg 想必这是因为我的数据集不具代表性,如果您能澄清一下就太好了。谢谢

    • Jason Brownlee 2021 年 9 月 6 日凌晨 5:18 #

      看起来验证集很小/有噪声。可能 epoch 数量也太少了。

  86. sam 2021 年 10 月 11 日凌晨 3:13 #

    你好,Jason 博士;

    我的数据集训练有 30,000 张图像,测试有 5000 张。我得到了这样的图表
    https://ibb.co/Wpmzmh3
    请问如何解决这个问题?epoch 在第 26 个 epoch 停止

    • Adrian Tam
      Adrian Tam 2021 年 10 月 13 日上午 7:14 #

      训练损失和验证损失之间的差异不是很大。这是一个问题吗?我看到你的模型收敛很快。

  87. Bruce 2021 年 12 月 24 日下午 2:18 #

    你好,Jason 博士,你的帖子非常有用。我训练了四个回归模型,学习曲线显示在链接中。你对这些模型有什么看法?我可以使用它们进行预测吗?
    https://docs.google.com/document/d/1_OjzPLk9QBPVR1aNFNQGDOZIJSUfTUcF5mFvEGZa0A0/edit?usp=sharing

    • James Carmichael 2022 年 1 月 10 日上午 11:33 #

      你好 Bruce……虽然我不能直接评论你的项目,但我建议你利用一个朴素模型来建立一个性能基线,然后根据均方根误差将每个模型的性能与此基线进行比较。

  88. AGGELOS PAPOUTSIS 2022 年 1 月 13 日下午 6:35 #

    大家好

    我正在尝试理解一个分类问题的学习曲线。但我不太确定要推断出什么。我相信我存在过拟合,但我不能确定。

    1. 训练损失非常低,在添加训练示例时略有增加。
    2.“在添加训练示例时,验证损失逐渐下降(没有变平)”。
    然而,我没有看到线条末端有任何间隙,这通常可以在过拟合模型中找到

    另一方面,我可能存在欠拟合,因为

    1. 欠拟合模型的学习曲线在开始时具有较低的训练损失,在添加训练示例时逐渐增加并保持平坦,表明添加更多训练示例无法提高模型在未见数据上的性能
    2. 训练损失和验证损失在末尾彼此接近

    然而,训练误差并不是很大,这通常在欠拟合模型中发现

    我很困惑,您能给我一些建议吗?

    https://i.stack.imgur.com/xGKAj.png
    https://i.stack.imgur.com/gkRMn.png

  89. Jurrian 2022 年 1 月 26 日凌晨 12:40 #

    欠拟合的第二个示例曲线是如何工作的?为什么验证损失低于训练损失?这是标签错误,还是我遗漏了什么?谢谢。

  90. Belal 2022 年 3 月 8 日上午 8:40 #

    健康领域学习曲线的类型以及过去和现在的区别是什么

    • James Carmichael 2022 年 3 月 9 日上午 5:57 #

      你好 Belal……请详细说明和/或重新措辞你的问题,以便我更好地帮助你。

  91. Belal 2022 年 3 月 10 日上午 5:00 #

    健康领域学习曲线的类型以及过去和现在的区别是什么

  92. Dion 2022 年 3 月 13 日上午 7:59 #

    “模型的损失几乎总是低于验证数据集的训练数据集”,然后你直接继续展示一个验证损失低于训练损失的图。你能解释一下吗?

  93. Wyatt 2022 年 3 月 29 日晚上 9:28 #

    嗨 James,

    我实际上遇到了一个让我困惑的情况,即训练损失持续下降,而验证损失趋于稳定(大约在 60/100 epoch)。“泛化差距”越来越大(10/100 epoch 后验证损失高于训练损失)。

    你认为这是一种欠拟合吗?

    非常感谢!

  94. RJ 2022 年 6 月 10 日凌晨 3:35 #

    谢谢!我在这篇文章中学到了很多,但我仍然有一个问题要问。我认为我存在训练数据不具代表性的问题(我的数据是图像),但我在训练集和验证集中都有相同类别的分布。对于如何解决这个问题,你有什么建议吗?我也无法改变分割比例(我的分割是 8:1:1 训练:验证:测试),因为我的数据非常有限,我已经进行了数据增强,但无济于事,差距仍然存在。这可能是什么问题?

    • James Carmichael 2022 年 6 月 10 日上午 9:27 #

      你好 RJ……非常欢迎你!你能详细说明你的模型性能出现的问题,以便我们更好地帮助你吗?

  95. Talal Ahmed 2022 年 7 月 8 日凌晨 2:42 #

    我正在处理一个分类问题,我在学习曲线中遇到了一个奇怪的行为。我绘制了损失曲线和准确率曲线。我的模型在训练集上的准确率为 84%,在测试集上为 72%,但当我观察损失图时,训练损失正在下降,但验证损失没有。

  96. Jane NI 2023 年 10 月 11 日晚上 7:37 #

    你好 James,你能给我一个提示吗,为什么我的 MLP 模型的训练损失看起来像是一个很好的拟合模型,但它的验证损失几乎是一条直线,就像这篇文章中第一个欠拟合学习曲线中的那样?

发表评论

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