为什么我的结果不如我所料?您可能过拟合了

我们都知道运行分析并看到结果如我们所愿时的满足感:准确率80%;85%;90%?

我们非常想直接转向我们正在撰写的报告的结果部分,然后填入这些数字。但请稍等:一如既往,事情并非如此简单。

屈服于这种特殊的诱惑可能会削弱本已完全有效分析的影响力。

对于大多数机器学习算法,思考这些结果是如何产生的非常重要:不仅是算法本身,还有数据集以及它是如何被使用的,都可能对获得的结果产生重大影响。应用于过小数据集的复杂算法可能导致过拟合,从而导致误导性的好结果。

Light at the end of the tunnel

隧道尽头的光明
照片由 darkday 提供,部分权利保留

什么是过拟合?

过拟合发生在机器学习算法,例如分类器,不仅识别了数据集中的信号,还识别了噪声。所有数据集都有噪声。实验中记录的值可能会受到一系列问题的影响

  • 机械问题,例如温度或湿度改变记录设备的特性;
  • 物理问题:有些老鼠比其他老鼠大;
  • 或者仅仅是调查系统中的固有噪声。例如,DNA产生蛋白质的过程本身就有噪声,它不像通常可视化那样以稳定流的形式发生,而是以一系列步骤发生,每一步都是随机的,取决于在适当的时间是否存在适当的分子。
  • 从人类受试者那里收集的数据同样受到诸如一天中的时间、受试者的健康状况甚至情绪等因素的影响。

随着数据集中参数数量的增长,情况会变得更糟。例如,一个包含100条记录、每条记录有500个观测值的数据集非常容易过拟合,而包含1000条记录、每条记录只有5个观测值的数据集则问题要小得多。

当你的模型拥有的参数相对于数据点数量过多时,你可能会高估模型的效用。

— Jessica Su 在“过拟合的直观解释是什么?

为什么过拟合是个问题?

大多数机器学习算法的目标是从数据中的信号(重要值)到输出找到一个映射。噪声会干扰这个映射的建立。

过拟合的实际结果是,一个在训练数据上表现良好的分类器,在来自同一问题的新数据上可能表现不佳,甚至可能非常糟糕。数据中的信号从一个数据集到另一个数据集通常是基本相同的,但噪声可能非常不同。

如果一个分类器能像拟合信号一样拟合噪声,那么它将无法在新数据上区分信号和噪声。而开发大多数分类器的目标是让它们能够以可预测的方式泛化到新数据。

过拟合的模型通常会具有较差的预测性能,因为它会夸大数据中的微小波动

— 过拟合,维基百科

克服过拟合

克服过拟合主要有两种方法:三数据集验证和交叉验证。

三数据集验证

有道德的分析师如何克服过拟合问题?最简单但最难实现的解决方案是拥有大量数据。有了足够的数据,分析师就可以在一组数据(训练集)上开发算法,然后在同一来源生成的一组全新、未见过的数据集(测试集)上测试其性能。

只使用两个数据集的问题在于,一旦你使用了测试集,它就变得受污染了。训练集1、测试集2,然后使用这些测试结果来修改算法的过程意味着集2实际上是训练数据的一部分。

为了完全客观,需要第三个数据集(验证集)。验证集应该在所有训练完成之前保持其“辉煌的孤立”。训练好的分类器在验证集上的结果应该是要报告的结果。

一种流行的方法是使用训练集训练分类器,并且每隔几次迭代,测试其在测试集上的性能。最初,随着数据集中的信号被拟合,训练集和测试集上的误差都会下降。

然而,最终,分类器将开始拟合噪声,尽管训练集上的错误率仍然下降,但测试集上的错误率将开始上升。此时应停止训练,并将训练好的分类器应用于验证集以估算实际性能。

因此,该过程变为:

  1. 开发算法;
  2. 在数据集1(训练集)上训练;
  3. 在数据集2(测试集)上测试;
  4. 根据步骤3的结果修改算法或停止训练;
  5. 迭代步骤1-4,直到对算法结果满意为止;
  6. 在数据集3(验证集)上运行算法;
  7. 报告步骤6的结果。

遗憾的是,很少有项目能生成足够的数据供分析师奢侈地使用三数据集方法。必须找到一种替代方法,其中每个结果都由一个未在该数据项中训练的分类器生成。

交叉验证

在使用交叉验证时,整个可用数据集被划分为大小大致相等的子集。假设我们有一个包含100个观测值的数据集。我们可以将其划分为三个子集,分别包含33、33和34个观测值。我们称这三个子集为set1、set2和set3。

为了开发我们的分类器,我们使用三分之二的数据;例如set1和set2,来训练算法。然后我们在set3上运行分类器,记录这些迄今未见过的数据的结果。

然后重复该过程,使用另外三分之二的数据,例如set1和set3,并记录set2上的结果。同样,用set2和set3训练的分类器会产生set1的结果。

然后将这三个结果集合并,成为整个数据集的结果。

上述过程称为三折交叉验证,因为使用了三个数据集。可以使用任意数量的子集;十折交叉验证被广泛使用。当然,最终的交叉验证方案是,用除一个样本之外的所有数据训练每个分类器,然后将其应用于被排除的样本。这种做法被称为留一法验证。

交叉验证在防止检验由数据提出的假设(称为“III型错误”)方面很重要,尤其是在进一步采样危险、昂贵或不可能收集的情况下。

— 过拟合,维基百科

交叉验证在避免过拟合方面的优势

任何形式的交叉验证的主要优势在于,每个结果都是使用一个未在该结果上训练过的分类器生成的。

此外,由于每个分类器的训练集构成了大部分数据,因此这些分类器虽然可能略有不同,但应该大体相同。这在留一法的情况下尤其如此,其中每个分类器都在几乎相同的数据集上训练。

交叉验证的缺点

使用交叉验证有两个主要缺点

  1. 用于生成结果的分类器不是一个单一的分类器,而是一系列密切相关的分类器。如前所述,这些分类器应该很相似,而这个缺点通常不被认为是主要缺点。
  2. 测试集不能再用于修改分类算法。因为算法使用大部分数据进行训练,然后在较小的子集上进行测试,所以这些结果不能再被认为是“未见过”的。无论结果如何,都应该报告它们。理论上,这是一个重大缺点,但实际上很少如此。

总而言之,如果数据充裕,应使用三数据集验证方法。然而,当数据集有限时,交叉验证以一种有原则的方式最有效地利用数据。

统计方法

由于过拟合是一个普遍存在的问题,因此有大量研究致力于通过统计方法来避免该问题。一些包含对这些方法良好覆盖的经典教科书包括

避免过拟合教程

例如,使用R统计语言及其代码,请参阅“评估模型性能 – 过拟合和数据大小对预测影响的实际示例“。

要获取使用SPSS的详细教程,请参阅幻灯片 “逻辑回归 – 完整问题”(PPT)。

有关SAS用户指南的介绍,请参阅“GLMSELECT过程“。

进一步阅读

在MIT技术评论上可以找到关于过拟合实际影响的有趣概述,标题为“大数据实时预测的新兴陷阱“。

CalTech在YouTube上提供了一个精彩的入门讲座,标题为“过拟合

一篇来自Vrije Universiteit Amsterdam的更详细的文章,标题为“你所看到的可能并非你得到的:回归类模型过拟合的简短、非技术性介绍”(PDF)。

对《为什么我的结果不如我预期的好?你可能过拟合了》的6条回复

  1. Magnus Wik 2017年4月20日 下午5:28 #

    你好,
    用于验证和避免过拟合的是验证集,而不是测试集。

    • Jason Brownlee 2017年4月21日 上午8:33 #

      也许吧,这取决于测试框架的具体情况。

      • Magnus 2017年5月8日 下午5:44 #

        你的意思是,例如,如果使用了CV?
        我认为许多书籍和网站混淆了验证和测试这两个词。对我来说,测试集是在最后阶段,在最终模型之前使用的。

        • Jason Brownlee 2017年5月9日 上午7:39 #

          那将是验证集。用于验证最终模型。测试集用于模型选择。

  2. ogunleye 2017年5月6日 上午11:02 #

    你好,先生,
    你在传播机器学习的福音方面做得很好。我对ML是新手。我看到你的大多数图表只包含训练和测试图。我看到过一些图表包含训练、测试和验证图。我的问题是,如果我们使用交叉验证,可以将其与训练和测试图一起绘制吗?

    • Jason Brownlee 2017年5月7日 上午5:32 #

      是的,你需要保留每个CV折叠的所有预测。

发表回复

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