这些专栏文章将探讨一个主题,解释相关背景知识,并就一些来自 MATLAB 和 Simulink 社区的问题进行解答。
本文主要介绍模型验证及其相关主题,如过拟合和超参数调优。我将概括介绍该主题及其重要性,然后探讨以下四个问题:
模型验证是机器学习的一项基础方法。如果使用得当,它将帮助您评估机器学习模型在新数据上的表现。这可以提供两方面的帮助:
- 它可以帮助您确定要使用的算法和参数。
- 它可以防止训练过程中出现过拟合。
当我们用手头的数据集解决问题时,找到合适的机器学习算法来创建模型非常重要。每个模型都有自己的优点和缺点。例如,某些算法能更好地处理小型数据集,另一些算法则在处理大量高维数据时表现出色。因此,两个不同的模型可能基于同一个数据集预测出不同的结果,并且具有不同的准确度。
为您的数据找到最佳模型是一个交互式过程,需要测试不同的算法以最大程度地减少模型误差。控制机器学习算法行为的参数称为超参数。根据超参数取值的差异,所得的模型可能大相径庭。因此,通过调整超参数的值,您可以得到不同并且有可能更好的模型。
如果没有模型验证,很容易不知不觉将模型调整到过拟合的程度。您的训练算法应该调整参数以最小化损失函数,但有时会做得太过。发生这种情况时,模型将变得过拟合,也就是说,模型过于复杂,不能很好地处理新数据。我将在下面的问题中更深入地探讨这一点。
要测试您的模型在新数据上的表现,可以使用模型验证,方法是对数据集进行划分,然后使用一个子集训练算法,使用其余数据测试算法。
由于模型验证并未将全部数据用于构建模型,因此是防止训练过程中出现过拟合的一种常用方法。
现在讨论第一个问题。
如果您想深入了解有关使用 MATLAB 进行交叉验证和超参数优化的函数和语法,请参见:模型构建和评估。
看样子您的模型是过拟合了,也就是说您的模型完全跟着训练集走,但不知道如何对新输入或数据作出响应。模型对训练所用数据集的响应“好过头了”。
一开始,过拟合模型可能会显得很成功,因为它在训练集上的误差很小。然而,模型在测试集上的误差会变大,也就不那么准确了。
模型过拟合的最常见原因是训练数据不足,因此最好的解决方法是收集更多的数据,更好地训练模型。但是,您不仅需要更多的数据,还需要确保这些数据足以代表模型的复杂性和多样性,以便模型知道如何对其作出响应。
2. 我知道数据需要分组,但是我以为测试数据集和训练数据集的用途相同。它们之间有什么区别?
实际上,测试数据集和训练数据集是不同的。在前面介绍模型验证时,我谈到了模型验证如何将数据划分为这样两个子集,接下来我深入探讨一下。
模型验证使用随机划分到不同子集的数据,通过调整模型来对新输入作出正确的响应,从而降低模型过拟合的风险。两种典型的数据子集如下:
- 训练集 - 这部分数据用于训练和拟合模型并确定参数,通常占数据的 60-70%,需要反映模型的复杂性和多样性。
- 测试集 - 这部分数据用于评估模型的性能,通常占数据的 30-40%,同样需要反映模型的复杂性和多样性。
由于这两个数据集都需要反映模型的复杂性和多样性,因此数据应该是随机划分的。这种方法也会降低模型过拟合的风险,帮助我们得出更准确但更简单的模型,以将其结果用于研究。
如果我们使用非随机选择的数据集训练模型,则就这一特定数据子集而言,模型将得到很好的训练。问题在于,非随机数据不能代表其余数据,也不能代表我们要用模型处理的新数据。比如说,我们要分析一个城镇的能源消耗。如果我们用于训练和测试的数据集不是随机的,只包含周末的能源消耗数据(通常低于工作日),那么当我们将该模型应用于新数据(例如新月份)时,它会是不准确的,因为它只代表周末。
为了形象说明,我们来看两个基于同一训练数据集的模型。这里使用的是机器学习入门之旅中的一个基本示例。以下是一个简单模型和一个复杂模型:
简单模型
84% 准确度
复杂模型
100% 准确度
我们会看到,复杂模型可以更好地适应训练数据,其准确度为 100%,而简单模型为 84%。我们会倾向于认为复杂模型胜出。但是,让我们看看如果将测试数据集(未在训练中使用的新数据)输入这些模型会有什么结果:
简单模型
70% 准确度
复杂模型
60% 准确度
比较两种模型的性能时,我们会发现简单模型的准确度从 84% 下降到 70%;然而,相比复杂模型 40 个百分点的跌幅(从 100% 降至 60%),这点变化就不那么明显了。总结一下,对此分析而言,简单模型更好、更准确,同时我们也看到,使用测试数据集来评估模型非常重要。
最后,还有一个建议。为了降低变异性,不妨使用数据集的多种划分进行多轮模型验证,以使模型更好地适应您的分析。这种方法称为 K 折交叉验证。了解其他交叉验证方法。
我使用的示例可以在机器学习入门之旅中找到。以下是来自该培训课程的一段视频:
3. 我以为只要有训练集和测试集就够了;一定还要有验证数据集吗?我真的需要再次拆分我的数据吗?
很遗憾,验证集再次遭到误解。这是一个常见的问题。一般情况下,没有人会质疑训练集和测试集的必要性,但验证集的必要性则不是那么确凿。简单的解释是,超参数调整中需要使用验证集,以查看调整是否有效,换句话说,能否在完整模型上进行迭代。但是,有时人们错误地使用验证集来描述测试数据集。下面,我会详细说明验证数据集的重要性:
- 验证集 - 此数据集用于在调整模型的超参数时评估模型的性能。该数据用于更频繁的评估,并用于更新超参数,因此验证集会间接影响模型。调整模型的超参数并不是绝对必要的,但通常建议这样做。
- 测试集 - 此数据集用于对训练集中的最终模型拟合进行无偏评估。此数据集只在模型训练完成后使用一次,并且不影响模型;它只是用于计算性能。
总结一下,训练数据集用于训练可用的各种算法,验证数据集用于比较不同算法(使用不同的超参数)的性能,并决定采用哪一种算法。测试数据集用于了解特定模型的准确度、敏感度和性能。
下面是一个机器学习示例。在人工神经网络 (ANN) 中,超参数是确定网络结构的变量,例如人工神经元的隐藏层数和每一层中的人工神经元数;或者是定义如何训练模型的变量,例如学习率,即学习过程的速度。
超参数是在学习过程开始之前定义的。相对地,ANN 的参数是每个人工神经元连接的系数或权重,并在训练过程中进行调整。
超参数是在训练或学习过程开始之前确定的模型参数,它位于模型的外部;换句话说,如果您想更改超参数,需要手动更改。自行车座椅不会自行调整,您需要在出发前先行调整;类比到机器学习模型中,就是使用验证数据集进行调整。相对地,其他参数是在训练过程中使用训练数据集确定的。
训练和测试模型所需的时间取决于其超参数,模型的超参数越少,越易于验证或调整,因此您可以减小验证数据集的大小。
大多数机器学习问题都是非凸的。这意味着根据我们为超参数选择的值,我们可以得到完全不同的模型,并且,通过更改超参数的值,我们可以找到不同的、更好的模型。这就是验证数据集的重要之处,它让您能够使用不同的超参数进行迭代,从而为您的分析找到最佳模型。
如果您想进一步了解超参数,不妨看看 Adam Filion 这段 5 分钟的视频,其中相当扼要地介绍了超参数优化。