验证数据集是从训练模型中预留出来的数据样本,用于在调整模型超参数时估算模型的技能。
验证数据集不同于测试数据集,测试数据集同样是从模型训练中预留出来的,但它用于在比较或选择最终模型时,提供对最终调优模型技能的无偏估算。
在应用机器学习中,关于验证数据集到底是什么以及它如何区别于测试数据集,存在很多混淆。
在本贴中,你将发现关于训练集、测试集和验证集的清晰定义,以及如何在自己的机器学习项目中使用它们。
阅读本文后,你将了解:
- 机器学习领域的专家如何定义训练集、测试集和验证集。
- 验证集和测试集在实践中的区别。
- 在评估模型时,你可以使用的一些程序来最大化利用验证集和测试集。
让我们开始吧。

测试集和验证集有什么区别?
照片作者:veddderman,部分权利保留。
教程概述
本教程分为4个部分,它们是:
- 专家眼中的验证数据集是什么?
- 训练集、验证集和测试集的定义
- 验证数据集是不够的
- 验证集和测试集消失了
专家眼中的验证数据集是什么?
我发现了解实践者和专家如何描述数据集非常有用。
在本节中,我们将看看训练集、测试集和验证集是如何定义的,以及它们根据一些顶级机器学习书籍和参考文献的差异。
通常,“验证集”这个词与“测试集”这个词可以互换使用,指的是从训练模型中预留出来的数据样本。
在训练数据集上评估模型技能会导致有偏的分数。因此,模型在预留样本上进行评估,以提供模型技能的无偏估算。这通常被称为算法评估的训练-测试分割方法。
假设我们想估算与用一组观察值拟合特定统计学习方法相关的测试误差。验证集方法 [...] 是这项任务的一个非常简单的策略。它涉及将可用观察集随机分为两部分:训练集和验证集(或留出集)。模型在训练集上拟合,拟合后的模型用于预测验证集中的观察值的响应。由此产生的验证集误差率—在定量响应的情况下通常使用 MSE 来评估—提供了测试误差率的估算。
— Gareth James 等人,第176页,《统计学习导论:R语言应用》,2013年。
在Kuhn和Johnson精彩的著作《预测建模应用》中,我们可以直接看到它们的互换性。在这个例子中,他们明确指出,最终的模型评估必须在一个之前未用于训练模型或调整模型参数的留出数据集上进行。
理想情况下,模型应该在未用于构建或微调模型的样本上进行评估,以便它们能够提供模型有效性的无偏印象。当手头有大量数据时,可以留出一部分样本来评估最终模型。“训练”数据集是用于创建模型的样本的通用术语,而“测试”或“验证”数据集用于限定性能。
— Max Kuhn 和 Kjell Johnson,第67页,《预测建模应用》,2013年。
也许传统上用于评估最终模型性能的数据集被称为“测试集”。Russell和Norvig在其开创性的AI教科书中重申了将测试集完全分开的重要性。他们将以任何方式使用测试集的信息称为“窥视”。他们建议在所有模型调整完成后,将测试集完全锁定起来。
窥视是同时使用测试集性能来选择假设和评估它的结果。避免这种情况的方法是真正地留出测试集——在完成所有学习并只是想获得对最终假设的独立评估之前,将其锁定起来。(然后,如果你不喜欢结果……如果你想回去寻找一个更好的假设,你就必须获取并锁定一个全新的测试集。)
— Stuart Russell 和 Peter Norvig,第709页,《人工智能:一种现代方法》,2009年(第三版)。
重要的是,Russell和Norvig评论说,用于拟合模型的训练数据集可以进一步分为训练集和验证集,而这个训练数据集的子集,称为验证集,可以用来尽早估计模型的技能。
如果测试集被锁起来,但你仍然想衡量在未见过的数据上的性能,以便选择一个好的假设,那么就把可用数据(不包括测试集)分成训练集和验证集。
— Stuart Russell 和 Peter Norvig,第709页,《人工智能:一种现代方法》,2009年(第三版)。
这个验证集的定义也得到了该领域其他开创性文本的证实。一个很好的(也是较老的)例子是Ripley的书《模式识别与神经网络》中的术语表。具体来说,训练集、验证集和测试集的定义如下:
– 训练集:用于学习的示例集,即拟合分类器的参数。
– 验证集:用于调整分类器参数的示例集,例如选择神经网络中的隐藏单元数量。
– 测试集:仅用于评估已完全指定的分类器性能的示例集。
— Brian Ripley,第354页,《模式识别与神经网络》,1996年。
这些是这些术语推荐的定义和用法。
这些定义具有规范性,一个很好的例子是在著名的神经网络FAQ中重复出现。除了重申Ripley的术语表定义外,它还讨论了在应用机器学习中“测试集”和“验证集”这两个术语的常见误用。
机器学习领域的文献经常颠倒“验证”和“测试”集的意思。这是困扰人工智能研究的术语混乱最明显的例子。
关键在于,根据神经网络(NN)文献的标准定义,测试集绝不用于在两个或多个网络之间进行选择,因此测试集的误差提供了对泛化误差的无偏估算(假设测试集能代表总体等)。
— 主题:总体、样本、训练集、设计集、验证集和测试集是什么?
您知道任何其他清晰的这些术语的定义或用法吗?例如,论文或教科书中的引用?
请在下面的评论中告诉我。
训练集、验证集和测试集的定义
重申上面研究专家的发现,本节提供了这三个术语的明确定义。
- 训练数据集:用于拟合模型的数据样本。
- 验证数据集:在调整模型超参数时,用于对在训练数据集上拟合的模型进行无偏评估的数据样本。当将验证集上的技能纳入模型配置时,评估会变得更有偏见。
- 测试数据集:用于对在训练数据集上拟合的最终模型进行无偏评估的数据样本。
我们可以用一个伪代码草图来具体说明。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 分割数据 data = ... train, validation, test = split(data) # 调整模型超参数 parameters = ... for params in parameters model = fit(train, params) skill = evaluate(model, validation) # 评估最终模型以与其他模型进行比较 model = fit(train) skill = evaluate(model, test) |
以下是一些额外的澄清说明。
- 验证数据集也可能在其他形式的模型准备中发挥作用,例如特征选择。
- 最终模型可以拟合在训练集和验证集的聚合数据上。
这些定义对您的用例是否清晰?
如果不是,请在下方提问。
验证数据集是不够的
还有其他方法可以计算在未见过的数据上的模型技能的无偏(或者在验证数据集的情况下,逐渐有偏)估算。
一个流行的例子是使用 k 折交叉验证来调整模型超参数,而不是使用单独的验证数据集。
在他们的书中,Kuhn和Johnson有一个标题为“数据分割建议”的部分,其中他们列出了使用单一“测试集”(或验证集)的局限性。
如前所述,有一个强有力的技术论据反对单一、独立的测试集。
– 测试集是对模型的单次评估,其表征结果不确定性的能力有限。
– 比例上较大的测试集以增加性能估算偏差的方式分割数据。
– 在样本量较小的情况下
– 模型可能需要所有可能的数据点来充分确定模型值。
– 测试集的不确定性可能非常大,以至于不同的测试集可能产生非常不同的结果。
– 重采样方法可以对模型在未来样本上的表现产生合理的预测。
— Max Kuhn 和 Kjell Johnson,第78页,《预测建模应用》,2013年。
他们继续建议,对于小样本量,通常使用10折交叉验证,因为其性能估算具有理想的低偏差和低方差特性。他们建议在比较模型性能时使用bootstrap方法,因为其性能估算的方差较低。
对于较大的样本量,他们再次建议采用10折交叉验证方法,通常如此。
验证集和测试集消失了
在现代应用机器学习中,你很可能不会看到对训练集、验证集和测试集的引用。
如果实践者选择使用 k 折交叉验证来调整模型超参数(而不是训练集),那么对“验证数据集”的引用就会消失。
我们可以用伪代码草图来具体说明,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 分割数据 data = ... train, test = split(data) # 调整模型超参数 parameters = ... k = ... for params in parameters skills = list() for i in k fold_train, fold_val = cv_split(i, k, train) model = fit(fold_train, params) skill_estimate = evaluate(model, fold_val) skills.append(skill_estimate) skill = summarize(skills) # 评估最终模型以与其他模型进行比较 model = fit(train) skill = evaluate(model, test) |
如果使用更广泛的模型交叉验证来嵌套训练集上的模型超参数的交叉验证,那么对“测试数据集”的引用也可能消失。
最终,你只剩下来自该领域的一个数据样本,我们可以继续称之为训练数据集。
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
- 维基百科上的测试集
- 主题:总体、样本、训练集、设计集、验证集和测试集是什么? 神经网络FAQ
- 《统计学习导论:R语言应用》(An Introduction to Statistical Learning: with Applications in R), 2013
- 应用预测建模, 2013
- 《人工智能:一种现代方法》(Artificial Intelligence: A Modern Approach), 2009
- 模式识别与神经网络, 1996
您知道关于这个主题的其他好的资源吗?请在下面的评论中告诉我。
总结
在本教程中,你发现关于“验证数据集”和“测试数据集”这两个术语存在很多混淆,以及如何在评估自己的机器学习模型的技能时正确地理解这些术语。
具体来说,你学到了:
- “训练数据集”、“验证数据集”和“测试数据集”在评估模型时具有明确的先例。
- “验证数据集”主要用于描述在调整超参数和数据准备时对模型的评估,而“测试数据集”主要用于在将最终调优模型与其他最终模型进行比较时对其进行评估。
- 采用 k 折交叉验证等替代重采样方法时,“验证数据集”和“测试数据集”的概念可能会消失,尤其是在重采样方法嵌套的情况下。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
嘿,好文章!我是你在这里帖子的粉丝,但每当我试图打印这些文章,并在地铁上随身携带阅读时,都有关于你机器学习教程的大幅浮动广告,这基本上让它无法阅读 🙁
我很遗憾听到这个。你能给我发一张示例照片吗?
我打印了你另一篇文章。我遇到了和Jacob Sanders一样的问题。每页都有一个广告(“开始你的机器学习之旅”),它占据了很大空间,导致无法阅读。
因此,我只能在线阅读你的文章,而不能打印它。
多么可惜!:(
很抱歉听到这个。它们是为在线阅读设计的。
如果你想打印它,你需要先将URL转换为PDF(例如webpagetopdf.com)。直接打印页面会scatter Jason的opt-in。但这也不是什么大问题。因为有这么棒的(免费)内容!
或者你只需注册,opt-in框就会消失。
如果你选择你想要文本并使用右键打印,框就不会出现!
顺便说一句,关于测试集和验证集的精彩文章。
我在这里提供打印方面的帮助。
https://machinelearning.org.cn/faq/single-faq/how-can-i-print-a-tutorial-page-without-the-sign-up-form
我们应该将数据分割为训练集、验证集、测试集,但最好的分割方式是什么?最好是使三个数据集尽可能同质。
这取决于具体问题。这篇帖子提供了一些思路,但实际上,你需要为你的具体问题找到合适的方法。
是的,训练集和测试集都应该代表该问题。
为什么“这取决于具体问题”?我认为最好是三个数据集尽可能同质地分割。
不总是。
有时旧数据可能不太相关,如果问题性质随时间变化。
有时,即使是一个小样本,甚至是一个手工制作的小样本,也可以帮助算法更好地学习输入到输出的映射信号。
以及与误差/数据/建模的随机性相关的其他百万个原因。
试试 PrintFriendly https://www.printfriendly.com
我们如何称呼在实际中运行最终模型的那个数据集——它不是标记数据。我们如何评估最终模型在实际中的性能?
我们不需要评估最终模型的性能(除非作为持续的维护任务)。
一般来说,我们使用训练/测试分割来估算最终模型的技能。我们对其进行稳健的评估,以使估算尽可能准确——以帮助在模型和模型配置之间进行选择。我们使用这个估算来了解我们的最终模型有多好。
这篇帖子会更清楚
https://machinelearning.org.cn/train-final-machine-learning-model/
嗨,感谢您的好文章。我想检查模型是否公平且无偏见,但我的教授告诉我,使用交叉验证或10折交叉验证或任何这些方法都不能确认模型是否有效和公平。您能否就我可以使用哪种方法来解决这个问题提供一些提示?
谢谢
是的,k 折交叉验证是计算模型在未见过的数据上的技能无偏估算的绝佳方法。
嗨,Jason,一如既往地精彩文章。我认为Helen的问题是她的教授告诉她k折方法不能确认模型是否有效。我的理解是,k折方法中的测试数据实际上来自训练数据的样本。
我也遇到了同样的问题。如果我从原始数据中采样一个子集作为测试数据,其余作为训练和验证数据。模型可以在三个数据集上表现良好。但对新数据(完全不包含在原始数据中)效果不佳。我认为测试数据的分割方式很重要。不应该使用采样方法。
谢谢。
不确定我是否同意。
研究表明,使用具有良好k值的交叉验证,可以对模型在未见过的数据上的性能进行比单一训练/测试分割更不乐观的估算。至少平均而言是这样。
是的,我认为平均而言它会有所帮助。我处理过时间序列数据,效果不好。这就是我试图找出原因。以下文章证实了我的想法,这应该更清楚地表达了我遇到的问题 🙂
https://fastai.net.cn/2017/11/13/validation-sets/
时间序列是不同的。你必须使用前向验证。
https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/
我认为这是因为k折方法意味着你的测试数据是从与训练数据相同的源中采样的。所以它不能完全证明模型的有效性。
确实。我们只是在估计模型在未见过的数据上的性能。
我在一个课程中学习了一个叫做滚动窗口的方法,它专门用于时间序列数据的交叉验证,在数据集被强制按时间列索引之后。然后按周期(每月、每季度、每半年、每年)标记/分类,取决于数据大小,如果跨越多年则与年份合并(YEAR+PeriodIndex = 2020Q1, 2020Q2 等...这代表了每个观测值的虚拟变量,表示该观测值属于哪个时间段。类似于k折交叉验证技术,模型在1-4个季度期间进行训练,并在第5个季度进行预测(在我的用例中)。
Helen,我们通常对整个训练数据集中的特征或变量进行处理。例如,当我们对连续特征进行标准化时——我们获取训练集的Mu和Sigma,而不是每个CV折叠的Mu和Sigma。同样,有时我们会进行某种缺失数据插补,这也查看了整个训练数据,而不是每个折叠。
也就是说,当我们进行5折或10折CV时,即使我们只在训练数据的4个(或9个)折上进行显式训练,模型也会间接获得一些信息,而我们认为模型没有见过这些数据。
这可能是你的教授说这不是选择最终模型的好方法,而我们必然要使用留出数据的原因。
同意。Mu和Sigma必须在每个折叠的训练集上选择,否则我们会发生数据泄露。
https://machinelearning.org.cn/data-preparation-without-data-leakage/
好文章,帮我回忆了一下。
一个小提示:在你第一个伪代码示例中,你循环遍历了参数,但你从未在循环体内使用params。我猜它应该是model = fit(train, params)!?
请继续保持出色的工作!
很高兴听到这个消息。
感谢您的建议——已更新。
嗨,Jason,
在“验证集和测试集消失”部分的伪代码中,我仍然不明白你是如何使用 k 折交叉验证来调整训练集上的模型超参数的。
你能解释一下伪代码吗?
诚挚地,
Steven
当然,每一组参数(param)都使用 k 折交叉验证进行评估。
这有帮助吗?
嗨,Jason,
好文!
想确保我的理解是正确的。如果不对,请纠正我。
一般来说,对于训练-测试数据的方法,过程是将给定的数据集分成70%的训练数据集和30%的测试数据集(理想情况下)。在训练阶段,我们在训练数据上拟合模型。现在,为了评估模型(即检查模型在未见过的数据上预测得有多好),我们用测试数据运行模型并得到预测结果。因为我们已经知道期望的结果是什么,所以我们比较/评估预测结果和期望结果,以获得模型的准确性。
如果准确性未达到期望的水平,我们会重复上述过程(即训练模型、测试、比较、训练模型、测试、比较……),直到达到期望的准确性。
但是,在这种方法中,我们实际上是在间接使用测试数据来改进我们的模型。因此,首先就没有实现“在未见过的数据上评估模型”的想法。因此,“验证数据集”出现了,我们遵循以下方法。
训练模型,用验证数据集运行模型,比较/评估输出结果。重复此过程,直到达到期望的准确性。
一旦达到期望的准确性,就采用该模型,并用测试数据集运行它,比较/评估输出结果以获得准确性。
如果此准确性达到期望的水平,则该模型将用于生产。如果不是,我们会重复训练过程,但这次我们会获取新的测试数据。
正确。
这是一个权衡,不要让“测试集”产生太大的影响,以确保我们能够获得最终在未见过的数据上模型技能的无偏(或偏差较小、半客观)估计。
嗨,Jason,
感谢您的这篇文章。不过我有一个问题。我是机器学习新手,目前正在研究一个关于信用风险的案例研究。我的数据已经分为三个不同的数据集,分别用于训练、验证和测试。我将首先清理训练数据(处理NA值,在连续因变量的情况下移除异常值)。在我继续使用上述方法检查模型准确性之前,我是否需要清理验证集和测试集?任何帮助都将不胜感激。谢谢。
通常,对其他数据集执行相同的数据准备任务是一个好主意。
好的。非常感谢。
嗨,Jason,
我有一个关于Krish评论的问题,特别是这一部分
“如果准确性未达到期望的水平,我们会重复上述过程(即训练模型、测试、比较、训练模型、测试、比较……),直到达到期望的准确性。
但是,在这种方法中,我们实际上是在间接使用测试数据来改进我们的模型。因此,首先就没有实现“在未见过的数据上评估模型”的想法。因此,“验证数据集”出现了,我们遵循以下方法。”
我正在使用Python的sklearn处理一个模型。鉴于我使用一些参数在训练数据集上进行训练,然后在测试数据集上进行测试,然后重新执行Python文件但使用不同的模型参数进行训练以选择参数,我很好奇这种方法与迭代训练一个具有不同参数的模型,在验证集上对其进行评估,然后在测试集上对其进行测试有何不同?
先谢谢您了。
是的,你可能会过度拟合测试数据。
在这种情况下,如果你能腾出一些数据,最好再留出一部分数据,并用它来评估/选择最终的模型。
这是否意味着模型在执行之间会保持其状态?
我不确定我是否理解。
你可以将你的模型保存到文件,然后稍后加载它并继续训练或开始进行预测。
你好Jason。感谢您澄清这些术语。下次我会确保我和同事们在同一个页面上!
您能否在回应Krish的评论时解释一下您所说的“这是一个权衡,不要让“测试集”产生太大的影响”是什么意思?
如果你过多地使用测试数据集,你就会过度拟合它。
这意味着你——人类操作员——在项目期间应该很少查看测试集上的结果。
验证集也一样吗?我们进行越多的训练-验证迭代,就越会根据验证集中的噪声来调整参数(数据泄露?)?尽管如果太多了,估计它在测试集上的表现也会变差,也就是说从欠拟合转向了过拟合?
通过训练-验证的迭代来调整参数,一种减少这种需求的方法是不是首先更好地理解问题、数据以及可用的建模工具/算法?
一般来说,是的。
也许吧。或者获取更多数据,这样影响就会减弱。
谢谢。如果您有足够的数据,您认为使用多个验证集有什么问题吗?
一点也没有。
为了迭代前面Krish所说的/所问的(类似的问题),我学习机器学习时,我学习到首先将整个数据集分成80%(训练)/20%(测试)(test_train_split 方法,参数设置为80/20)。这是完全随机的(所以我认为索引是打乱的)。然后,从80%的训练数据中,进一步分成5(折)份,其中1/5将代表另一个测试集(次级测试集),交叉验证过程会迭代,使得5个子集中的每一个都被用作次级测试集。这个保留的次级测试集不就是验证集吗?为什么文章说当使用K折交叉验证时,验证集的需求就消失了?这个次级测试集上的预测,是在原始20%测试集上的最终预测之前,对训练模型的评估的一部分。
@Krish 总结得太棒了——你抓住了要点。感谢您增强了我的理解。
对于大型数据集,您可以分成例如95%对5%(而不是70%对30%)。
原因:您为神经网络提供了足够的数据进行训练。大型数据集上的5%对于开发和/或测试仍然很大。Andrew Ng称之为深度学习数据划分的新方式。
太棒了,感谢解释!
天哪,谢谢您的总结!
我想知道您说的期望结果是否是指测试集样本的真实目标值?
谢谢 Jason!
不客气。
嗨,Jason,
再次一个很好的概述。然而,我想指出一个在划分数据到这些数据集时存在的问题。如果数据集之间的分布以某种有意义的方式不同,那么从测试集得出的结果可能不是最佳的。也就是说,一个人应该尝试使所有数据集的分布相似,具有相似的最大值和最小值。如果不是这样,模型可能会在某些值上饱和或表现不佳。我亲自经历过这种情况,即使是归一化的输入数据。另一方面,在处理多元数据集时,这并不容易。很想读一篇关于这个的文章。
这是一个非常好的观点,谢谢Magnus。
如果数据被随机打乱,如何控制每个分割的分布?
嗨,Jason,
首先,感谢您的文章。
但是,我在Python中实现训练、测试和验证分割时感到非常困惑。
在我的实现中,我使用了Pandas和Sklearn包。
那么,如何在Python中实现呢?
您可以使用sklearn函数train_test_split()来创建数据的分割。
https://scikit-learn.cn/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split
也许首先将数据分割成训练/测试,然后将训练分割成训练/验证集,然后对训练集使用交叉验证。
这只是一种方法,这有帮助吗?
感谢您的帮助Jason,但是
当我使用训练集上的交叉验证时。我必须使用哪个训练集?在训练/测试还是训练/验证集?
首先分割成训练/测试,然后将训练分割成训练/验证,最后这个训练集用于CV。
它们应该有不同的名称,对此我感到抱歉。
我认为您的意思是
“首先分割成训练#1/测试,然后将训练#1分割成训练#2/验证,最后这个训练#2集用于CV。”
然而,根据您文章中的以下评论,我认为使用CV时您不需要验证集
“如果从业者选择使用k折交叉验证与训练数据集来调整模型超参数,那么对‘验证数据集’的引用就会消失。”
请澄清。
顺便说一句:我真的很欣赏这些制作精良的文章。谢谢。
正确。
是的,您可以使其自动化,方法是在CV中执行超参数选择,称为嵌套CV。
Jason,
我有很多问题想问您,因为我仍然感到困惑
1.我们总是必须将训练数据集分割成训练/验证集吗?
2.如果我不将训练数据集分割成训练/验证集,结果会怎样?
不,您不必分割数据,验证集可用于调整给定模型的参数。
嗨,Jason,
如果我想将数据分割成训练/测试(90:10),我想再次将训练分割成训练/验证,训练/验证(90:10),对吗,或者我可以按任意比例分割?
“正确”的想法很大程度上取决于您的问题和您的目标。
– 训练/测试理论是,如果你在测试集上优化,你就会过度拟合。
– 训练/开发/测试理论是,你优化训练/开发,然后只检查它在测试上的效果。
我不知道谁提出了训练/测试/开发。也许是Andrew Ng?凭直觉,我喜欢训练/开发/测试。
在从业者中,我看不到有人使用它。
对我来说,Andrew Ng不算从业者。
Jason 使用它吗?我没见过。
Francois Chollet(Keras的创造者)使用它吗?据我所知没有。
很难一概而论,最好选择最能帮助您为特定项目开发最佳模型的划分方法。
嗨,Jason,
我只想感谢您如此精彩的解释。我对这些术语很清楚。
但我希望您能更详细地解释模型超参数调整的内容。
谢谢Austin。
您在调整的哪个部分需要帮助?
你好,Jason 博士,
感谢您的这篇帖子。太棒了,我清理了我对验证集和测试集的误解。
我有一个疑问,也许这超出了上下文,但我认为它有联系。
我想绘制训练误差和测试误差的图形,以查看两条曲线的行为,从而确定神经网络的最佳参数,但我不知道在哪里以及如何提取要绘制的得分。
我已阅读了您的帖子:如何在Python中从头开始实现反向传播算法,并在那里学习了如何使用准确性获得得分(对此我非常感激)。
但现在我想在一张图上绘制训练和测试误差,以查看两条曲线的行为,我的问题是我不知道在哪里以及如何提取这些误差(我认为训练误差可以从训练过程中使用MSE提取),以及在哪里以及如何提取测试误差来绘制?
如果您可以,请帮助我。我仍然在从头开始开发一个反向传播算法,并使用k折交叉验证进行评估(这是我从您的帖子中学到的)。
此致。
您可以收集CV折叠的所有预测/误差,或者直接在测试集上评估模型。
你好,Jason 博士,
谢谢你的回复。
我已尝试这样做,但遇到了两个问题:
第一个问题是(我的predict函数每次在循环中调用时都返回0或1,用这些值我可以计算错误率和准确性)。我的predict函数使用forward函数,该函数返回输出层的输出,这些输出被四舍五入为0或1。因此,我感到困惑的是,我是否应该使用predict函数内部的forward函数返回的这些输出(在四舍五入为0或1之前)(输出-期望)来计算这些误差?还是我将在预测中使用四舍五入的值(预测-期望)在k-foldCV函数内部计算这些误差?
第二个问题是(在训练误差的图表中,我使用训练误差和epoch的函数来绘制。但在这里的测试误差中,我无法想象图形将是误差与什么值的函数,因为我需要将这些误差绘制在同一张图中)。
我的目标是通过查看训练误差和测试误差来找到最佳点(所需的epoch数)来停止训练神经网络。我使用的是准确性,但即使我增加或减少epoch数,我也看不到对准确性的影响,所以我需要并排查看这些误差来决定需要训练多少epoch以避免过拟合或欠拟合。
我每天都在努力找到解决这个问题的方法。而且我在这里找到了很多实践中的答案。
此致
也许可以尝试训练多个并行模型,让它们大致在同一时间停止,并将它们的预测结合成一个集成,以产生更稳健的结果?
你好,Jason 博士,
推荐的方法对我来说是新的,而且似乎很有趣,您是否有可以查看并从中获得一些想法的帖子?
致以最诚挚的问候。
这篇帖子中的例子有帮助吗?
让我再读一遍和里面的例子,也许能发现一些我第一次阅读时没注意到的东西。
致以最诚挚的问候。
嗨,Jason,
行业将数据分割成3个数据集(即训练、验证和测试)的标准百分比是多少?
是的。
是否有数据的行业百分比划分?
取决于数据。
也许70%用于训练,30%用于测试。然后同样地,训练集再次分割成训练(2)和验证。
你好;
感谢您的精彩解释。我认为,导致许多人对训练、测试和验证数据集感到困惑的一个原因是,根据数据分析的不同步骤,我们必须对这些数据集使用相同的术语,然而,这些数据集会发生变化,而且并非完全相同。例如,假设有一位分析师想要使用朴素贝叶斯分类器通过几个“x”来预测“y”。他将使用一个训练数据集和一个测试数据集。在预测“y”之后,他想验证模型。在这种情况下,以前的测试数据集可以通过将其分割成训练和测试数据集来充当验证数据集。所以,我们几乎平等地使用验证和测试这两个术语,但根据分析的目的,它可能基于预测我们的因变量(使用训练和测试数据集)或仅仅是为了评估模型性能(使用以前的测试数据集=验证)并分割成训练和测试数据集而有所不同。
感谢分享。
我读了您的《Python机器学习精通》一书的第19章,需要对验证数据集进行更多解释。谷歌把我带到了这里,现在我意识到您的网站信息是对您书籍的一个很好的补充,可以提供更深入的主题见解和/或扩展解释。我真的很享受通过您的书籍学习。
谢谢Dana!
你好Jason!这是一篇非常好的文章,帮助我理解了这些术语之间的区别。
但是我有一个小问题。最近我向一家期刊提交了一篇手稿,我执行了以下步骤来开发模型
1) 将数据集分割成训练(80%)和测试(20%)
2) 对训练数据集执行5折CV以选择模型超参数,即DNN的最佳架构,然后用完整的训练数据集训练模型
3) 在训练模型时,即反向传播步骤,我也使用了早停法。我使用了一个新的数据集(不同于训练和测试)来确定反向传播步骤的最大epoch数。
4) 最后,在完全开发了DNN之后,我测试了它在从未用过的新测试数据集上的泛化能力。
审稿人说,通常ML从业者会将数据分割成训练、验证和测试集,并询问我是如何分割数据的?
我认为我的方法是好的,并且我写得很清楚。我该如何解释在应用k折CV时不需要选择验证集?我不想把事情搞大,因为只有一次与审稿人沟通的机会。
在每个折叠中都可以使用验证集来调整模型。
感谢您的回复。但在 k 折交叉验证中,我们不显式地设置验证集。我们将训练数据分成 k 个子集,重复训练过程 k 次,每次使用不同的子集作为验证集。然后,我们对这 k 个 RMSE 进行平均,得到最优架构。一旦得到最优架构,我们就使用完整的训练数据集进行训练。对吗?
我们可以将每一折进一步划分为训练集、测试集和验证集。这是一种可行的方法。
是的,一旦您满意,模型就会拟合所有数据。
https://machinelearning.org.cn/train-final-machine-learning-model/
好的……有点像嵌套交叉验证……但问题是是否有必要。我该如何知道哪种方法更好?
这确实是具体问题具体的,例如,有多少数据以及模型的复杂性。
用于估算模型技能的方法必须令人信服。
我需要比较这两种策略来选择我的 NN 的最佳参数。我的推理如下,请告诉我是否正确!
在训练-验证-测试拆分情况下,验证数据集用于选择模型超参数,而不是训练模型,因此减少训练数据可能会导致更高的偏差。此外,验证误差在很大程度上取决于哪些数据点进入验证集,因此不同的验证集可能会给出不同的最佳参数,即评估结果会产生更高的方差。
在 k 折交叉验证中,这是一个更渐进的过程,每个子集,因此每个数据点都只被用于一次验证。由于 RMSE 是在 k 个子集上平均的,因此评估对数据划分不敏感,并且由此产生的估计量的方差显著降低。另外,由于所有数据点都用于训练,偏差也得到了降低。
抱歉,我不太明白。
你认为这是错误的吗?
您可以选择您希望如何评估模型。没有正确或错误的观点。重要的是模型在用于新数据时实际表现如何。所有这些方法都是为了估算这个未知量的尝试。
创建测试集有必要吗?
您必须选择如何运行您的项目并估算模型的技能。
如何在 Keras 模型中添加交叉验证?我不想使用 k 折。
k 折交叉验证就是交叉验证。
嗨,Jason,
我有一个关于图像数据处理的问题。
我有数千张道路摄像头图像,由同一台相机每隔 5 分钟拍摄一次。所以我的问题是,由于这是某种时间序列问题,而图像领域变化不大,我是否需要使用 sklearn 的 TimeSeriesSplit 来获得可信的结果,或者您对此有什么建议吗?
我有点困惑,找不到足够多的关于图像的解释,因为通常讨论都是围绕数值数据划分进行的。您是否考虑也写一些关于图像的内容?
谢谢你
作为序列,也许您可以使用前向验证。
https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/
非常好的信息,先生。
我正在处理一个问题,其中训练集和测试集的大小为数百万行。一个数据集比另一个数据集大大约 10%,所以在我查看了给出的解释和其他链接后,我不确定 K 折的观点是否合适。
是否有 K 折用法可以确定数据集是否相同,并能够定义差异发生的原因?
也许您可以使用数据集的汇总统计数据,并使用统计检验来比较结果?
你好,先生。我有一个问题。如果我们想使用带交叉验证的随机森林,那么 R 中的结果会显示准确率。如果我们想对随机森林的每个折叠使用 ROC 曲线来衡量准确率呢?谢谢。
我建议将模型技能的 CV 估算与 ROC 曲线的评估分开。考虑回顾单个模型的曲线。
快速提问:在确定了最佳模型(通过训练的最佳超参数拟合,通过 k 折交叉验证,然后使用开箱即用的测试数据集进行预测)之后,我们是否仍需要对整个数据集进行另一次拟合()来最终确定模型和给定超参数?我一直认为,在发布到实际应用之前,需要对整个数据集进行最后一次拟合。
是的,Bernard,我们会在准备好使用模型时,在最后对所有数据进行最终拟合。
更多关于模型最终化的主题请参见此处。
https://machinelearning.org.cn/train-final-machine-learning-model/
请注意,您可以选择适合您项目的方法。上面的帖子试图提出一种通用的方法来涵盖多种问题类型。
希望这能有所帮助。
我仍然对如何在一个工作流程中比较多个模型,然后对最佳模型进行超参数调优感到困惑。
假设我的目标是为二元分类器执行监督学习,方法是比较 3 种算法,然后进一步优化最佳算法。
工作流程
1. 分离训练和测试数据。
2. 使用训练数据,通过 3 种不同的算法进行模型拟合。评估并比较每种算法与测试数据的性能(例如 ROC AUC)。
3. 选择第 2 步中的最佳模型,并仅使用训练数据进行超参数调优,评估并报告与同一测试数据的性能。
我的直觉告诉我,我不应该根据第 2 步的测试数据结果来做决定,但除了这个方法,我还能如何比较它们呢?交叉验证真的能在这里帮到我吗?
没有最佳工作流程,您必须选择一种适合您数据和项目目标的方法。
一种方法是将训练数据分为训练/验证集,并为每个模型进行调优以找到最佳配置,然后在测试数据集上比较技能。
训练和测试数据集必须具有代表性。如果不是,也许可以使用简单的 CV 进行训练/验证拆分。
嗨,Jason,
感谢您的文章。我正在处理一个问题,其中提供了单独的训练集和测试集。我遵循了您机器学习精通书籍中提到的一些方法。首先,我将训练集划分为训练集和验证集。然后,我使用 5 折交叉验证在训练集上构建模型。对于决策树、随机森林和额外树等机器学习分类器,我取得了大约 99% (+/- 0.003%) 的准确率。当我将这些模型应用于验证集时,我得到了几乎相同的准确率。最后,我将这些模型应用于单独提供的测试集。但是,模型没有给我类似的结果。这是过拟合吗?
干得好!
也许您使用了验证集几次,有点过拟合?
也许测试集与训练/验证集确实不同,例如,它更能代表或不那么代表问题?
你好 Jason,感谢你的精彩文章。因为我是 ML 新手,我仍然有点困惑。我正在对一个大约 50000 个数据的数据集进行二元分类。我手动将数据划分为训练集和测试集(使用 80% 的数据进行训练)。使用 sklearn 库,我应用了不同的分类器而没有进行任何调优,并且得到了不错的结果。我的工作可能完全错误或无用,因为我没有验证集和调优?我的意思是,这是必须的吗?
做得好。也许您的问题很简单。
以一种能让您确信发现是真实的方式来测试您的模型。让您知道模型很熟练。保持怀疑。
谢谢你。
比较不同算法时,哪种性能指标是最佳指标?如果我没记错的话,准确率不能单独作为好的指标,除非数据是平衡的。那么,为了比较,我是否应该同时考虑所有指标,如准确率、精确率……?还是例如只比较 f1 分数?
这取决于具体问题和项目目标。没有通用的答案。
我理解在构建机器学习模型时,人们使用训练集和验证集来调整模型的参数和超参数,并使用测试集来衡量模型的性能。
但是,鉴于在大多数情况下,这些理想的(经过调整的)值会随着数据集的大小而改变,所以对于生产训练数据集来说,理想的参数和超参数值将是不同的。那么,在投入生产环境中只有一个训练数据集时,如何调整这些值呢?
可能的解决方案
将生产数据集划分为训练集和验证集。在某些情况下可以这样做,但在许多情况下,最好在所有可用数据上训练模型,尤其是在时间序列问题中,因为最新的数据点可能更有价值。即使不是这样,大多数模型也比没有更多数据表现更好(除了那些不这样的模型)。所以这在所有情况下都不能是解决方案。
在不同大小的训练数据集上进行训练,并建立训练大小与理想参数/超参数值变化之间的关系。然后,在设置生产模型时应用这种关系。
第二个看起来是更好的解决方案,但它本身就成了一个相当困难的问题,为此,您可能需要使用另一个机器学习模型。是否有现成的框架来完成这个过程?(最好是 Python 或 TensorFlow)
是否有比这两种更好的解决方案?
这是你的选择。
目的是使用训练/验证集来找到有效的方法,通过测试进行确认,然后使用这些参数在所有数据上拟合最终模型。
但是,在所有数据上构建的模型,其理想参数将与训练/验证集的理想参数不同。
这似乎是某些情况下的可能解决方案。
https://stats.stackexchange.com/a/350792
是的,但我们希望通过我们的测试环境来稳健地估计并最小化这种差异。
我有一个与 Chris(2018 年 5 月 24 日)类似的问题。
我从我的数据中提取了 20% 作为测试集(分层抽样,因此我的两个类的比例保持不变)。在 80% 的数据上,我进行了 10 折交叉验证,比较了 4 种不同的分类器。这给了我 40 个不同的模型/参数集。
我现在可以根据分类指标来比较这些模型,甚至可以定义我的“最佳方法”,例如选择一个在 10 折上具有最高平均 f1 分数的模型。
现在下一步还不清楚,我找不到可以参考的文献(或者我可以引用我的学术论文),我应该使用哪个模型来从测试集中获得无偏估计?
有两种可能性
1. 选择最佳分类器(基于平均 f1 分数),在整个 80% 的数据上重新训练它,然后使用该模型进行测试。
2. 选择最佳分类器(基于平均 f1 分数),并选择“最佳”折叠中的模型(达到最高 f1 分数),然后将其用于测试集。
此外,我还认为其他 3 种分类器在测试数据上的表现如何(选择每个分类器的“最佳折叠”模型或在 80% 的数据上重新训练),这一点也很有趣,但我总觉得如果我也在测试集上监控它们,就会贬低 CV 的结果。我知道在任何情况下,测试集都不应该用于选择模型,但我觉得为每个模型获得无偏估计也很重要。
您能否评论我的问题,也许还可以提供文献参考?非常感谢!
当然,你可以做任何你想做的事。
我的建议是:使用 CV 找到最佳模型配置(丢弃所有模型),然后在新模型上对所有训练数据进行重新拟合,并在测试集上进行评估。
亲爱的 Jason,
我将随机森林拟合到我的训练数据集中,预测效果非常好。预测模式几乎完全遵循实际值。但对验证数据并非如此。RMS 误差是训练数据的 RMSE 的 5 到 6 倍。
我尝试了调整 RF 的参数,甚至更改了输入到模型的特征。
这些也无济于事。
可能的原因是什么?
训练集和验证集是原始数据集的 70/30% 的划分。
谢谢
我有一些想法可以尝试。
https://machinelearning.org.cn/machine-learning-performance-improvement-cheat-sheet/
感谢 Jason 的精彩教程。我有一个问题。我正在使用 60,000 个样本进行 MNIST 训练,并将 10,000 个样本的“测试集”用作验证数据。因此,在每个 epoch 中,我都会在 60,000 个样本上进行训练,然后评估 10,000 个样本。然后,我报告所有 epoch 中的最佳评估准确率。我的问题是——这种方法是否错误?
听起来是个不错的开始。
k 折方法是否类似于前向优化?我来自交易领域,没有编程知识,但使用一个具有前向优化器的软件软件包。
k 折交叉验证适用于没有时间顺序的观测值的问题。您可以在此处了解更多信息。
https://machinelearning.org.cn/k-fold-cross-validation/
前向验证是一种评估具有时间顺序数据上的模型的方法,您可以在此处了解更多信息。
https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/
您对训练数据集、验证数据集和测试数据集的解释非常具有启发性。鉴于这些解释,我们如何区分验证和测试?我们可以得出结论,验证发生在研究软件包开发过程中,而测试发生在软件包完成后,例如以确定功能或解决教育问题的能力?
鉴于开发模型在新数据上性能的稳健估计的目标,您可以选择任何您想要的方式来构建您的测试环境。
你好,
感谢您的文章。但是,假设我有一个包含 50,000 个观测值的单一数据集(没有单独的测试集),我能否将给定数据集分为 3 部分,即训练、验证和测试,然后继续建模?
请回复。
提前感谢
当然。这取决于您是否拥有足够的数据,使得每个子样本都能有效地代表您正在建模的更广泛问题。
你好,Jason,一如既往地写得很好!我是你博客的忠实粉丝,我正在处理 Bonn 大学提供的 EEG 数据,我有 11500 个观测值和 178 个特征。
我先进行 20% 的训练/测试拆分,然后使用这个训练集进行 30% 的训练/验证拆分,这是否正确?
因为我使用的是 Keras,在验证过程中,我可能只能通过 epoch 和 batch size 来找到好的模型。我的问题是,我是否也应该通过这个训练集和验证集进行额外的参数调优,以及使用这个模型?
最后,我是否应该在测试集上尝试结果?如果结果不理想,或者出现了过拟合,我该如何改进?
Mohammad
找到一个对您的领域和数据量有意义的拆分。
训练数据集:用于拟合模型的数据样本。
•验证数据集:用于对在训练数据集上拟合的模型进行无偏评估的数据样本,同时调整模型超参数。当将验证数据集上的技能纳入模型配置时,评估会变得越来越有偏。
•测试数据集:用于对在训练数据集上拟合的最终模型进行无偏评估的数据样本。
感谢 Jason 的解释,我可能对您所说的有一些模糊的理解,但仍然有点迷茫。所以,我想引用您上面关于这三个定义的总结。
在验证和测试之间的区别上仍然有点纠结。它们都“用于提供对拟合模型的无偏评估”,不过(测试)是针对最终模型拟合的。所以,让我用通俗的语言来说。在我看来,验证集似乎是一种中间部分,它“调整”训练集;它的目的是改进/微调它。所以,如果我们有一个 60/25/15 的拆分,其中 25%(验证集)改进了 60%(训练集),我们认为这比将全部 85% 作为训练集,然后用最后 15% 进行测试要好?是这样吗?谢谢 John。
在我看来,约翰,这听起来是正确的。
但这只是一个启发式方法,一种良好的实践。它不是严格的规则。
Bryant 2017年10月24日晚上8:12 #
我们应该在不同的目录中手动拆分训练、验证和测试集,还是通过编程?在这种情况下,权重或样本会发生变化,请建议最佳实践。
这无关紧要,使用您偏好的方法。
嘿,Jason!
感谢您的文章和您抽出时间回答我们的问题,伙计。
我有一个问题。
当我们在进行 cv 后得到不好的结果(如模型不稳定、过拟合等)时,我们该怎么办?
我知道我们可以获取更多数据并重新进行整个过程,但当无法收集更多数据时,该怎么办?
好问题,我这里有一份方法列表供您参考。
https://machinelearning.org.cn/framework-for-better-deep-learning/
测试数据集:一个通用的保留数据集,您可以在每次 K 折交叉验证后,对所有超参数配置进行测试,以获得调优的标准测试?是这样吗?
您是否指的是拆分消失了,也就是说,在模型选择/调优结束时,您使用整个数据集进行拟合?
谢谢您的辛勤工作。
是的。
谢谢。
先生,我对这个领域是新手。您能指导我如何使用验证集进行特征选择吗?
您可以使用特征选择方法,利用验证数据集,这将从测试集中获得独立的结果。
谢谢您,先生。但我有一个问题,在使用 k 折交叉验证进行特征选择时,我该如何使用验证集?
将每个折叠中的每个训练集进一步划分为训练/验证集,在训练集上拟合模型,并使用验证集进行特征选择评估。
尊敬的布朗利博士,
我有一个高度不平衡的数据集,例如有1,000,000个观测值,其中只有100K个观测值的响应=1,我想将训练/验证/测试集划分为70/20/10。
如果我平衡训练集,例如70K个1和70K个0,那么我是否需要
a) 也平衡验证集,或者
b) 验证集是否应该反映不平衡类别的真实比例?
谢谢,
Lobbie
不,只有训练集是平衡的。
布朗利博士您好
为什么测试数据与训练数据相同?主要目标是什么。
如果系统使用相同的训练和测试数据集(100%用于训练,100%用于测试)进行评估,但获得的准确率低于100%。这是什么意思?
测试数据与训练数据不同。
你好杰森,你是否发布过包含使用验证数据集的代码的文章?如果发布了,能否分享链接?如果没有,能否分享其他包含使用此验证数据集代码的有用链接?这将非常有帮助!
提前感谢。
在我演示数据集中算法的几乎所有教程都使用了验证数据集。
这是一个例子
https://machinelearning.org.cn/how-to-improve-neural-network-stability-and-modeling-performance-with-data-scaling/
非常感谢您带来的有趣阅读!我希望能听到您对此的看法。在使用训练集和验证集选择最优调整的模型后,并将该最优调整模型应用于测试集以获得无偏的样本外性能估计后,使用所有数据(训练+验证+测试)重新估算具有最优设置的模型以创建可以应用于实际新数据(例如明天到达的下一个患者)的最优模型是否有意义?我看不出有什么理由不希望在使用后使用测试数据来训练模型,并获得良好的样本外性能估计,但也许我遗漏了什么。非常乐意听到您的想法;再次感谢!
也许可以。
如果您期望数据分布发生变化/您想监控它,请尽可能每天测试模型。
这归结于信任和假设。
很棒的文章。清晰的区分。谢谢
谢谢。很高兴有帮助。
好文章!我对测试数据集有一个疑问。我必须将模型应用于一组新的测试数据,那么我如何预测未见过的数据集呢?这个未来的数据集是否已经收集并分析了程序?以及如何使用此程序验证单个客户?所以,我们真的需要一组新的客户数据吗?我说得对吗?
如果您有没有结果的新数据,那么您将使用最终模型(在生产/操作中)进行预测,而不是测试算法。
这有帮助吗?
嗨,Jason,
我有一个策略的问题,它对我的效果非常好。请让我知道这是否有意义。
我将我的整个数据分为训练、验证和测试集。然后我使用k折交叉验证和Gridsearch,即GridsearchCV来找到给出最低MSE得分的最佳超参数集。
现在,我在验证集上评估上述选定模型的性能,找出验证集上的MSE,进一步调整超参数(例如手动调整),看看是否可以降低验证集上的MSE。
然后,我将训练集和验证集合并,并使用第2步获得的参数训练模型,以在我的测试集上进行预测。
这是一种可接受的方法吗?
听起来合理。
你好杰森,感谢您的帖子..!
我想问一下,我们是否应该只在预测建模中进行这种划分,还是也可以在描述性建模中进行?我知道我们在预测建模中构建模型,然后测试准确性,而在描述性建模中,我们寻找一些模式,但在这方面,我们也使用了k-means聚类模型。
那么,在描述性建模中进行划分是绝对不行,还是不推荐,还是我们可以进行划分?
为什么您认为在开发描述性模型时拆分数据会有用?
我明白了,它理论上不应该存在,因为它没有预测任何东西,但我的脑子里有些困惑,所以我问了这个问题!
没关系,在开发描述性模型时,将其拟合到所有可用数据上。
你好,
这三个数据集的划分似乎是个好主意,我的直觉也同意。但是,如果您需要回答——使用验证集而不只是测试集的主要原因是什么?当测试集也与训练样本分离时,我们为什么要在其他数据集上调整参数,而我们使用相同的测试集来比较我们想要比较的每种方法?如果我们要在测试集上调整参数并比较每种方法的最佳模型,为什么这会是一种更糟糕的方法?
正如我提到的,我认为这是一个非常好的主意,而且有道理,但我无法说出在实践中除了使用测试集来评估模型和调整参数之外,还有什么理由使用它。
我们使用验证数据集来避免过度拟合测试集——例如,对任何数据集进行过多测试都会导致该数据集的自然爬坡和过度拟合。
我已经将原始数据划分为70/30的训练/拆分,然后我将训练数据再次划分为70/30的训练/验证。我设置了层数和阈值,然后在这个最后提到的训练集上训练我的模型。
我现在(在R Studio中)如何处理验证集?我是否计算(即预测),还是我重新创建神经网络,但不是使用训练数据,而是使用验证数据?
验证集可用于调整超参数,例如导致验证集上误差最低的参数。
这有帮助吗?
在您帖子 5.1 节“创建验证(测试?)数据集”https://machinelearning.org.cn/machine-learning-in-python-step-by-step/ 中,是否应该使用 Y_test 而不是 Y_validation?
为了简洁起见,我在大多数教程中都将测试集用作验证集。
https://machinelearning.org.cn/faq/single-faq/why-do-you-use-the-test-dataset-as-the-validation-dataset
你好杰森,我有一些问题
1. 在应用机器学习模型时,通常将拥有的数据集分为两类:训练数据和测试数据。解释一下为什么需要这两个类型的数据?在其他情况下,有时也需要验证数据。结合训练和测试数据,解释验证数据的含义?如果缺少其中一种数据会怎样?
2. 解释一下过拟合以及如何克服它!
3. 详细解释一下梯度下降(GD)方法在逻辑回归(LR)模型训练中的概念和工作原理!为什么可以确保 GD 方法能够找到 LR 模型最佳的权重值 w?
好问题。
一个数据集用于训练模型,另一个数据集用于评估模型的技能。验证可用于在评估模型在测试集上的性能之前调整模型超参数。我们不能为此目的使用训练集或测试集,否则评估将不好或无效。
更多关于过拟合的信息
https://machinelearning.org.cn/introduction-to-regularization-to-reduce-overfitting-and-improve-generalization-error/
梯度下降不是逻辑回归的最佳方法,但可以使用,并且是一个有趣的學習练习。这里有一个例子
https://machinelearning.org.cn/implement-logistic-regression-stochastic-gradient-descent-scratch-python/
嗨,Jason,
这是一篇很好的文章,可以澄清一些困惑。
我正在使用qPCR数据进行癌症标志物识别。我有一个训练/验证集和一个单独的测试集。在通过在训练/验证集上进行FS和k-CV识别出最佳标志物(一些重要特征的组合)后,我想确定该标志物在单独的测试集上的性能。由于最终目标是将最佳标志物(变量集)用于在其他临床中心进行诊断,因此以下哪种性能评估方法适用于此?
1- 方法1
model = fit(train) #train set是训练数据在包含所选标志物的特征上的投影
skill=evaluate(model, test)
这是经典方法,即在训练数据上建模,在测试数据上测试。
2- 方法2
i- 只取单独的测试数据和包含所选标志物的特征
ii- 将测试数据(多次)拆分为train_test和validation_test,然后取平均性能,如下所示
model = fit(train_test) #train_test set是训练数据在包含所选标志物的特征上的投影
skill=evaluate(model, validation_test)
在这里,我们在使用多个重采样的情况下,在测试数据上拟合模型并在测试数据上进行测试。
假设方法1和方法2都给出了良好的评估结果。如果我们使用方法1,为了在其他临床中心重新使用我们的标志物,我们必须提供用于查找标志物的参考数据集和标志物(变量)。然而,使用方法2,我们只能提供标志物(即变量)在其他中心使用,这才是我们的目标。
这是正确的吗?
抱歉,我不太明白。
也许可以测试每种方法,看看哪种方法能提供更稳健的方法评估?
先生,您能告诉我如何实现模型吗?如果我们有内容和值不同的训练和测试数据集,那么如何预测这个新值的测试数据集?
例如:在训练数据集中 - {id,customerid,age,valid},valid 是目标
在测试数据集中 {id,customerid,age},其中的值与训练数据集不同,即它是我们需要为此新测试数据集数据预测一个有效列的新数据。
请回复我,先生。
理想情况下,每个数据集都应代表更广泛的问题。
这是建模时的一个一般性要求。
你好,我有一个单独的训练和测试数据集。在清理数据时,通过插补缺失值和异常值,我应该同时清理训练和测试数据吗?
是的,但您只能使用训练集中的信息来清理这两个数据集,例如平均值/标准差/等。否则,您将遇到一种数据泄露。
一如既往的优秀文章,我学到了很多。我正在使用一种弱/远程监督方法来生成一些训练数据。所以现在我没有训练数据,意味着没有带有黄金标签的训练样本。尽管如此,我确实有有限数量的标记样本,我想将它们用作我的开发集和测试集。我有两个问题:
1)我的主要问题是,如果我不应该查看测试集,因为我们的结果可能会有偏见,我该如何确保我的测试集能够代表模型想要学习的所有情况?我们如何知道测试集涵盖了机器应该学习和将要评估的所有不同样本?
2)我的第二个问题是,如果我随机选择一个开发集并评估模型在开发集上的性能,我是否可以对开发集进行错误分析(例如,查看实际的假阳性和假阴性),然后返回并改进我的远程监督方法?根据您的文章,我意识到这可能会使我的模型有些偏见,但我想知道什么才是最好的做法。由于我的标记样本数量有限,我可能无法每次都创建新的样本用于测试集,所以至少我想确保我能最好地利用开发集来训练我的模型。
即使是简短的回复也会非常有帮助。非常感谢。
谢谢!
也许可以计算两个数据集的统计数据并比较样本均值?这是一个很好的第一步。
也许可以尝试一下,看看它对技能和/或过拟合有什么影响?
这是一篇很棒的博客,杰森。我很欣赏您为此付出的努力,并耐心回答我们的问题。我有一个基本的困惑,我的问题是这样的。如果已经被回答过,我很抱歉(我看了但无法澄清这一点)
所以,假设我有一个包含2000个样本的数据集,我将其划分为1000:500:500(训练:验证:测试)。假设我将纪元数设置为30。每个纪元结束时,通过检查验证数据上的性能来计算准确率分数。这是否意味着模型会多次查看相同的验证数据集?然后,如果数据被多次访问,就像训练数据一样,验证集保持独立有什么意义?
谢谢!
是的,验证集将在每个纪元的末尾进行评估——但它不用于训练模型,只用于客观地(某种程度上)评估它。
这有帮助吗?
是的,它有点像这样。但是,如果模型在验证数据上进行计算以获得评估分数,这是否会影响可靠性?(我明白参数在评估期间不会更新),但经过第一个纪元后,验证数据就不是“未见过”的了。谢谢
不行。
除非您大量使用分数,并且您——自己——作为人类操作员——通过选择要运行的实验开始过度拟合验证集。这种情况可能会发生。
嗨 Jason
将数据按60%训练、20%验证、20%测试拆分是否正确?然后拟合模型,然后在验证集上验证模型,通过获取最佳超参数/超参数调整,并停止训练到最佳纪元以避免过拟合,然后将调整后的模型应用于测试数据进行预测?
这是一种方法,没有“最佳”方法。
看看什么最适合您的特定数据集。
你好。我能看到最终的超调参数吗?我使用简单的验证进行超调,然后在验证损失较低时将训练停止到30个纪元。
其次,我想问一下model.predict的预测是否有效?就像我在您的示例中看到的。3.CNN用于时间序列数据的二元交叉熵是否也可以用于回归,还是仅用于分类问题?我对这个感到困惑。如果您有链接,请分享。谢谢
您可以打印或保存超参数。
更多关于keras的model.predict()
https://machinelearning.org.cn/how-to-make-classification-and-regression-predictions-for-deep-learning-models-in-keras/
交叉熵仅用于分类。
对于像风力预测这样的时间序列数据预测,我应该使用mse作为损失函数还是CNN的交叉熵?
如果您预测的是数值,则使用mse;如果您预测的是类别标签,则使用交叉熵。
https://machinelearning.org.cn/how-to-choose-loss-functions-when-training-deep-learning-neural-networks/
我正在使用CNN对风力时间序列数据进行预测,并将实际值与预测值进行比较,并以mse作为性能指标。但是,正如您之前所说,您不能将交叉熵用于回归问题。我正在预测电力。所以,用交叉熵预测电力(当然是数值形式)是可以的,还是应该在CNN中使用均方误差作为损失函数?
听起来您应该使用均方误差损失。
我正在使用二元交叉熵作为风力时间序列数据预测的损失函数,性能基于mse。不是均方误差,并且使用pytorch在python中。
除非目标是数值,否则我认为这很奇怪。
我在全连接层使用了sigmoid而不是softmax,并且取得了不错的结果。可以吗?
输出层中的Sigmoid用于二元分类任务或多标签任务,但不用于多类分类。
非常感谢杰森提供这篇文章,它简直是救命稻草。
对我来说,最好还是处理数字。假设我们有1000个数据样本,其中66%将用于训练,33%用于最终模型的测试,我正在使用10折交叉验证。现在我的问题出现在验证和交叉验证的百分比上。
我的理解是,我们将从训练数据中构建10个模型,每个模型使用(10%)训练数据(占总数据集的0.1*66%),并使用不同的10%训练数据进行验证。从这10个模型中,我们调整最终模型的参数,并使用33%的测试数据来获得模型的最终估计。
并且在验证和训练中,我们都获得了无偏估计,我理解得对吗?
是的,如果您有足够的数据,这种划分是可以理解的。
嗨 Jason,在这篇文章中你提到了独立的测试集。这是什么意思?是指从训练数据集中抽取但不同的数据,还是指这个独立的测试集是用与训练集完全不同的数据组成的?
这意味着测试集不用于训练模型。
好的,谢谢你的回复。我问这个问题是因为我正在做一个聊天机器人项目,我的团队想使用聊天机器人回收的数据作为测试集,而不是训练集(我们自己生成训练数据)。这样做有意义吗?因为从我的角度来看,我们应该将回收的数据放入训练集和测试集中。
这 realmente 取决于测试框架的目标——正在测试/评估什么。
我们想评估聊天机器人对句子含义的识别能力。
我没有关于聊天机器人的教程,也许可以查阅相关主题的文献?
好文章,我只有一个疑问,我听说我们应该使用测试数据集来评估两个或多个不同模型的性能。但是,如果我们对训练和验证两个模型都使用完全相同的数据,我们是不是就无法消除测试数据集的使用了?因为它们都使用相同的数据,所以理论上它们在验证数据集上过拟合的机会是相同的。
是的,如果你有足够的数据,你应该有独立的训练、测试和验证集。
亲爱的 Jason,
感谢这篇精彩的文章。
我对你最后提到的嵌套交叉验证感到有些困惑(我的数据集很小,所以尽量不遗漏数据块对我来说非常重要)。
1. 假设你对整个数据集进行10折交叉验证
2. 在每次迭代中,你将一个折留作测试,并在剩余的9折上进行交叉验证以调整模型超参数。
但是,在步骤2的每次迭代中,你可能会选择一组不同的超参数。那么,最终你用的是哪一组呢?一个自然的答案是通过对整个数据集进行交叉验证来选择具有最低测试误差的超参数集。但是,为什么不直接通过对整个数据集进行交叉验证来选择超参数呢?(后者稍显不足,因为它意味着验证≈测试,但我找不到出路,尤其是在步骤2中可能没有两组超参数是相等的,所以也没有多数投票。)
非常感谢,
JC
正确。
再次正确,每次都有一组不同的超参数。
你实际上是在交叉验证模型配置过程。结果会表明:当你使用“这个”模型和“这个”调整过程时,结果平均来说是“那样的”。
对于小数据集,嵌套交叉验证可能是目前最稳健的方法。我将尽快写一篇关于此主题的专门文章。
嗨,首先,谢谢,这些文章真的很有帮助。
我有一个关于分类的小型数据集(大约 1000 行),我的疑问是关于我正在遵循的过程
1)首先,我准备数据。
a) 我删除了可能无用的列;
b) 我对所有数据使用 oneHotEncoder 来获得相同数量的特征;
c) 我将数据分成训练集和测试集(80/20);
d) 我分别对每个子集进行一些归一化。
2)然后,对于以下过程(特征选择等),我只使用训练集;
3)为了选择和调整模型,我使用交叉验证,并使用 cross_val_score 将训练集分成训练集和验证集;
4)在发现最佳模型和超参数后,我将整个训练数据拟合到模型中;
5)最后,我在测试数据上评估模型。
我的问题是
这是正确的做法吗?
在评估步骤中,我的准确率是 80%,但是在最终(测试集)上只有 50%。模型可能因为数据太少而过拟合了吗?
我做了一个测试,如果我改变数据集的划分(70/30),准确率会更接近,例如评估为 75%,测试数据为 70%。这正常吗?
也许吧。没有什么是“正确”或“正常”的,只有不同的方法。
使用一个你信任的测试框架来可靠地估计模型性能。
这个过程也可能给你一些启发
https://machinelearning.org.cn/start-here/#process
我目前喜欢用于分类的嵌套重复分层 k 折交叉验证。
好文章。
亲爱的 Jason。我有一个关于验证数据集的查询。假设我们正在使用 10 折交叉验证,为什么这个术语在交叉验证中消失了?为什么不能将每个折视为验证数据集?
如果我们使用人工神经网络和 10 折交叉验证,那么训练和验证折是否可以用来确定模型的泛化能力,还是如你在关于学习曲线的另一篇文章中所讨论的那样,使用最终测试集来确定泛化能力?
提前感谢
这是一个测试集,而不是验证集。验证集将从 CV 过程的训练部分分割出来——例如,如果我们进行 CV 内的网格搜索。
嗨 Jason!一如既往,精彩的文章!我在做一个项目时注意到一些奇怪的现象
“我的交叉验证(k=10)准确率的平均值持续低于我的最终测试数据的准确率”。
你能帮我理解为什么会这样吗?
谢谢。
也许你的测试数据太小或不能代表整个数据集?
嗨 Jason!好文章。
我不知道你是否问过这个问题。
进行训练/测试分割(80%-20%),然后对 X_train 和 y_train 使用 k 折交叉验证是否有意义?
我之所以这么说,是因为在绝大多数情况下,我看到 k 折交叉验证被用于整个数据集。
是的,可以,只要测试集能够代表更广泛的问题,它就可以用作技能的最终检查。
太棒了。我明白了定义。
干得好!
谢谢 Jason 的文章,但我对数据集的类型仍然有一个疑问。
我阅读了许多关于这类数据集的文章,它们大多得出结论,应该有三种数据集:用于训练模型的训练数据集、用于调整最佳模型超参数的验证数据集,以及用于最终性能测量的测试集。但在你的文章中,你只说了需要两种数据集,即训练数据集和验证数据集。所以,我的问题是:
1)使用网格搜索 CV 进行超参数调整时,应该使用哪个数据集?是整个训练数据集,还是需要分割训练数据集使用?
2)哪种数据划分更好?例如,分成三部分(训练、验证、测试)还是分成两部分(训练、验证),考虑到我们还要进行网格搜索 CV!
我之所以产生这个疑问,是因为在其中一篇关于如何构建第一个模型的文章中,你只用了两个数据集,并称它们为训练数据集和验证数据集。你根本没有提到测试数据集,你能解释一下原因吗?
你能帮帮我吗?
不完全是。该教程介绍了 3 种数据集:训练集、测试集和验证集。
验证集用于网格搜索超参数。
没有“更好”的说法,只有不同的方法。你必须选择一种适合你的项目/数据的方案——让你有信心能够估计模型在预测新数据时的技能。
是的,我大部分的教程都保持简单。
https://machinelearning.org.cn/faq/single-faq/why-do-you-use-the-test-dataset-as-the-validation-dataset
我明白了需要维护三个数据集,但如何使用验证数据集还不清楚。你能解释一下如何精确地使用验证数据集和训练数据集吗?比如在哪些地方需要使用它们?例如,如果我们把数据集分成三部分,然后使用训练数据集进行交叉验证,使用分层交叉验证来检查各种算法,那么在获得所有算法的最佳模型后
1)我们需要在训练数据集上使用网格搜索 CV,然后在验证数据集上预测值吗?还是我们需要使用整个数据集(训练+验证),然后在整个数据集上检查性能,然后再进行测试集以进行最终评估?
验证数据集通常用于调整模型的性能。
一种方法是在每个交叉验证折内进行网格搜索,这称为嵌套交叉验证。
谢谢你的文章,我也有一个问题,如果你有测试集和训练集,但你想要验证集呢?
我不明白,你的意思是什么?能详细说明一下吗?
感谢 Jason 的这篇详尽的文章。
你能详细阐述一下最后一段吗?
“当嵌套的交叉验证用于模型超参数的交叉验证时,对“测试数据集”的引用也可能消失。”
此外,我还在尝试进行特征选择。我是否可以使用 CV 的折叠作为验证集来确定最佳特征?将所有折的平均特征重要性作为标准是否可以?
不客气。
我建议在嵌套交叉验证时不需要更广泛的训练/测试/验证分割。
特征选择可以是交叉验证的模型管道中的一个步骤。
嗨,Jason,
谢谢这篇好文章!我想问你一些问题。对于三种数据集划分(训练/验证/测试)的定义或可用性,在考虑不同类型的 ML 模型时是否有任何区别?例如,参数模型(神经网络)在训练阶段使用验证集的方式是否与非参数模型(KRR)不同?例如,神经网络是否比 KRR 需要更大的验证集?
不完全是。数据应该是代表性的(独立同分布)。
Jason,谢谢你的文章。我喜欢你的讲解风格。但是,对我来说仍然不清楚:在使用交叉验证时,是否应该保留单独的测试集。让我引用维基百科
为了验证模型性能,有时会使用从交叉验证中保留的附加测试数据集。
(https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets)
你觉得呢?
通常不会。
亲爱的 Jason,
感谢您对这个问题的精彩总结和讨论!!请给我一些建议
我有 1500 个特征(蛋白质),二元结果,以及少量数据(235 个观测值)
使用不同的 ML 方法进行特征选择,我最终得到了一组不同的选定蛋白质,我需要计算它们的准确率。对于特征选择,我使用了整个数据集,因为这种疾病被认为具有复杂的病理学,并且每个观测值都很重要。现在,为了计算不同选定蛋白质组的准确率,我为每个选定的特征组构建了 glm 模型,并使用整个数据集的 5 折交叉验证来计算平均准确率。我没有使用单独的测试集,因为我担心任何分割方法都无法得到包含代表该疾病复杂病理学观测值的测试集。这样想合乎逻辑吗?还是我通过从一开始就不保留测试集而得到了错误的准确率?
非常感谢您的意见
我认为您是在询问如何计算不同类别的准确率。
我们不能这样做,因为准确率是一个全局分数,取而代之的是,您可以使用每个类别的精确率或召回率,这将有所帮助。
https://machinelearning.org.cn/framework-for-imbalanced-classification-projects/
另外,在评估多类别模型时,我建议使用分层 k 折交叉验证,以便每个折与原始数据集具有相同的类别示例平衡。
https://machinelearning.org.cn/cross-validation-for-imbalanced-classification/
在执行 CV 后,您是使用交叉验证的模型来预测测试集,还是使用全部训练数据重新训练模型,仅应用最佳参数?
不,来自交叉验证的模型会被丢弃。
当您需要进行预测时,在所有数据上重新训练模型。
https://machinelearning.org.cn/train-final-machine-learning-model/
嗨,Jason,
感谢您撰写此文。如果我对我应该如何进行训练/验证/测试分割没有直观的认识,我可以尝试几个不同的分割,为每个分割调整模型,然后选择获得最佳测试结果的分割,或者我是否已经因为我的模型受到它的影响而失去了测试集的意义?
不客气。
是的,或者探索模型对数据集大小的敏感性,并以此来指导分割大小。
嗨 Jason,我刚发现你的网站(以及你的一些文章),因为我刚开始做机器学习。我有一个广泛的编程和网络设计背景,所以机器学习是我新的研究领域,我真的很想说你为我澄清了很多问题,所以我很感谢你的工作,以及你多年后仍然回复这些评论。
我希望能得到你关于 K-Folds 的一个问题的澄清。
模型的验证/分类器与训练模型有什么区别吗?例如,我在使用 Weka,选择一个分类器(例如 NaiveBayes)并选择一个 10 折测试方法,它向我显示了模型的准确率。这是否意味着我有一个“训练好的”模型,我可以开始输入数据并产生结果?或者,“交叉验证”只是一个使用不同方法来确定模型/分类器在特定数据集上的有效性的工具?
在我阅读了你的文章后,我认为验证不是训练,并且简单地说,K-Fold 只是调用 K 次“fit()”函数,并在使用 K 折作为测试数据集时提供加权准确率分数。
希望这能说得通,你能澄清一下。再次感谢你的工作,你让很多人的生活变得更轻松。
谢谢!
你必须先训练模型才能评估它。
使用 k 折交叉验证将拟合 k 个模型,作为估计“算法”在预测训练过程中未见过的数据时会表现如何的一部分。所有这 k 个模型随后都会被丢弃,当你需要进行预测时,你会训练一个最终模型。
这有帮助吗?
是的,我希望如此,哈哈。
我最初认为 k 折交叉验证是一种不同的训练模型使用方式。然而,如果我现在理解正确,并查看您这里的示例(https://machinelearning.org.cn/machine-learning-in-python-step-by-step/),我认为我将 k 折交叉验证理解为一种更好地评估分类器/模型以供使用的方式。
例如,查看您的 Python 示例,该过程使用 k 折交叉验证来评估在我们数据集上训练的几个不同模型。然后,我们可以根据结果(通常我认为是最高的准确率)选择我们想要的模型。然后我们选择该模型,并根据我们的数据集对其进行“拟合”(我认为在适当的情况下,我们将把数据集重新组合成一个单一的,从测试/训练分割中——我注意到您只使用了训练分割来拟合模型)。此后,我们就有了一个训练好的模型实例,可以使用它来开始对新数据集进行预测了吗?
再次,我只想感谢你的帮助和你发表的文章。
正确。我称之为最终模型。
https://machinelearning.org.cn/train-final-machine-learning-model/
非常感谢!
如果使用相似的验证集和测试集,有什么问题?
相似是好的,相同是坏的。
这可能导致通过过拟合对模型性能进行乐观评估。
验证集也是未见过的数据,就像测试集一样。如果是这样,有什么理由担心过拟合吗?
还是说,使用验证集作为测试集在实践中被证明是错误的?
是的,如果测试集或验证集太小或不具代表性,或者验证集未用于在过拟合点停止训练。
感谢您的回复和您慷慨的教程!
但我还在继续提问,我相信你能让我明白这一点。
我面临的主要问题,让我在不断提问的是“泄漏”的概念。
我阅读了你关于 Walk Forward Validation 的教程
(https://machinelearning.org.cn/backtest-machine-learning-models-time-series-forecasting/)
其他教程也称这种技术为时间序列分割,并指出其缺点是
“这种重叠的样本不太可能独立,导致信息从训练集泄漏到验证集。”
(https://medium.com/@samuel.monnier/cross-validation-tools-for-time-series-ffa1a5a09bf9)
“然而,这可能会导致未来数据泄漏到模型中。模型将观察未来模式来进行预测并尝试记住它们。”
(https://hub.packtpub.com/cross-validation-strategies-for-time-series-forecasting-tutorial/)
因此,我提出的主要问题是:
1、这种方法是否存在“泄漏”?我找不到任何好的论文来回答这个问题。
2、在训练中使用验证集时是否存在“泄漏”?这会产生影响
在使用相同的测试集和验证集时。
3、如果存在,如何存在?
4、如果存在,我们是否不能说一般的训练-测试分割比前向验证更好
对于时间序列?
正确使用前向验证不会导致泄漏。
在进行前向验证时使用“验证”集是不合适的/不可行的。你只能使用训练/测试分割,然后在测试集上进行前向验证。
代码部分非常有帮助,但我仍然对以下情况感到困惑:
-在验证集上调整了两个不同的模型(例如逻辑回归和随机森林分类器)。第一个模型的验证准确率为 90%,第二个模型的验证准确率为 85%。
-当在测试集上评估这两个模型时,第一个模型的测试准确率为 60%,第二个模型的测试准确率为 85%。
-第二个模型的测试和验证准确率保持不变,第一个模型的测试准确率远低于其验证准确率。
应该怎么做,应该重新开始吗?只评估第一个模型在测试集上的表现会更好,因为它具有最高的验证准确率吗?这种情况是否看重低模型方差?应该选择哪个模型?
理想情况下,我们应该在项目开始之前,在知道任何数字之前就定义“我们将如何选择模型”。
这些差异很大。这可能表明测试框架不稳定,不适用于模型/数据集。例如,也许测试集太小且不具代表性。
我认为你关于测试集的说法是正确的,谢谢你的回复!
不客气。
对于将数据分割为训练集、验证集和测试集的第一种情况,最终模型仅在训练集上拟合,而忽略了验证集。这样做有原因吗?
然而,在 k 折交叉验证示例中,最终模型是在整个训练集上拟合的。我相信第一种情况也可以使用验证集来训练最终模型。
谢谢你
rajesh
是的,通常验证集用于调整超参数或在早期停止中使用。
你好,
如果我们将数据集拆分为训练集和测试集,然后在训练集上执行k折交叉验证,以便在每次验证的折中调整超参数,我们最终如何选择模型?因为每次使用k-1折训练的模型都会产生一个不同的模型,可能具有不同的特征等,那么在执行k折交叉验证后,最终的机器学习模型是如何选择的?
谢谢你
是的,您可以使用嵌套交叉验证,它会自动为您创建验证集。
请看这个例子
https://machinelearning.org.cn/nested-cross-validation-for-machine-learning-with-python/
Jason您好,感谢您的教程,这对我们非常非常重要,因为市面上缺乏足够具体的内容。如果我理解得没错,您提到……如果从业人员选择使用k折交叉验证来调整训练数据集的模型超参数,那么“验证数据集”的引用就会消失……在我的例子中,我拥有时间序列数据,将数据集分成70:30。然后,我使用交叉验证(10折CV,使用TimeSeriesSplit)来调整70%的训练数据的超参数,但我只在30%的测试数据上评估模型的性能。我猜这与您提到的情况相符,对吗?非常感谢,非常感谢您的帮助。
不客气。
Jason您好,我在上面的评论中也问了一个问题。您能给我一些反馈吗?非常非常感谢您:)
如果您描述的方法适合您的项目,那么它就是一个好方法。如果没有深入了解您的项目,我很难评论。
也许可以测试一下,并与其他可能的方法进行比较,例如将训练集拆分为训练/验证集,并使用验证集进行调整。
太棒了!谢谢。
不客气。
感谢这篇精彩的文章。我想知道是否可以将k折(训练)分成两半并分别用于训练模型(先用前一半折进行训练,然后用后一半折进行训练),同时保持验证集不变?或者与之相关的任何文章都会很有帮助。
当然,您可以以任何您喜欢的方式设计测试框架——只要您信任结果。
太棒了!谢谢。
不客气。
您好,我又遇到了一个疑问,如果您能澄清一下就太好了。
model = fit(fold_train, params)
skill_estimate = evaluate(model, fold_val)
所以,在“验证集和测试集消失”中提到了上面的代码段。
1. 这是否意味着 fold_val 是验证集?
2. 难道不应该使用 evaluate() 来处理测试数据吗?
3. 我们可以在 fit 函数中使用 fold_val 作为 validation_data 吗?(就像我们通常在一般情况下做的那样)。如果不行,为什么?
我推荐这个教程
https://machinelearning.org.cn/k-fold-cross-validation/
谢谢你
不客气。
你好,
如果我有一个不平衡的数据集,我需要,例如,在交叉验证的每次迭代中应用一个欠采样技术。然后,我需要在最后的评估中也这样做吗?我的意思是,上面伪代码的最后一部分应该是
# 评估最终模型以与其他模型进行比较
model = fit(undersampled_train)
skill = evaluate(model, test)
?
提前感谢!
是的,该过程将应用于CV的每个步骤。
是的,一旦您选择了某个过程,它将应用于整个数据集,以便准备一个最终模型来对新数据进行预测。
您好,嵌套k折交叉验证是选择多个算法中的最佳算法并调整其超参数的好方法。如果我们坚持“经典”的训练验证和测试集实践,……我倾向于同时使用验证集来选择最熟练的算法(在一组算法中)并对其进行迭代调整。完成这些后,我将选定的(并调整好的)算法移植到测试集上进行最终技能评估。这仍然是一种合理的方法吗?
没有“最好的”方法,只有很多不同的方法。
如果您的流程对您来说效果很好,那就使用它。
您好~~~
感谢这篇精彩的文章。
在您的文章中,代码行号11-13
11 : # 评估最终模型以与其他模型进行比较
12 : model = fit(train)
13 : skill = evaluate(model, test)
以及您的补充说明是
“最终模型可以拟合到训练集和验证集的聚合上。”
我的问题是
在找到最终调整的超参数后,我是否应该使用train+validation数据集重新拟合模型?
11 : # 评估最终模型以与其他模型进行比较
12 : model = fit(train+validation) <<<<<<< 这是对的吗?
13 : skill = evaluate(model, test)
是的,通常最终模型会拟合到所有数据上,并用于开始对新数据进行预测。
感谢您的回复,我已阅读了您的精彩著作!
不客气。
Jason您好,感谢您的精彩教程!
我有一个用于文本分类的数据集,用于检测情绪,分为三个文件:训练、开发和测试,每个文件有一个类标签(非二元),用于检测一种情绪,例如“悲伤”。我想用机器学习算法检测情绪,我该如何训练模型?我使用哪些文件进行训练(训练集还是开发集)?
以及我是否可以在机器学习中对一个类标签进行验证?
不客气。
也许可以先将数据加载到内存中,并将其组织成带有输入和输出元素的样本。
嗨,Jason,
我正在处理大型数据集上的CNN,并且需要为每个epoch绘制训练和测试准确率。如果我已经决定为模型使用一组给定的超参数,我是否可以将整个数据集只分成训练和验证数据,并将验证准确率作为测试准确率(正如您在文章中为了简洁而经常做的那样)?
我这样做的主要原因是使用history回调函数更容易绘制验证准确率。我计划手动尝试几种超参数组合,并为每种组合绘制图表。
提前感谢!
这个教程会有帮助
https://machinelearning.org.cn/display-deep-learning-model-training-history-in-keras/
您好。这是一篇很棒的文章,但我有一个问题。
我们能否在期刊论文中报告我们的结果,当我们不使用验证集时?
或者,我们最好询问何时可以使用训练集和测试集而不使用验证集?
您能给我一个参考吗?
谢谢你
谢谢。
您可以使用k折交叉验证,并报告模型性能的平均值和标准差。
https://machinelearning.org.cn/k-fold-cross-validation/
Jason您好!感谢您所有的文章。它们对我帮助很大,但我有一些问题。我上个月才开始学习机器学习。
我的数据集有300行,我将数据以70:30的比例分成了训练集和测试集。并使用了kfold。由于我的数据主要是“object”数据类型,我使用了独热编码。
问题是,我的训练集(对于逻辑回归和梯度提升)达到了100%的准确率。我根据在网上阅读的内容假设这是过拟合。但我不知道如何解决这个问题。您认为最好的解决方案是什么?
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/what-does-it-mean-if-i-have-0-error-or-100-accuracy
通过说
“偷看是使用测试集性能来选择和评估假设的结果。”
“选择一个假设”的表达等同于我们所知的“模型选择”,还是仅仅是“最终训练模型”?您的意思是验证集只是用于最佳模型选择,而测试集是通过重新测试最终选择的最佳模型来增加额外的安全层?
验证可以用于调整测试集确定的最佳模型。
嗨,Jason,
感谢这篇精彩的文章。
我有一个问题:我可以在测试网络时将验证集包含在测试集中吗?
我从机器学习专家那里听说,有时人们会将验证集添加到测试集中,因为验证集不是网络训练的数据集。大多数情况下,当数据量不足时,人们会使用这个想法。
您是否有任何参考资料(文章、书籍)说明有时人们会将验证集添加到测试集中?
不客气。
不。将验证集包含在测试集中可能是个坏主意。它们应该分开。
你好,Jason!
只想说我多么喜欢您的网站。您提供了我读过的最清晰的机器学习解释。
感谢您的美言和支持!
“验证集不同于也从模型训练中保留的测试集,而是用于对最终调整模型的技能进行无偏估计,以便在比较或选择最终模型之间进行选择。”
但是,如果您在实验中有许多不同的方法,例如随机森林(RF)、SVM和逻辑回归(LR)怎么办?假设使用了训练/验证/测试拆分。
所有这些模型都可以独立地在验证集上进行调整,以获得每个模型的最佳配置。但是,您如何在这三种方法之间进行选择?我认为您是在说,每种方法的最优配置都在测试集上进行评估,然后我们从中选择最佳的。因为您在“……比较或选择最终模型之间”中使用了复数。
为什么可以在测试集上选择方法,而只能在验证集上进行调整?特别是如果我尝试了许多机器学习算法,我可能会不小心选择了碰巧在测试集上表现良好的算法。
还是我误解了您的帖子?最佳方法是根据验证误差或测试误差选择的吗?区别在于允许只有一个最终模型在测试集上进行评估(例如,如果SVM具有最佳验证误差,则只评估SVM),还是允许每种学习方法(SVM、RF、LR)的最终模型在测试集上进行评估。
“最终模型可以拟合到训练集和验证集的聚合上”
那么,在测试评估完成后,在聚合中也添加测试集是否没有原因?
是的,在留存测试集上获得最佳性能。另一种方法是使用嵌套交叉验证。
在未用于训练或调整模型的数据上进行评估至关重要。否则,结果可能会有偏差/误导,导致您可能选择了一个看起来比实际表现更好的模型。
你好 Jason,
一如既往,关于训练、验证和测试数据集的优秀读物。
即使是评论区的讨论也帮助我深入了解了验证的必要性。
请继续分享您的好作品!!
非常感谢。
谢谢,很高兴听到这个!
亲爱的 Jason,
感谢您这篇清晰的文章。训练、验证和测试数据集是否总能没有错误?
祝好,
C
不客气。
不,数据集几乎总会包含错误。
感谢您的及时回复。为什么?因为总有一个选择问题来减少偏差和与其他变量的错误?从技术上讲,偏差和错误之间有区别吗?
偏差是一种错误。
数据集通常是对世界事物的度量,并且其中包含错误。
该领域可能本身就存在冲突的度量。
度量中可能存在统计噪声。
可能有人工介入并犯了错误。
等等。
此外,所有模型都有误差,它们并非与生成数据的底层过程完全匹配。如果它们是的话,我们就不需要机器学习了——问题会简单得多。
谢谢!非常有帮助!
不客气!
你好,
我的问题是如何正确地教CNN进行MNIST,以满足此页面上给出的定义。
1. 采用 MNIST 训练集(60000 张图像)和测试集(10000 张图像)
2. 构建 CNN 网络 – 模型
3. 使用 model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=epochs,batch_size=32,verbose=2) 学习 CNN 模型
给定 200 个 epoch,是否可以从学习到的 200 个 epoch 中选择具有最佳验证准确率的 epoch?
也许这会有帮助。
https://machinelearning.org.cn/how-to-develop-a-convolutional-neural-network-from-scratch-for-mnist-handwritten-digit-classification/
我能联系到 dareks_inf@gmail.com 吗?
我正在准备新的CNN分类算法,并且对这个问题的回答非常重要!
JK
您可以随时直接在这里联系我。
https://machinelearning.org.cn/contact/
当然,如上面链接所示,神经网络被创建和训练,通过k折交叉验证,不使用MNIST测试集,只依赖于训练集。而且这样做有效。
但我的问题是,是否可以给定训练集和测试集来训练神经网络,并在学习过程中根据测试集上的最佳验证准确率来选择 epoch(通过 keras Callback 类)?MNIST 中的 10000 张图像的测试集。
(X_test,y_test),epochs=epochs,batch_size=32,verbose=2, callback)
记录最佳测试准确率,并将其保存为模型以进行预测?
我相信您可能指的是提前停止。
https://machinelearning.org.cn/how-to-stop-training-deep-neural-networks-at-the-right-time-using-early-stopping/
刚开始学习机器学习。这篇帖子确实帮助我掌握了区别。非常感谢!
不客气!
您的数据总是帮到我,谢谢。
您是否有关于验证重要性的任何额外文章、期刊或材料推荐?
我想了解更多!!
XD
谢谢。
手头没有。
好的
🙂
你好 Jason,
感谢您付出的所有努力。我是机器学习新手。我有一个数据集,但样本量很小,只有 1500 个观测值。因变量有 5 个类别,我将它们视为从 1 到 5 的顺序。我将应用 5 折交叉验证来查看我的模型在预测方面的表现。我的问题是,我可以只取这些预测结果(所有 1500 个)并将其准确率与其他模型进行比较吗?还是我必须将 1500 个分成 70/30 的比例?我以为只需要训练并进行交叉验证来衡量准确率,而不是将数据集分成训练/测试。
此致!
您会将 k 折交叉验证的结果平均值与另外的 k 折交叉验证结果平均值进行比较。
Jason,这篇文章写得很好。我还是有些困惑。
我使用重复随机抽样(75% 训练和 25% 验证)训练了一个神经网络,然后我使用所有结果模型,大约 40 个,在我的数据上,并对它们的結果进行平均以做出预测。
我仍然可以称我所做的是交叉验证选择吗?
我使用整个训练集来衡量性能,认为这是有效的近似,对吗?
谢谢。
不,这是重复的训练/测试拆分。这种方法通常比重复的 k 折 CV 具有更具偏差(乐观)的性能估计。
嗨,Jason,
感谢您的精彩文章。在我的实验中,我将数据分为 70% 用于 10 折交叉验证,30% 作为最终阶段的未见数据,以展示模型在未见过的数据上的工作情况。您有什么建议?
如果您有十亿个样本,即使预留 1% 的数据用于最终阶段也是 1000 万个样本。因此,一切都取决于您的具体情况。
这是一篇信息丰富的文章。我发现它非常有帮助,让我对测试集、验证集和训练集之间的区别有了清晰的认识。我唯一的建议是,应该给出 k 折交叉验证的清晰定义,或者在文章中删除其提及,因为它不能取代文章的主题——清晰地区分测试集、验证集和训练集。
感谢您的建议。您可能也会喜欢这篇帖子:https://machinelearning.org.cn/training-validation-test-split-and-cross-validation-done-right/
嗨,Jason,
首先,非常感谢您写了这篇精彩的文章。
我有一个问题,不是为了挑剔,只是为了确保我是否都理解对了。
在第一个伪代码的第 13 行,您写道:model = fit(train)。如果写成:model = fit(train, params*),其中 params* 是在 for 循环中选择的超参数,即具有最佳技能的那些,是否会出错?
举个例子,如果我正在训练一个多项式回归,其中 K = 我多项式的次数,在超参数调整阶段,我会选择 K 的值对我的模型来说是最好的。假设在调整阶段,我最终选择了 K=3 作为最佳选择,那么最终的模型将是:model = fit(train, params*),其中 params* 代表 K=3。
这正确吗?
是的,您说得对。那只是伪代码,所以有些不精确。您可以在这里看到一个实际的例子:https://machinelearning.org.cn/training-validation-test-split-and-cross-validation-done-right/
非常棒的文章!
我找到了这个 fast_ml Python 包,里面有一个 train_valid_test_split 函数
from fast_ml.model_development import train_valid_test_split
我想问您几个问题
1 – 我们可以将训练集和验证集都用于 model.fit()。那么,在 model.evaluate() 中应该使用哪个数据集?验证集还是测试集?如果使用验证集,有什么理由使用它,因为我们已经在 model.fit() 中使用了它?
2 – 当我们尝试通过 model.predict() 进行预测时,同样,应该使用哪个数据集?验证集还是测试集?
(1) 使用测试集进行 evaluate()
(2) 如果您调用 predict(),您会使用一些新的数据(假设您已将模型部署到实际环境中),或者使用测试集
嗨,Adrian
又一篇好文章
我有一个问题,我想了解模型的评估时间,意思是我想知道我的模型每秒训练多少样本。那么,在这里,为了计算每秒训练的样本数,我应该只考虑训练数据集还是验证数据集?还有一件事,我有单独的训练、验证和测试数据集,没有使用 train/split 函数。
不胜感激
此致
嗨 HS… 这篇关于基准测试的文章可能对您有帮助
https://www.neuraldesigner.com/blog/how-to-benchmark-the-performance-of-machine-learning-platforms
你好 Jason,
精彩的文章。我经常访问您的网站,以便更好地理解机器学习概念。
感谢您分享的关于如何有效地利用现有数据来训练和评估模型,直至中间到最终阶段的简单但非常有用的内容。
非常感谢您的分享。
致以最诚挚的问候,
Poonam
一些论文除了在测试集上报告性能外,还在开发集(dev set)上报告性能。这样做有什么意义?比较它们有什么好处吗?
嗨 Zhana… 建议您尽可能拥有 3 个数据集:训练集、测试集和验证集。有些人称最后一个为“开发集”。它代表了训练网络从未见过的数据,与测试数据集类似,但它来自代表生产环境中将看到的数据的总体。
是的,确实如此。但指标通常是在测试集上报告的,例如在测试集上的 f1 分数。为什么有些论文会在测试集和开发集上都报告 f1 分数?它们想展示什么?有什么意义?
嗨 Zhana… 您的理解是正确的。我建议您不要遵循您可能在一些论文中看到的流程。总会有人试图让他们的结果看起来比实际更好。
我想确保我理解正确。
给定 X 和 y
1) 将 X 和 y 分为 X_train, y_train, X_test, y_test,例如 80/20
2) 将 X_test, y_test 放在一边,仅用于最终模型评估。
3) 当使用交叉验证时,例如 StratifiedKFold 验证,仅使用 X_train 和 y_train 进行。
4) 在调整好超参数并准备好模型后,我们可以在测试集上评估模型。
如果不是使用训练集进行交叉验证,而是使用整个数据集,将会导致
a) 数据过拟合
b) 对我们算法性能的评估过于乐观,以及数据泄露。
您能告诉我我在这里写的对吗?
嗨 Daniel…是的!您的理解完全正确!
太棒了
感谢您的快速回复和精彩的博文。
如果使用整个数据集作为训练数据集进行交叉验证时,得到的 RMSE 高于在测试数据上测试的模型(当然假设整个数据集按 80:20 的比例划分),会发生什么?
嗨 Learning… 以下内容可能有助于您了解欠拟合和过拟合
https://machinelearning.org.cn/overfitting-and-underfitting-with-machine-learning-algorithms/
你好,谢谢你的解释!它对我帮助很大。但对于我的模型,在超参数调整并选择最佳超参数后,我想用最佳参数在数据集(训练+验证)上拟合模型,以获得更好的学习效果并更好地估计测试集上的性能。但是,当我使用 train+validation 数据集训练模型时,如何在 Python 的 .fit() 方法中避免在训练期间过拟合,因为没有指定更多的“验证数据”字段?通常,训练会停止,如果 val loss 停止下降(并具有一定的耐心),以避免过拟合,但在这里,如果我所有的可用数据(训练+验证)都用于训练模型,我该如何避免过拟合?
谢谢您的考虑=)
嗨 Aurelie… 以下资源希望能为您带来一些启发
https://machinelearning.org.cn/early-stopping-to-avoid-overtraining-neural-network-models/
https://elitedatascience.com/overfitting-in-machine-learning
如果机器学习模型产生了 100% 的训练集准确率和 97.9% 的测试集准确率,这是否意味着模型过拟合了?
嗨 kibreab… 您的场景确实表明了过拟合。以下资源可能会有所帮助
https://machinelearning.org.cn/overfitting-machine-learning-models/
模型如何从测试图像中获得平均精度?测试图像有 ground truths 吗?
嗨 Fattah… 以下资源应该能为您带来一些启发
https://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/raster-and-images/accuracy-assessment-for-image-classification.htm#:~:text=The%20most%20common%20way%20to,data%20in%20a%20confusion%20matrix.
https://www.analyticsvidhya.com/blog/2021/06/evaluate-your-model-metrics-for-image-classification-and-detection/
嗨,Jason。谢谢您的教程。
我是一名 ML 新手,所以不太理解 k-fold 交叉验证中“summarize”在 skill = summarize(skills) 中的含义。我们具体做什么?
嗨 Lee… 非常欢迎!以下资源可能对您有所帮助
https://machinelearning.org.cn/k-fold-cross-validation/
嗨,Jason,
如果我说错了,请纠正我。我目前正在解决一个多类问题(3 个类别)。
1. 我将数据分为训练、验证、测试。
2. 我在我的训练集上使用 10 折交叉验证来选择我的最佳模型。
3. 由于我还没有调整任何超参数,所以我还没有使用我的验证集。
4. 我使用训练数据训练了我的模型,并在测试集上进行了评分,但没有根据测试分数对模型进行任何调整。
问题是,这是一种有效的方法吗?如果是,如果我用于交叉验证的是训练集,那么我的验证集还有什么用?
嗨 Markus… 以下资源提供了关于使用交叉验证进行训练、验证、测试拆分的最佳实践
https://machinelearning.org.cn/training-validation-test-split-and-cross-validation-done-right/
谢谢回复。但是,您能否根据您的知识来解决这个问题?
“如果是,如果我用于交叉验证的是训练集,那么我的验证集还有什么用?”
谢谢!