我们用于对新数据进行预测的机器学习模型称为最终模型。
在应用机器学习中,如何训练最终模型可能会令人困惑。
初学者会提出诸如此类的问题,这表明了这种错误:
- 如何使用交叉验证进行预测?
- 我应该从交叉验证中选择哪个模型?
- 我是否在训练数据集上准备好模型后使用它?
这篇文章将澄清这些困惑。
在这篇文章中,您将了解如何确定您的机器学习模型,以便对新数据进行预测。
让我们开始吧。

如何训练最终的机器学习模型
图片由 Camera Eye Photography 提供,保留部分权利。
什么是最终模型?
最终机器学习模型是您用于对新数据进行预测的模型。
也就是说,给定新的输入数据示例,您希望使用模型来预测预期输出。这可能是一个分类(分配标签)或一个回归(一个实数值)。
例如,照片是狗还是猫的图片,或者明天的销售额估计。
您的机器学习项目的目标是获得一个表现最佳的最终模型,其中“最佳”由以下因素定义:
- 数据:您可用的历史数据。
- 时间:您在项目上花费的时间。
- 程序:数据准备步骤、算法或算法集以及选择的算法配置。
在您的项目中,您收集数据,花费您拥有的时间,并发现数据准备程序、要使用的算法以及如何配置它。
最终模型是这个过程的顶点,是您为了实际开始进行预测而寻求的终点。
训练/测试集的目的
我们为什么使用训练集和测试集?
将数据集拆分为训练集和测试集是快速评估算法在您的问题上性能的一种方法。
训练数据集用于准备模型,即训练模型。
我们假装测试数据集是新数据,其中输出值对算法是隐藏的。我们从训练好的模型中获取测试数据集输入的预测结果,并将其与测试集中隐藏的输出值进行比较。
比较测试数据集上的预测结果和隐藏输出可以让我们计算模型在测试数据集上的性能度量。这是算法在处理未见过数据时,针对问题训练的算法技能的估计。
让我们进一步解释一下
当我们评估一个算法时,我们实际上是在评估程序中的所有步骤,包括训练数据是如何准备的(例如,缩放),算法的选择(例如,kNN),以及所选算法是如何配置的(例如,k=3)。
根据预测结果计算的性能度量是整个程序技能的估计。
我们将性能度量从以下方面进行概括:
- “程序在测试集上的技能”
推广到
- “程序在未见数据上的技能”。
这是一个很大的飞跃,需要满足以下条件:
- 该程序足够稳健,以至于技能估计值与我们在未见数据上实际期望的值接近。
- 性能度量的选择准确地捕捉了我们感兴趣的对未见数据的预测测量。
- 数据准备的选择是众所周知的,可以在新数据上重复,如果预测需要恢复到原始比例或与原始输入值相关联,则可以逆转。
- 算法的选择对其预期用途和操作环境(例如,复杂性或所选编程语言)有意义。
整个程序在测试集上的估计技能承载着很多东西。
事实上,使用训练/测试方法估计程序在未见数据上的技能通常具有很高的方差(除非我们有大量数据可以分割)。这意味着当它重复时,它会给出不同的结果,通常是非常不同的结果。
结果是,我们可能对程序在未见数据上的实际表现以及一个程序与另一个程序相比如何,感到非常不确定。
通常,如果时间允许,我们更喜欢使用 k 折交叉验证。
k 折交叉验证的目的
我们为什么使用 k 折交叉验证?
交叉验证是另一种估计方法在未见数据上技能的方法。就像使用训练-测试分割一样。
交叉验证系统地在数据集的多个子集上创建和评估多个模型。
这反过来又提供了一系列性能度量。
- 我们可以计算这些度量的平均值,以了解该过程的平均表现。
- 我们可以计算这些度量的标准差,以了解该过程的技能在实践中预期会发生多大变化。
当您尝试选择要使用的算法和数据准备程序时,这也有助于提供更细致的比较。
此外,这些信息是无价的,因为您可以使用平均值和传播来给出机器学习程序在实践中预期性能的置信区间。
训练-测试分割和 k 折交叉验证都是重采样方法的例子。
我们为什么使用重采样方法?
应用机器学习的问题在于我们试图模拟未知。
在给定的预测建模问题上,理想的模型是在对新数据进行预测时表现最好的模型。
我们没有新数据,所以我们必须用统计技巧来假装。
训练-测试分割和 k 折交叉验证被称为重采样方法。重采样方法是用于对数据集进行采样并估计未知量的统计程序。
在应用机器学习中,我们感兴趣的是估计机器学习过程在未见数据上的技能。更具体地说,是机器学习过程所做预测的技能。
一旦我们有了估计的技能,我们就完成了重采样方法。
- 如果您正在使用训练-测试分割,这意味着您可以丢弃分割的数据集和训练好的模型。
- 如果您正在使用 k 折交叉验证,这意味着您可以丢弃所有训练好的模型。
它们已经完成了它们的使命,不再需要了。
您现在可以最终确定您的模型了。
如何最终确定模型?
您通过将所选的机器学习程序应用于所有数据来最终确定模型。
就是这样。
有了最终确定的模型,您可以:
- 保存模型以供将来使用或操作使用。
- 对新数据进行预测。
交叉验证模型或训练-测试数据集怎么办?
它们已经被丢弃了。它们不再需要。它们已经完成了它们的使命,帮助您选择一个要最终确定的程序。
常见问题
本节列出了一些您可能遇到的常见问题。
为什么不保留在训练数据集上训练的模型?
和
为什么不保留交叉验证中表现最好的模型?
如果您愿意,可以保留。
通过重用在技能估计期间训练过的模型之一,您可以节省时间和精力。
如果训练一个模型需要几天、几周或几个月,这可能是一个大问题。
您的模型在所有可用数据上进行训练时,可能比仅在用于估计模型性能的子集上进行训练时表现更好。
这就是为什么我们倾向于在所有可用数据上训练最终模型。
在所有数据上训练的模型性能不会不同吗?
我认为这个问题是导致模型最终确定大部分误解的原因。
换句话说:
- 如果你在一个模型上训练所有可用数据,那么你如何知道模型的表现如何?
你已经使用重采样程序回答了这个问题。
如果设计得当,您使用训练-测试或 k 折交叉验证计算的性能指标能够很好地描述在所有可用历史数据上训练的最终模型在一般情况下的表现。
如果您使用了 k 折交叉验证,您将得到一个估计值,说明模型平均会“错误”多少(或反过来说,“正确”多少),以及这种错误或正确的预期范围。
这就是为什么在应用机器学习中,您的测试线束的精心设计如此绝对关键。一个更强大的测试线束将使您能够更依赖于估计的性能。
每次我训练模型时,都会得到不同的性能分数;我应该选择分数最好的模型吗?
机器学习算法是随机的,同一数据上表现不同是意料之中的。
重复训练/测试或重复 k 折交叉验证等重采样方法将有助于掌握该方法的方差有多大。
如果这是一个真正的问题,您可以创建多个最终模型,并从预测集成中取平均值,以减少方差。
我在帖子中更多地谈论了这一点
总结
在这篇文章中,您了解了如何训练最终的机器学习模型以供实际操作使用。
您已经克服了最终确定模型的障碍,例如:
- 理解重采样程序(如训练-测试分割和 k 折交叉验证)的目标。
- 模型最终确定为在所有可用数据上训练新模型。
- 将性能估计与模型最终确定分开考虑。
您对模型最终确定还有其他未解决的问题或疑虑吗?
在评论中提问,我将尽力提供帮助。
嗨,Jason,
感谢这篇非常有启发性的文章。我有一个关于分类问题中训练-测试分割的问题:我们能否对分类问题进行分层训练/测试分割,或者这会引入所谓的数据窥探(对测试误差的偏差估计)?
谢谢
Elie
关键是确保您的模型拟合不使用有关测试数据集的任何信息,包括您正在缩放的最小值/最大值。
嗨,Jason,
您是否有关于如何部署最终机器学习模型的博客?
这篇文章会给你一些想法
https://machinelearning.org.cn/deploy-machine-learning-model-to-production/
你能隐藏本网站所有帖子下方显示的评论,或者至少让它们按需显示吗?这里评论比帖子内容还多。
好建议,谢谢。
如何在 Tenorflow 中保存最终模型并在 Tenorflow.js 中使用它
“此外,这些信息非常宝贵,您可以使用均值和离散度来给出机器学习程序在实践中预期性能的置信区间。”
我必须假设一个正态分布,对吗?但情况总是如此吗?或者我应该在预处理步骤中规范化我的数据,然后假设这是正确的?谢谢
嗨,丹,好问题!
是的,我们假设结果是高斯分布的,以使用均值和标准差报告结果。
重复实验并收集有关结果的最小值、最大值和中心趋势(中位数、百分位数)的信息,无论分布如何,都是报告模型性能的宝贵练习。
很棒的帖子……我的一点经验告诉我:
a) 对于分类,您可以毫无风险地使用您最终训练好的模型。
b) 对于回归,您必须重新运行针对所有数据的模型(使用在训练期间调整的参数)。
c) 特别是对于时间序列回归,您不能使用正常的交叉验证——它应该始终遵循数据的时间顺序(从旧到新),并且您还必须重新运行针对所有数据的模型(使用在训练期间调整的参数),因为最新数据是模型学习的关键数据。
祝好!
感谢 Kleyn 的建议。
嗨 Jason
那么,我的问题是如何预测时间序列数据,不仅是针对测试集,还包括未来的预测?
因为我无法使用保存的模型来预测时间序列数据。
谢谢你
在所有可用数据上拟合一个最终模型,保存它,加载它并用它来做出预测。
如果有新数据可用,您必须决定是重新拟合模型还是按原样使用它。
好棒的帖子!我从您的帖子中学到了很多,并将其应用到我的学术项目中。然而,我仍然有一些问题。在我们的项目中,我们想比较有和没有 10 折交叉验证的不同机器学习算法,包括逻辑回归、SVM、随机森林和 ANN。我们可以通过 10 折交叉验证获得每个模型的交叉验证分数,但问题是如何通过 10 折获得最终模型?交叉验证功能是否用于寻找不同模型的最佳参数?(例如确定 kNN 中的 k?)我对交叉验证的目的仍然有点困惑。谢谢
嗨,汉克,以上直接回答了这个问题。
交叉验证是一个工具,可以帮助您估计模型的技能。我们计算这些估计值,以便我们可以比较模型和配置。
在我们选择了一个模型及其配置后,我们丢弃所有交叉验证模型。我们已经完成了估计。
我们现在可以在所有可用数据上拟合“最终模型”并使用它进行预测。
这有道理吗?
如果还不清楚,请提出更多问题。理解这一点非常重要,我认为我在文章中已经回答了所有这些问题。
嗨,Jason,
非常感谢!这是否意味着交叉验证只是一个工具,可以帮助我们根据交叉验证分数比较不同的模型?
完成评估后,我们将原始模型应用于整个数据集并进行预测。因为我读了一篇论文,作者比较了有和没有交叉验证的这些模型的 AUC、真阳性率、真阴性率、假阳性率和假阴性率。结果表明,使用 10 折的逻辑回归表现最佳。所以我想我们会将带有 10 折的逻辑回归应用于测试数据。我的理解是否不正确?谢谢!
是的,CV 只是一个比较模型配置或比较模型的工具。
嗨,Jason,
仍在努力理解 CV 概念。所以本质上,假设我们有一个数据集,我们想使用一个 xgboost 模型。那么 CV 所做的只是创建 10 种不同的相同数据集的训练-测试分割变体,在 10 个不同的 xgboost 模型上测试它们,给您一个平均性能分数,然后丢弃所有创建的 10 个模型和数据集变体。之后,您就像重新开始一样,在整个数据集上拟合您的模型,而模型对它以前在数据上进行过测试没有任何记忆。我的理解正确吗?
正确。但是我们现在将对模型或建模管道平均表现的预期有一个估计。
嗨 Jason
我一直认为,在 k 折交叉验证期间,其中一个折叠用于调整超参数。因此,在这个折叠上的性能与未见数据上的性能不相等,因为未见数据被用于改进模型。
我建议您在训练集上使用 k 折叠,这样就不会有一个可能无法代表整个数据的验证集。但是,这并不是您模型性能的真实指示,这只是一种获取最佳超参数的方式。
一旦您获得了这些最佳超参数,您将在整个训练数据上重新训练模型(保留的测试集仍安全地锁起来)。然后您报告在这个保留的测试集上的性能。
如果您担心测试集可能无法代表训练集,您可以做以下两件事之一:
1) 比较您的测试集值分布与训练集值分布。
2) 重复上述整个训练和测试过程多次。每次随机选择一个训练集和测试集,并报告这些测试集上的平均性能。
您会同意以上观点吗?
如果你愿意,你可以在 CV 中调整模型,这被称为嵌套 CV,你可以在这里了解更多:
https://machinelearning.org.cn/nested-cross-validation-for-machine-learning-with-python/
嵌套 CV 并不常见,它是一种更高级的技术。典型的方法可能是先评估和比较算法,选择一个,然后调整它。
你可以使用任何你想要的程序——它能让你相信你正在为你的问题选择一个有效的模型。
嗨,Jason,
这意味着,
假设我的数据,我将对多个算法(例如逻辑回归、随机森林、Xgb、SVM 模型等)进行 10 折交叉验证。然后通过比较交叉验证分数,我将选择表现更好的算法。
假设在这种情况下,随机森林在交叉验证评估中表现更好。
然后,我将再次对随机森林进行 10 折交叉验证以调整超参数,然后根据最佳交叉验证分数选择最佳超参数。
最后,我将使用调整后的超参数在整个数据上训练我的随机森林模型,然后将其用于对未见数据进行预测……
这是得出最终模型的正确程序吗?如果我错了,请纠正我……
听起来不错。
嗨,Jason,
感谢这篇非常有启发性和至关重要的文章。
我仍然有一个疑问。
正如 Sandip Khaire 所说,我们也根据交叉验证分数调整了超参数,现在在相同的验证集上报告估计技能或模型性能不会有偏差吗?我理解了最终模型的概念,但对于报告模型性能,我们应该使用哪个数据集。直接报告交叉验证本身的性能是否可以,尽管参数是在其上调整的,或者我们是否需要为此目的保留一个与训练和交叉验证数据分开的未见测试集?
我相信这篇文章解释了正确的程序:https://machinelearning.org.cn/training-validation-test-split-and-cross-validation-done-right/
嗨,Jason,
很棒的文章。
我花了一段时间才明白这一点,但大约 18 个月前我才恍然大悟,这让我感到很解脱。我将交叉验证比作尝试一个你想模仿所有训练数据的过程。不过有一个想法。
当你进行交叉验证时,你可能会说每个参数组合有 10 折 3 次重复。现在,假设你用任何测量准确性的方法,你通常从这 30 个数据中取平均值。是否有必要进行有放回的自助抽样,特别是如果它不是高斯分布,从这 30 个样本中抽取 1000 次,然后从中计算中位数和 2.5/97.5 百分位数?
其他人怎么看!
PK
是的,我喜欢使用自助法 + 经验置信区间来报告最终模型技能。
我有一篇帖子,展示了本月晚些时候如何做到这一点。
太棒了,谢谢。你能再澄清两件事吗?
1) 交叉验证分数与混淆矩阵/MSE 等其他性能指标有什么不同?交叉验证分数基于什么,它实际上是什么——误差?某种独特的指标?
2) 在我昨天偶然发现的您的一篇文章中,您提到在 xgboost 的 CV 期间,如果 k=10,那么原始数据集的 10 种变体会在相同的 xgboost 模型上进行测试。然而,在我之前的评论中,我的理解是 10 种变体在 10 个 xgboost 模型上进行测试,您没有反驳该评论。所以我只是想了解是相同的模型暴露给 10 种数据集变体,还是 10 个不同的模型暴露给 K 折 CV 的每种独特变体。
非常感谢,
您可以在这里了解更多关于交叉验证及其工作原理的信息:
https://machinelearning.org.cn/k-fold-cross-validation/
感谢这篇非常有用的帖子。只有一个问题:当您训练最终模型时,您是在学习一个全新的模型,还是以前学习过的一些或所有模型的价值以某种方式保留了下来?
是的,通常情况下,您正在训练一个全新的模型。所有交叉验证模型都将被丢弃。
谢谢 Jason。非常有用的信息和见解,对采取正确的方法有很大帮助。
很高兴它有帮助,Muralidhar。
非常感谢 Jason。我在这篇文章中找到了许多问题的答案。
Imene,很高兴听到这个消息。
嗨 Jason
感谢这篇内容丰富的文章。我正在从事一个“图像情感识别”项目,我想知道如何创建和训练我的模型。
先谢谢了
Issam,很高兴它有帮助。
非常有启发性,非常感谢,我也正在尝试看看这是否对我想做的一个项目有用,以及它如何在生物识别和模式识别中应用。
谢谢。
感谢您的文章。那参数呢?您可能会在开发集或通过交叉验证进行调优。您找到的最佳参数集是特定分割或折叠的最佳参数集。我们的优化参数成为整个训练数据的最佳参数,难道不是偶然的吗?
嗨,拉斯,
k 折交叉验证通常是使用训练数据集寻找模型“良好”配置的最佳实践。
这有帮助吗?是否更清楚?
感谢这篇帖子
我知道这可能有用,但我不知道我们在使用 KNN 训练阶段做什么
如果你能写出训练阶段的详细步骤
我将不胜感激
KNN 没有训练,只有预测。
请看这篇文章
https://machinelearning.org.cn/tutorial-to-implement-k-nearest-neighbors-in-python-from-scratch/
感谢这篇文章,它清楚地解释了我大部分问题。但是,我仍然有一个问题:如果我在 CV 期间使用了欠采样,我应该如何将其应用于我的全部数据。更清楚地说:
– 我有一个训练集,大约有 100 万个正 (+) 示例和 13 万个负 (-) 示例。我还有一个独立的测试数据集,包含 10 万个正 (+) 示例和 4000 个负 (-) 示例。
– 我已经使用 10 折交叉验证估算了性能,并应用了欠采样(我使用了 R gmlnet 包,使用 LASSO 进行逻辑回归,针对 AUC 进行训练)。它为交叉验证带来了出色的结果。
现在我有点迷茫了。对所有数据进行训练是否意味着从 100 万个正 (+) 示例中随机选择 13 万个,只使用这约 26 万个示例?我是否应该在训练后在我的测试数据集上评估我的模型?
感谢您的帮助!
如果可以的话,我建议您在所有数据上评估模型,看看技能是否有所提高。
事实上,了解数据集大小和模型技能之间的关系以找到收益递减点是一个好主意。
我有一个问题。在使用高斯朴素贝叶斯进行训练时,您能说一下训练模型需要采取哪些步骤吗?
是的,请看这里
https://machinelearning.org.cn/naive-bayes-classifier-scratch-python/
嗨 Jason。感谢这篇精彩的文章!
当您说“您通过将所选的机器学习程序应用于所有数据来最终确定模型”时,这是否意味着在部署模型之前,您应该使用验证阶段的最佳超参数训练一个全新的模型,但现在使用训练数据 + 验证数据 + 测试数据,即包括您以前从未接触过的完全未见测试数据?
我就是这样理解的,而且在我看来这很有道理,因为验证的全部目的在于估计生成模型的方法的性能,而不是模型本身的性能。然而,有些人可能会争辩说,由于您现在正在对以前未见过的数据进行训练,因此无法知道新训练的模型实际表现如何,以及新的、真实世界的结果是否会与验证和测试期间估计的结果一致。
如果我正确地理解了这一点,是否有任何好的技术描述来解释这在理论上为什么有效,或者是否有好的解释来说服人们这是正确的方法?
是的。正确。
是的。之前的结果是对最终模型实际表现的估计。
谢谢 Jason。很高兴得到确认。您知道是否有任何已发表的论文或资料明确阐述了这一点,或深入探讨了其理论基础?
抱歉,手头没有。
感谢 Jason 的解释。我想问一下,当我想要比较我的模型与现有模型的性能时,如何处理测试集。我是否需要留出一个测试集,在剩余数据上训练我的模型,然后使用我的测试集比较所有模型?
之后,我能否将这个保留集合并到我原始的训练集中,并使用所有数据训练一个最终模型?
还有其他解决方案可以使用吗?
是的。根据测试集上的技能选择模型。然后重新拟合所有可用数据上的模型(如果这对于您选择的模型和数据有意义)。
这有道理吗?
是的,有道理,谢谢。
太棒了!
感谢 Jason 的精彩帖子。
我有一个关于 RNN 与 LSTM 预测未见数据的问题。
我使用 RNN 和 LSTM 结合帖子 (https://machinelearning.org.cn/time-series-prediction-lstm-recurrent-neural-networks-python-keras) 构建了完整的模型。
我们如何从完整模型中预测未见数据(例如当前数据之前的数据)?
我的意思是,除了时间之外,我们没有任何基础数据。
我之前看过您回复的评论,您说“您可以通过调用 Y = model.predict(X) 来预测新数据”,但我还是不明白... :'(
我是说实时。:-)
提前感谢。
祝好,
保罗
在实时情况下,同样适用,但您可以决定是重新训练新模型,更新模型,还是什么都不做,只进行预测。
您可以通过在所有当前数据上训练模型,然后使用从训练数据末尾获取的任何模型输入来调用预测,从而预测可用数据之外的下一步。
这有帮助吗?
哪一部分令人困惑?
你好,Jason。
非常感谢这篇精彩而富有启发性的文章。我有 2 个问题,如果您能帮助我,我将不胜感激。
1- 是否可以在不完全重新训练模型的情况下刷新(更新)模型?为了更详细地说明,我有一个使用 9 周数据(每周快照)构建的模型。由于数据集非常大,当我每周更新模型时,需要大量时间。是否可以在不重新训练整个 10 周数据(9 个旧快照 + 1 个新快照)的情况下,用新快照(例如第 10 周)更新模型?
2- 当我训练模型并使用交叉验证对其进行评估时,我得到的错误(或者,我得到的 AUC)始终优于我在评分服务数据并测试模型实际性能时得到的结果。为什么会这样,我该如何处理?为了更详细地说明,以第一个问题中解释的 9 个快照为例,我使用 snapshot_date 列作为交叉验证折叠列。因此,在每一轮中,算法使用 8 周的数据进行训练,并在剩余的未见周上测试模型。因此,我最终会得到 9 个不同的模型和验证框架上的 9 个不同的 AUC。所有 AUC 都在 0.83 到 0.91 之间。所以我预计使用整个数据构建的模型的实际性能至少为 AUC 0.83。然而,当我对服务数据进行评分,并在下周评估模型的性能时,我看到的结果不比 AUC 0.78 好。我已经经历过 3 周(3 次),所以我不认为这只是随机变化。此外,我非常确定没有数据泄露,我的数据中没有未来变量。而且,我很好地调整了模型,没有过度拟合。
您的帮助将不胜感激。
您可以更新模型。更新量取决于您的数据和领域。我在我的 LSTM 书中对此有几篇文章和更多内容。
对测试数据进行模型评估通常是有偏差和乐观的。您可能希望进一步完善您的测试框架,以减少针对特定数据集报告分数时的偏差(例如,更少的折叠,更多的折叠,更多的数据等,取决于您的数据集)。
你好 Jason,这篇文章非常有趣!你得到了什么?
我完成了我的模型(得分 91%),但我如何使用新数据集评估这个模型呢?
我已将模型保存为 model.pkl,但在我的新数据中(例如 iris.csv),如何预测“species”字段?(在我的数据集中,我需要将此字段留空吗?)此步骤如何操作?
谢谢你的帮助,因为我很困惑。
加载模型并调用 model.predict(X),其中 X 是您的新输入数据。
嗨 Jason – 精彩的帖子。这为我最终确定模型理清了思路。
fitControl <- trainControl(
方法 = "repeatedcv",
次数 = 10,
保存预测 = '最终',
verboseIter = T,
summaryFunction = twoClassSummary,
classProbs = T)
glm_fit <- caret::train(dv ~. , data = dataset
,方法 = "glm", family=binomial, trControl = fitControl, metric = "ROC")
它说 glm_fit 现在成为最终模型,因为它根据 trControl 运行 10 折,最后使用整个数据训练模型。设置 verboseIter = T,在运行结束时给我一个总结消息——“在完整的训练集上拟合最终模型”。那么我可以用这个作为最终模型吗?
也许可以。
你好,
这篇文章很有道理,但有一点我感到惊讶的是没有提到过拟合问题。如果在最终模型生成中没有使用测试/验证数据,并且如果所使用的模型在测试中已经被发现过拟合数据,那么我们需要知道何时停止训练而不过拟合。一个简单的方法是根据之前测试中的“正确”训练时间进行猜测,但当然,包含所有数据的最终模型自然需要更长的训练时间。我们是否可以使用统计方法来确定在不使用验证集的情况下停止训练的最佳时间?
过拟合问题在模型最终确定之前,作为模型选择的一部分,就已经解决了。
如果我在 k 折交叉验证期间使用了早期停止,那么对 epoch 数量取平均值并将其应用于最终模型是否正确?由于最终模型中没有用于早期停止的验证集,所以我想到使用平均 epoch 数量来训练最终模型。请帮我一下 🙂
是的,你可以试试那个。
嗨 Jason!非常感谢这篇内容丰富的文章。
不过有个小问题。如果我们没有条件获取另一个数据集(例如,因为这只是一个小型大学项目),那么您如何应用 k 折交叉验证(或测试-训练分割)来评估模型呢?
我的理解是,一旦您应用了,比如说,k 折交叉验证来选择要使用的模型,然后调整参数以适应您的需求,您将在另一个不同的数据集上运行您的模型,希望您构建和调整的模型能给出您预期的结果。
您可以在使用交叉验证之前分割您的原始数据集。
嗨,Jason,
很高兴能看到你的教程,这些都是用 Keras 进行深度学习的最佳教程之一。
我读过那些问你关于使用 k 折交叉验证训练最终深度模型的问题的笔记,但我作为一个深度学习模型的新手,有些东西我无法理解。
我想训练(或最终确定)CNN、LSTM 和 RNN 来处理文本数据集(这是一个情感分析)。事实上,我的老师告诉我应用 k 折交叉验证来训练=最终确定模型,以便能够预测未见数据属于每个类别(二元分类)的概率。
我的问题是:[ 使用 k 折交叉验证来训练最终深度模型是否错误?]
正如我所写,每个折叠运行 15 个 epoch。这有什么问题吗?
很抱歉我提出了一个天真的问题,因为我不是英语母语者,无法完美理解您上面写的所有评论。
我写的代码是这样的:
[
from sklearn.model_selection import KFold
kf = KFold(10)
f1_lstm_kfld=[]
oos_y_lstm = []
oos_pred_lstm = []
折叠 = 0
for train, test in kf.split(x_train)
折叠 += 1
print(“折叠 #{}”.format(折叠))
print(‘训练’, 训练)
print(‘测试’, 测试)
x_train1 = x_train[train]
y_train1 = y_train[train]
x_test1 = x_train[test]
y_test1 = y_train[test]
print(x_train1.shape, y_train1.shape, x_test1.shape, y_test1.shape)
print(‘构建模型…’)
model_lstm = Sequential()
model_lstm.add(Embedding(vocab_dic_size, 128))
model_lstm.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model_lstm.add(Dense(1, activation=’sigmoid’))
model_lstm.compile(loss=’binary_crossentropy’,
optimizer='adam',
metrics=['accuracy'])
print(‘训练…’)
model_lstm.fit(x_train1, y_train1,
batch_size=32,
epochs=15,
validation_data=(x_test1, y_test1))
score_lstm, acc_lstm = model_lstm.evaluate(x_test1, y_test1,
batch_size=32)
sum_f1_lstm_kfld=0
for i in f1_lstm_kfld
sum_f1_lstm_kfld =sum_f1_lstm_kfld+i
print (‘sum_f1_lstm_kfld’,sum_f1_lstm_kfld)
mean_f1_lstm_kfld=(sum_f1_lstm_kfld)/10
print (‘mean_f1_lstm_kfld’, mean_f1_lstm_kfld)
请指导我,因为我感到困惑。
提前感谢您。
罗斯
您不能通过交叉验证训练最终模型。
我建议您重新阅读以上帖子,了解原因。
嗨,Jason,
恐怕我又要问这个问题了,但当我重新阅读上面的帖子时,我看到了这句话:像重复训练/测试或重复 k 折交叉验证这样的重采样方法将有助于了解该方法中存在多少方差。如果这是一个真正的问题,您可以创建多个最终模型,并从预测集成中取平均值,以减少方差。
你说的“创建多个最终模型”是什么意思?是指通过应用 k 折交叉验证来获得多个模型吗?
还有关于这句:“从预测集成中取平均值”,你的意思是我们可以将“取平均值”用于最终模型吗?
我想训练一个模型 = 最终确定模型。
您提到:“为什么不保留交叉验证中最好的模型呢?”
如果你喜欢,可以。通过重用在技能估计期间训练过的模型之一,你可以节省时间和精力。你的模型在所有可用数据上训练时,可能会比仅在用于估计模型性能的子集上训练时表现更好。
你说的上面三句话是什么意思,特别是这句:“在所有可用数据上训练时,比仅在用于估计模型性能的子集上训练时表现更好?”
你说的“在所有可用数据上训练”是指我们不使用 k 折交叉验证的程序吗?你说的“仅在用于估计模型性能的子集上训练”是指应用 k 折交叉验证吗?
如果我想清楚地问我的问题,我应该这样说:[我想训练一个 CNN、LSTM 和 RNN 深度模型来定义一个深度模型,以便估计未见数据的概率,我该怎么做?是应用将数据集分成训练集和测试集,还是任何其他程序?]
任何指导都将不胜感激。
我的意思是,如果模型预测中存在很大的方差(例如,由于模型本身的随机性),您可以在所有训练数据上训练多个最终模型,并将它们用于集成。
有时训练一个模型可能需要几天甚至几周。您可能不想重新训练模型,因此,可以重用您估计模型技能时的一个模型。
这有帮助吗?
你能提供一个预测的示例代码吗?
我的博客上有很多不同平台的例子。
尝试搜索一下,如果您没有找到您要找的东西,请告诉我。
您是否有一个使用所有数据进行训练然后预测未知未来数据的代码示例?
是的,您可以在这里了解如何对新数据进行预测:
https://machinelearning.org.cn/faq/single-faq/how-do-i-make-predictions
感谢 Jason 的这篇文章,还有两个额外的问题:
1) 是否有经过同行评审的文章可以引用来证明这种方法的有效性?
2) 我是否正确理解,如果为训练数据推导出的关系中的不确定性正确传播到测试数据集,则可以仅根据交叉验证统计数据选择“最佳”模型?也就是说,训练关系的拟合优度度量并不真正重要?
谢谢!
关于模型最终确定?可能有,抱歉我不知道。这可能是一种默会知识。
是的,使用配置良好的 k 折交叉验证估计的技能可能就足够了,但如果分数被审查得太频繁(例如,为了调整超参数),您仍然可能过拟合。
这篇文章对我的最终项目非常有帮助,让我更好地理解了。
我有一个问题,在完成训练/测试分割之后,下一步是使用所有可用数据集进行训练。我是否必须使用所有数据集进行数据训练,无需再次分割?并且使用之前通过训练/测试分割或交叉验证获得的最佳超参数或配置?
非常感谢
很高兴听到这个消息。
正确,您将使用所有可用数据以及通过在训练/测试/验证集上进行测试选择的超参数。
感谢 Jason 的精彩帖子。不过我有一个问题……
在训练过程中,我对数据进行预处理,例如缩放、特征工程等。然后我使用训练/验证/测试集训练模型。现在我有了最终模型,我想将其用于预测。
现在我的预测系统不同(使用 Java 和 TF 编写),我在那里导入训练好的模型——顺便说一句,我所有的训练代码都是用 Keras 和 Python 编写的。但在我的预测系统中,我一次获得一个数据点,我必须进行预测。
我的问题是如何在预测过程中进行数据预处理?像缩放和特征提取这样的预处理在一个数据点上没有意义。在我的用例中,如果我累积所有收到的数据(以前未见过的),进行与训练中类似的预处理,一旦我积累了相当数量的数据,然后将其提交给训练好的模型进行评分,预测看起来不错。否则,我将得到非常不同且不准确的结果。
很乐意听取一些关于如何解决这个问题的建议。
很好的问题!
必须使用用于准备训练数据的相同方法来准备单个数据点。
具体来说,缩放系数(最小值/最大值或平均值/标准差)是在训练数据集上计算的,用于缩放训练数据集,然后用于缩放您正在预测的任何点。
这有帮助吗?
嗨 Jason,感谢您精彩的教程。
正如我所见,您强调在整个数据集上训练神经网络,而不将整个数据集的子集作为测试数据集,以便训练和最终确定数据集。
我已经在整个数据集上训练了 cnn_model(我的意思是,我没有为测试集分离一些样本),但我通过以下语句将 20% 的整个数据集分离为验证集:
‘model_cnn.fit(x_datasetpad, y_datasetpad, validation_split=0.2, epochs=5, batch_size=32)’
我想我在拟合网络过程中设置 ((validation_split=0.2)) 犯了一个错误。
我是否应该删除验证集来最终确定 CNN 网络?
我应该在整个数据集上训练网络吗?{我的意思是,我应该删除 validation_split=0.2 吗?}
是的,对于最终模型,移除验证分割。
嗨,Jason,
非常感谢您的快速回复。
不客气。
如何在 Tenorflow 中保存最终模型并在 Tenorflow.js 中使用它
抱歉,我没有 TensorFlow 或 TensorFlow.js 的示例。
我阅读了帖子,所有问题和答案。所以最后想总结一下并得到您的批准 🙂
例如:我有 10 万个训练数据值,测试数据:5 万个值。
1. 我们尝试各种模型,如线性回归、决策树、随机森林、神经网络,在 15 万个值上进行 K 折验证,并查看哪个模型能提供更好的性能指标(平均误差等...)。现在我们决定了哪种算法/过程最适合数据。
例如:决策树。
2. 现在,让我们在决策树上使用 15 万个值和不同的超参数值运行 K 折验证,并检查哪个值能提供更好的性能指标。
3. 我们知道什么模型和什么超参数“通常”适用于数据。
4. 让我们使用所有 15 万个值的数据,并使用我们之前选择(效果最好)的超参数训练最终决策树(FDT)。
由于模型和超参数之前已经检查过,因此上述文章认为它们将并且应该在未见过的数据上表现最佳。
我的想法:我最后可能会采取更安全的做法,即进行双重检查,这意味着我不会使用所有数据进行训练,而是保留 5% 用于测试(未见过的数据)和 95% 用于训练。
感谢这篇精彩的文章。我认为这可能会帮助那些担心在模型/机器学习过程选择后进行超参数调优的人。
一切都很好,但最终检查是多余的,可能会产生误导。如果 5% 的数据表现不佳,你会怎么做,为什么?
我曾想保留 5% 作为双重检查,但在你提出问题后,我开始思考如果表现不佳怎么办——我有两点要说。
1. 这 5% 是一个不能代表数据的样本。也就是说,它是偶然发生的。所以,我应该有其他方法来测试数据的代表性。
2. 模型不够好或过拟合——即使这次我也无法得出结论,因为 5% 的样本可能无法代表数据。
最终明白,交叉折叠验证是解决上述两点的方法,我们之前已经在整个数据上完成了这一点,所以“最终检查是多余的”。
非常感谢 Jason Brownlee。
推理很棒!
保持开放的心态,并根据你的具体问题调整方法。没有“规则”,这是一门经验学科。
谢谢。明白了。
这个很好。现在我真的明白了。感谢 Jason 和 Vaddi 如此清晰的解释。
不客气。
在 Vaddi Ajay Kumar 的步骤 1 和步骤 2 中,使用交叉验证,不同的算法(步骤 1)和不同的超参数(步骤 2)使用不同的数据。问题是:
1. 为什么不直接使用训练/测试分割方法?至少确保使用相同的训练数据和测试数据。交叉验证与训练/测试方法相比有什么优势?
2. 我知道 K 不宜太小或太大。有些书推荐 10 折(未提及最佳值是多少),那么如果根据先验,可选超参数只有 5 个值,在 10 折交叉验证中如何选择训练/测试(给定每个部分名为 0,1,2…9)?如果不对,那么如果根据先验,可选超参数只有 5 个值,如何选择 K?如果超参数有 20 个值呢?
K 折交叉验证中的 K 与超参数无关。
交叉验证或重复交叉验证比单次训练/测试分割能提供更少偏差的模型技能估计。许多人在不同大小的数据集上测试后发现,K=10 是一个很好的权衡(不那么乐观)。
@Vaddi Ajay Kumar,既然你总是使用 150k(两者之和)进行计算,为什么还要将数据分割成训练集和测试集?你用测试集做什么?谢谢。
谢谢 Jason。我正在尝试预测员工是否会离职或留在公司。我有 1,500 条离职员工记录和 500 条仍在职员工记录。我需要为所有 500 名仍在职的员工获取概率。
问题在于模型在训练时实际上看到了所有数据,以便获取整个数据集的概率。我没有“新”数据可以应用训练好的模型,因为我们知道所有仍在职的员工。如何在不发生过拟合的情况下获取 500 名仍在职员工的概率?是不是只要让预测变量更通用就可以了?提前感谢你的建议。
你可以用你的一部分数据训练模型,并用其余数据评估它。
一旦你找到一个有效的模型,你就可以用所有数据训练它,并用它来预测新数据。
我假设你拥有那些留下或离开员工的历史记录,你用这些记录进行训练。然后你现在有一些人,你想知道他们是否会留下或离开,这是你需要生成预测的新数据。
我也有个问题。我正在尝试使用历史数据预测货币汇率。我正在尝试使用昨天的汇率预测明天的汇率……我有点困惑。我应该使用什么人工神经网络?我喜欢使用 K 折交叉验证进行抽样……我想知道你的想法。
别浪费时间了
https://machinelearning.org.cn/faq/single-faq/can-you-help-me-with-machine-learning-for-finance-or-the-stock-market
嗨,Jason,
这是一篇很棒的文章。解开了许多疑惑。
我以前认为 k 折叠的折叠数是寻找最佳模型的另一个超参数。例如,我们使用 k=[3,5,7,9] 测试两个模型。但在阅读你的文章后,我猜这完全没有必要,因为 k 折叠验证无论如何都不会选择最终模型。
那么,我是否只需选择一个单一的 k 值,例如 k=10,然后继续运行?
谢谢
Luv
是的。
更多细节在此
https://machinelearning.org.cn/k-fold-cross-validation/
嗨,Jason,
通过您的教程,我学到了更多知识。
我想写一篇论文,所以我必须引用一个有效资源来支持您下面提到的观点:
“您通过将所选的机器学习程序应用于所有数据来确定最终模型。”
您在哪篇论文或资源中看到过,我们应该使用整个数据集来训练模型以完成它?
请给我论文或书籍作为参考。
等待回复。
祝好
Sarah
这是不言而喻的知识,没有写在论文里。
你好 Jason,
如何使用新数据重新训练已经用其他数据训练过的模型?
谢谢,
KALYAN。
我这里有一个例子
https://machinelearning.org.cn/update-lstm-networks-training-time-series-forecasting/
嗨,Jason,
很棒的帖子!谢谢!
这里有一个小问题。
如果我有一个训练数据集,实例数为 n=500。
然后我使用 10 折交叉验证和特征选择,基于这 n=500 个训练数据集来识别一个最优的机器学习算法。
我可以使用多少个独立测试数据集实例来评估/测试该机器学习算法在未见过的数据集上的性能呢?
谢谢,
Albert Tu
这真的取决于问题。
也许可以尝试不同大小的数据集,并评估其评估的稳定性?
你好 Jason,
非常感谢您深入而清晰的解释。
我有一个关于两种建模设置的问题
设置一
– 将整个数据分成训练集(80%)和测试集(20%)
– 在训练集上进行 10 折交叉验证以找到最佳参数配置
– 使用确定的参数配置在训练集上训练模型
– 在测试集(“保留”,未触及的数据)上最终评估模型
设置二
– 将整个数据分成训练集(80%)和测试集(20%)
– 在整个数据集上进行 10 折交叉验证以找到最佳参数配置
– 使用确定的参数配置在训练集上训练模型
– 在测试集(“保留”,未触及的数据)上最终评估模型
设置一和设置二之间唯一的区别是,在设置一中我在训练集上进行交叉验证,而在设置二中我在整个数据集上进行。
您认为哪种设置更好,或者您认为两种方法都有效?
提前感谢!
来自德国的问候
Jonathan
没有哪个更好之说。采用一种能让你对实验结果充满信心,足以做出决策的方法。
我想知道如何使用交叉验证来衡量模型技能的性能。既然我们有 k 个不同的模型,我们如何衡量性能?我们能得到所有模型性能的聚合分数吗?请解释一下……具体来说,我使用 h2o 来训练我的模型。
对每个模型的性能取平均值。
更多信息在这里
https://machinelearning.org.cn/k-fold-cross-validation/
感谢您的这篇非常有益的文章。
不客气,史蒂夫。我很高兴它有所帮助。
为什么您在几乎所有示例中都将测试数据用作验证数据?难道我们不应该有不同的测试和验证数据吗?
验证通常是训练数据的一个子集,详情请看这里。
https://machinelearning.org.cn/difference-test-validation-datasets/
我尽量让我的例子简单,并且经常重复使用测试数据作为验证数据。
在各种数据集(例如 Kaggle 上的股票数据、车祸、犯罪数据等)上训练分类器,是否有助于增强其能力?这样做的时候,我们可能会调整底层算法或数学结构来处理不同的问题,例如过拟合、准确率低等。
这种方法可以用来学习一类问题的通用特征。例如,像无监督预训练或自编码器。
我认为这种方法是应用机器学习的未来。我有一篇关于在时间序列预测中使用 LSTM 自编码器进行这种方法的文章,已安排发表。非常令人兴奋。
嗨,Jason,
非常非常棒的文章。已为我的下一个项目存档。感谢分享如此有用的文章。
很高兴它有帮助。
非常感谢您的精彩文章。
我理解我们应该使用所有数据来训练我们的最终模型。然而,当我使用包含训练+验证+测试的数据集训练最终模型时,我应该何时停止训练呢?特别是对于深度学习模型。让我用一个例子来解释。
我有一个 CNN 模型,有 100,000 个示例。我将执行以下过程:
1. 我将此数据集分成训练数据 80,000,验证数据 10,000 和测试数据 10,000。
2. 我使用验证数据集来指导我的训练和超参数调优。在这里我使用早期停止来防止过拟合。
3. 然后我获得了最佳性能和超参数。从早期停止设置中,我发现在训练模型 37 个 epoch 时,损失较低,并且使用测试数据进行评估的性能良好。
4. 我将确定我的模型,用我的全部 100,000 个数据训练我的最终模型。
这里有一个问题。如果没有验证数据集,我怎么知道何时应该停止训练,也就是在我训练最终模型时应该选择多少个 epoch?我是否会使用与最终确定模型之前相同的 epoch?还是我应该匹配我之前获得的损失?
我认为对于没有早期停止训练的机器学习模型,这些都不是问题。但像深度学习模型,何时停止训练是一个关键问题。有什么建议吗?谢谢。
好问题。这确实是一个设计决策。
你可以尝试在所有数据上重新训练,不使用早期停止,或许可以通过对所需 epoch 数量进行敏感性分析。
你可以牺牲一个新的验证集,并在训练-测试集上重新训练一个新的最终模型。
没有唯一的答案,找到一个最适合你项目的方法,以及你对模型性能和方差的了解。
谢谢你,Jason。
你有没有看过 Quora 上的这篇文章?
https://www.quora.com/Should-we-train-neural-networks-on-the-training-set-combined-with-the-validation-set-after-tuning
还有这一篇
https://stackoverflow.com/questions/39459203/combine-training-data-and-validation-data-how-to-select-hyper-parameters
你有什么看法?谢谢。
归根结底,这是一个设计决策,你必须根据你的具体问题做出决定。
你说的没错!再次感谢你。
嗨,Jason Brownlee,
我正在阅读您的教程并编写代码以理解其中的细节。我这样做有两个原因:了解应用机器学习和 scikit-learn 的工作原理。我一年半前上过一堂广泛的机器学习课程,重新翻阅我的笔记,我觉得我理解大多数算法(我需要稍微锻炼一下统计和概率)。我的微积分和线性代数还不错。我目前是一名学生数据科学家。我的 pandas 和 numpy 知识可能和初学者一样,我相信我会在需要时很好地使用它们。在这种情况下,您会推荐我如何继续进行数据科学学习?我有一个粗略的路线,但我很想听听您的评论。
通过小项目逐步提高你的技能。
嗨,Jason,感谢您在这里分享丰富的资讯!真是太棒的资源了!我遇到的一个问题是如何在最终的随机森林模型中选择最重要的变量。我运行了 5 折交叉验证,并能够从 5 个模型中的每个模型中获取特征重要性值。那么,是否可以取每个特征的 5 个重要性值的平均值,并使用该平均值来确定前 N 个特征?如果我随后使用这些前 N 个特征训练模型,并对该模型进行另一次 5 折交叉验证,这是否会引入泄漏和过拟合的风险?是否最好只使用初始交叉验证中一个模型的特征重要性来获取前 N 个特征?感谢您的任何意见!
一般来说,随机森林会在构建模型时为你执行特征选择,我不认为在使用随机森林建模之前,使用特征重要性来选择特征会带来提升。
嗨 Taylor,我知道现在已经很晚了。但我认为在你的情况下,假设你不使用 RF(例如 SVM),我认为你确定前 N 个特征的方法会引入泄漏。你不应该再次进行交叉验证。
我这里的问题是,不再次进行交叉验证,我们是否可以直接将那些前 N 个特征作为特征选择方法,跳过交叉验证,直接进入测试阶段?这有效吗?
感谢 Jason 博士提供如此棒的网站,我阅读了您很多文章,学到了很多。
关于这篇文章,您说:“为什么不保留交叉验证中最好的模型呢?”
如果您喜欢,当然可以。
我的问题是
1- 在 python 中,我如何保存一个或交叉验证返回的最佳模型?据我所知,scikit-learn 包中的 cross_validation.cross_val_score 函数不返回训练好的模型,它只返回分数。python 中是否有其他包或函数返回 10 个训练好的模型,我可以保存其中一个?
2- R 呢,交叉验证会返回模型,我可以保存其中任何一个吗?如果可以,如何操作?
我阅读了您关于交叉验证的文章,也阅读了书籍并进行了搜索,但还没有找到答案。
我找到的一些关于这个问题的链接:
https://stackoverflow.com/questions/32700797/saving-a-cross-validation-trained-model-in-scikit
https://stats.stackexchange.com/questions/52274/how-to-choose-a-predictive-model-after-k-fold-cross-validation
感谢您的帮助
你可以手动遍历折叠并保存模型,例如:
https://machinelearning.org.cn/k-fold-cross-validation/
嗨,Jason,
你能解释一下嵌套交叉验证在这里是如何发挥作用的吗?以及超参数调优在这个过程中是在哪个阶段进行的?
谢谢!
所有用于交叉验证评估的模型都被丢弃。
它们发生在拟合最终模型之前。
嗨,Jason,
这是我在网上找到的最好的帖子,非常感谢。
不过,我也有同样的问题。为什么有些人使用嵌套(双重)交叉验证呢?
非常感谢您提供的信息丰富的帖子!
谢谢。
交叉验证和嵌套交叉验证都用于寻找模型和配置集。
之后,你可以根据选择的模型和配置拟合最终模型。
嗨,Jason,
好帖子。到目前为止,我一直在使用训练/验证/测试拆分,并使用验证集选择超参数并避免过拟合,最后在测试集上评估模型。根据这篇帖子,我猜我也可以这样做,并在所有数据上训练最终模型,或者至少在训练集和验证集上一起训练?因为我浪费了大量未用于训练的数据。
在 K 折交叉验证中,您提到在确定模型之前解决了过拟合问题。您能详细说明一下吗?因为没有验证集来停止训练。我假设您仍然使用验证集来停止每个折叠的训练。
您是否有帖子同时使用了 K 折交叉验证和训练/验证/测试拆分,并比较结果并得出最终模型?如果没有,那将非常有趣。
是的。使用相同的参数在所有数据上重新拟合。
我不确定你指的是什么。交叉验证仅用于估计模型性能。如果你使用早期停止,即使是最终模型也必须使用验证数据集。
很好的建议,谢谢。
亲爱的 Jason,
首先,谢谢你的帮助!
我想知道你是否可以提供一些关于你在这篇文章中解释的参考文献。
那就太好了!
再见
这太实用了,无法写成论文,如果你是这个意思的话。学者们不讨论用于操作的最终模型。
你好 Jason,
感谢您的精彩博客,非常有帮助。
我有一个关于这部分的问题:“如果你用所有可用数据训练模型,那么你如何知道模型会表现得如何?你已经使用重采样程序回答了这个问题。”
1. 那么,用所有可用数据集训练模型,然后只使用 K 折等重采样方法来查看模型的准确性,这是一个正确的程序吗?
2. 如果我们仍然将数据集分成训练集/测试集,测试模型的准确性,然后另一方面,也在训练集上使用 K 折。K 折的平均准确性与模型准确性之间是否存在很大的差异?
谢谢!
是的。
可能会有,这取决于模型和数据。也许可以测试一下你的模型对数据集大小变化的敏感度。
嗨,Jason,
我仍然对 k 折交叉验证感到困惑。假设我有一个数据集 D。当我进行 k 折交叉验证时,我应该先将 D 分成训练数据集和测试数据集,然后再将训练数据集分成 k 折吗?还是直接将整个数据集 D 分成 k 折?
另一个问题是,当使用 k 折交叉验证时,如何报告最终的混淆矩阵?因为我会得到 k 个混淆矩阵。
你可以在这里了解更多关于 k 折交叉验证的工作原理。
https://machinelearning.org.cn/k-fold-cross-validation/
混淆矩阵只能针对单个测试集计算,不能用于交叉验证。
嗨,Jason,
感谢您的精彩帖子。
我需要澄清以下代码。
ensemble = VotingClassifier(estimators=[
(model1), (model2), (model3)], voting=’hard’)
ensemble = ensemble.fit(X_train, Y_train)
predictions=ensemble.predict(X_validation)
正如您在这篇文章中所说,我是否必须丢弃使用 10 折交叉验证创建的 X_train 和 Y_train 子集,以便拟合集成模型进行预测,或者这段代码是正确的。我需要使用整个数据集来拟合集成模型进行预测吗?
请帮帮我。
该代码似乎定义了一个使用 3 个模型的投票集成。
通常,使用不同的数据集来拟合集成模型与子模型是一个好主意。
一种方法涉及在交叉验证期间使用样本外数据。
很棒的帖子。它回答了我所有在其他网站上找不到的问题。继续加油!
谢谢,很高兴它能帮到你!
嘿 Jason,文章写得很好!你有没有可能知道更多关于这个主题的研究?有没有专门针对时间序列数据的文献?
不,这是一种工程考虑。例如,如何使用模型。
嗨,Jason,
很棒的帖子。我对机器学习和 Python 相当陌生,仍在学习中。我构建了一些机器学习模型,但是一旦我重新训练模型,我如何部署它呢?
例如,我不确定如何保存模型,如何使用整个训练集重新训练机器学习模型,以及如何通过代码将其部署到新的/未来的测试数据上。非常感谢。
如果你正在使用 scikit-learn,这可能会有所帮助
https://machinelearning.org.cn/save-load-machine-learning-models-python-scikit-learn/
Jason,
是的,这有部分帮助。我真正卡住的部分是,一旦我训练/测试了我的模型,交叉验证并决定使用哪个模型。
我如何回去并实质上用整个数据(训练数据集,而不是仅仅是训练/测试数据的切片)重新训练我的模型?
将所有数据收集到一个数据集中并调用 model.fit()。
也许我不明白你遇到的困难?
感谢您的精彩教程,我有一个问题,我有一些带标签的图片,我通过向图片添加高斯白噪声制作了 3 份副本,并通过制作未对齐的图片制作了 3 份副本,初始数据集以我们的图像为中心,然后我将它们打乱并分成测试和训练集,准确率约为 1,我的问题是,高准确率是否可能是由于训练集和测试集中的重叠造成的?我应该进行任何改进吗?还是可以?
你不能在训练集和测试集中包含同一图像的副本,这会是无效的模型评估。
数据增强只用于训练集。
嗨,Jason,
最近我一直在阅读你的优秀帖子,因为我是一个新的机器学习学习者。这些帖子足够清晰,能够传达有用的信息。最近几天,我对交叉验证的工作原理感到困惑和挣扎。
我有 500 个数据集(可能有点少),下面是我使用机器学习算法的步骤。如果有什么不对的地方,请纠正我。这是一个二元分类问题。
1. 收集数据形成 500 个数据集
2. 将 500 个数据集分成训练集(80 %,400)和测试集(20 %,100)
3. 使用 10 折交叉验证在全部 500 个数据集上检查 9 种机器学习算法(逻辑回归、支持向量机、决策树、随机森林和 AdaBoost)。我发现 AdaBoost 在步骤 3 中具有最高的预测准确度。这意味着 AdaBoost 在应用于我的问题时具有更强的泛化能力。
4. 然后我使用 GridSearchCV 在训练集(80 %,400)数据集上找到 AdaBoost 的最佳超参数。使用测试集(20 %,100)数据集测试具有最佳超参数的 AdaBoost 模型。我可以获得准确度分数、混淆矩阵、AUC-ROC、TPR、FPR、ROC 曲线、PR 曲线。
我的问题
(1) 对于步骤 3,是全部 500 个数据集还是训练集(80 %,400)数据集?
(2) 对于步骤 4,我需要使用全部 500 个数据集来确定模型吗?这是用于学术问题,而不是工业问题。
看起来不错。
步骤 3 只会使用训练集,步骤 4 会使用测试/验证集。最终模型是在所有数据上确定的。
这里有更多关于训练/测试/验证数据集的信息:
https://machinelearning.org.cn/difference-test-validation-datasets/
亲爱的Jason
请求您的意见。
假设我们使用 1000 个特征构建了一个初始模型。变量重要性列表的输出只列出了这 1000 个特征中的 800 个。
据我理解,在构建最终模型时,我们将使用与之前相同的参数(例如最优 nrounds 等),但使用完整数据。我还使用与构建初始模型时相同的随机种子。
但是关于特征,在构建最终模型时,我们应该提供 1000 个特征还是 800 个特征(如上面获得的)?
谢谢
您将使用与实验期间相同的问题框架(输入和输出)。
你好。有一个公开可用的数据集,其中预先确定了训练集(175,341)和测试集(82,332)的划分。该模型的性能在这种实验方法中始终良好,我获得了 98% 的准确率。然而,为了对模型进行可靠评估,我将训练集+测试集(257,673)组合起来,然后进行 80:20 的交叉验证划分,并通过堆叠分类器进行分类,结果准确率为 86%。我能否推断,尽管准确率较低,但这种方法比第一种方法能产生更可靠的预测?请澄清。
通常,最好通过多次训练/测试分割来估计模型的性能,理想情况下是 K 折交叉验证。
谢谢 Jason,关于如何获取最终模型的信息非常有用。
我正在做一个客户流失预测模型。我已经完成了最终模型。唯一有点困惑的是,当我使用我的模型预测新数据时,我如何知道预测可能发生的时间段?如果我使用一年的累积数据来训练模型,并使用 6 个月的新数据进行预测。我是否应该期望我的预测在接下来的 6 个月内发生?
注意:我所有的预测变量都是每月平均值。
提前感谢,
*those 而不是 does
不确定我是否理解,抱歉。你能详细说明一下吗?
例如,在我的客户流失项目中,如果我试图预测可能取消的客户。假设模型输出了 100 个可能取消的客户。我大约什么时候可以预期这些客户会离开公司?有可能知道吗?
感谢您的关注
这可能是一个时间序列分类任务。
也可能是一个生存分析。
https://en.wikipedia.org/wiki/Survival_analysis
谢谢 Jason,我真的很感激!
你好 Jason,
我浏览了所有关于这篇文章的 150 多条评论。根据这些评论,我很容易理解交叉验证是一个非常重要的主题。
据我理解,交叉验证是为了将所有独立变量相互关联,以检查它们对模型构建的重要性,希望我没错。但这反过来也涉及一点多重共线性。不是吗???
请您澄清一下。
谢谢。
此致
Sandipan Sarkar
你具体指什么?抱歉我没跟上。
Jason,
根据这段交流,它声称你不能报告用 K 折平均值训练的完整数据集模型的性能指标。那么,在完整数据集上训练,然后有一个测试数据集来报告模型性能,这难道不更合适吗?
https://stats.stackexchange.com/questions/184095/should-final-production-ready-model-be-trained-on-complete-data-or-just-on-tra
你的总结与多年的研究结果相悖,我对此不感兴趣。
我最好的建议是准备一个测试工具,让你和项目利益相关者对模型在新数据上的性能估计充满信心。
感谢这篇精彩的文章,内容非常丰富。
不过,我无法想象这 K 个训练好的模型如何应用于预测。
我还参考了这篇帖子:https://machinelearning.org.cn/train-final-machine-learning-model/
其中提到:“您通过将所选的机器学习程序应用于所有数据来确定最终模型。”
但我很抱歉,我仍然不清楚如何确定最终模型。是只选择 K 个训练模型中最好的一个吗?还是将结果组合起来构建一个更好的模型?还是其他什么?
您能给出一个基于 K 折交叉验证来确定最终模型的实际例子吗?谢谢。
简单的方法是,一旦你有一个在你的测试工具/程序上可靠的算法和配置,你就使用它,并在所有可用数据上拟合一个模型,然后使用该模型开始对新数据进行预测。
如果最终模型的方差很高(在你的测试工具上可以看到),你可以通过在所有训练数据上拟合 K 个模型来减少这种方差,并在对新数据进行预测时将它们作为一个集成模型一起使用。
这有帮助吗?
感谢您的解释。
我才刚开始用 Python 自学机器学习几天,看来我把 k 折交叉验证中的一些东西混淆了。
在我接触 k 折交叉验证这个话题之前,我通过将已知数据分成训练数据和测试数据来学习,我们可以通过比较预测值与测试数据来估计性能。
所以,我猜 k 折交叉验证是用来通过使用不同的训练和测试数据组来找到最佳模型。这似乎是错的。
我可以说 k 折交叉验证是用来比较不同算法/配置的吗?然后根据分数选择最佳算法,并使用该算法构建模型。
非常感谢。
K 折交叉验证只是另一种评估模型在新数据上预测性能的方法。
就像训练/测试分割一样,但结果偏差较小(更乐观)。
你可以在这里了解更多
https://machinelearning.org.cn/k-fold-cross-validation/
我对 K 折交叉验证总体上有点困惑。
最初我以为它的目的是用于评估,以验证所创建的模型。它涉及使用一个特定的机器学习模型,并重复其评估多次,以获得多个不同的分数,从而得到平均分数。这很好,因为它避免了如果模型训练和评估只进行一次时发生的“幸运”情况。
但在这里,K 折交叉验证在实际训练或评估之前用于寻找超参数(例如训练模型的最佳机器学习技术)。
此外,在某些其他来源中,K 折交叉验证用于整个数据集(训练集 + 测试集),而在其他来源中,K 折交叉验证仅用于训练集。
我相当困惑……如果您能澄清这些关于 K 折交叉验证的事情,我将不胜感激。
你是对的。在所有情况下,它都用于估计模型在数据集上的性能。
https://machinelearning.org.cn/k-fold-cross-validation/
它可以在不同的规模下运行,跨配置,跨模型,针对一个模型。在某些更高的层面上,我们可能需要保留一些额外的数据进行验证,以避免模型过拟合数据集。
你可以在这里了解验证数据集。
https://machinelearning.org.cn/difference-test-validation-datasets/
你好,
感谢这篇精彩的文章。
我已遵循了构建机器学习项目的整个过程。这包括标准化、特征工程,甚至将模型保存为 pickle 文件。然而,当我想在现实世界中使用我的模型进行预测时,我需要以与训练数据相同的方式准备新数据。我清楚地知道我的标准化是基于训练模型中的值完成的,那么我如何根据训练模型中的值标准化我的新数据呢?
标准化会保存新数据的规则吗?我如何访问它们,以及我是否可以将一些数据保存到模型文件中,因为我需要对数字进行一些四舍五入,并且这些数字已在训练集中使用过。
我如何获得所有这些?模型会保存它们吗?
你必须使用用于准备训练数据的相同系数,或者如果更容易的话,使用相同的对象。你可能还需要将对象/系数腌制。
嗨,Jason,
感谢您的帖子。
我对部署模型的步骤感到困惑。我们是保留从训练数据中获得的“旧”系数并将其应用于新数据吗?还是我们重新拟合模型(我们通过验证步骤得出“最佳”模型)到新数据上?
在训练数据上计算出的系数就是模型。
模型以只读方式用于对新数据进行预测。
这有帮助吗?
谢谢!有道理。
不客气。
嗨,Jason,
我训练了一个模型并保存了它,但问题是,当我在测试代码中访问它时,测试代码无法获取训练模型的类名。那么,有没有什么技巧可以解决这个问题呢?
你到底遇到了什么问题?
嗨 Jason
这一系列关于交叉验证和训练最终模型的文章非常启发。我发现信息和您在评论回复中的一致性对我在理解这个概念方面非常有帮助。我认为我最大的困惑在于听到“一旦你有一个你喜欢的模型……”这样的说法。正如我现在从您的解释中理解交叉验证,我们并不是试图在交叉验证期间优化模型训练的结果(模型参数、缩放因子、特征等),而是希望优化我们应用于每个折叠的过程,从而在所有折叠中获得最一致的“分数”。例如,我们可能会尝试基于每个特征与预测结果的相关性进行特征选择。将其应用于每个折叠实际上可能会根据该折叠的训练数据导致不同的特征。但最终,我们不感兴趣的是最佳特征列表,而是我们以编程方式选择这些特征的最佳方法,基于它如何影响所有折叠结果的方差。一旦我们收集了所有我们“喜欢”的方法,我们就会将它们应用于整个数据集,以生成一个训练好的可部署模型。我理解正确吗?
完全正确!!!
我们正在寻找一种能够为我们的数据可靠地生成好模型的过程。
这现在真的会对你有帮助——把它全部联系起来。
https://machinelearning.org.cn/applied-machine-learning-as-a-search-problem/
Jason — 我昨天给您发了一封很长的问题邮件,因为在您的许多帖子中没有找到答案。然后我突然在别处找到了这个话题,特别是在这篇关于“最终模型”的帖子中。无需回复我昨天的帖子。我现在明白,通过分割和交叉验证进行的采样产生了对当前问题有效的配置和算法。我确信应用于新数据集会带来进一步改进的机会。所以,当我问“智能驻留在哪里”时,我可以给出这个答案:“它驻留在通过实验证明的精炼算法和配置中。”感谢您提供了如此优秀的资源。
谢谢 Patrick。
嗨 Jason。感谢您的文章。
我最近遇到了以下问题。我有两个分类器——随机森林和梯度提升。我使用交叉验证来找到最优参数。最初我将仅在训练集上训练的模型作为最终模型,并使用测试集的准确率指标来评估它们(准确率约为 95%)。
最近阅读您的帖子后,我决定在完整数据集上训练最终模型。完成后,我评估了最终模型在完整数据集上的准确率,梯度提升的准确率约为 95%,而随机森林模型的准确率达到了 100%。换句话说,最终的随机森林模型正确分类了完整数据集中的所有点。
这怎么可能?您见过这样的情况吗?
谢谢,
Egor
你不能在用于训练模型的数据上估计模型的准确性。
你使用交叉验证来估计准确性,然后拟合最终模型。无需再次评估,因为你已经有了估计值。
有没有理由不直接集成交叉验证期间训练的模型来生成最终模型?
当然,10 个模型,每个模型都用 90% 的不同数据训练,肯定会比 1 个模型用所有数据训练产生更好的结果?
我使用的数据是嘈杂且非平稳的,所以我认为多个模型将有助于减少结果的方差。
随口一说:一个模型更简单。
集成模型只有在有投资回报率(例如,技能有显著提升)的情况下才好用。这并非总是如此,有时甚至可能是负面的。
方差的降低也是一个很好的理由。
试试看吧!
你好,Jason Brownlee,
我已经在鲁棒回归中开发了自己的模型,也为我提出的模型做了一些编程。但现在我想通过交叉验证来验证所提出的模型,从定义的网格中找出调整和超参数的最优值。如果您能为我们自己的模型提供任何与交叉验证相关的教程或代码,我们可以手动完成,而不是针对现有模型。
也许从这里开始
https://machinelearning.org.cn/faq/single-faq/how-do-i-evaluate-a-machine-learning-algorithm
还有这里
https://machinelearning.org.cn/k-fold-cross-validation/
嗨,Jason,感谢这篇精彩的文章!
我对最终模型仍然有些困惑。这是我的例子
我有40个观察值。
1. 我应用K=10的k折交叉验证,然后重复50次,最后得到500个模型。
2. 我计算了这500个模型的误差指标(如AME、RMSE、标准差)的平均值。
3. 我根据交叉验证选择了最佳配置。
4. 我在所有40个观察值上训练我的数据以获得最终模型参数。
所以我的问题是:我如何测试我的模型以查看它的预测效果如何?我没有留下任何观测值用于预测。我是否需要保留一些观测值用于模型预测?比如,我在30个值上训练我的最终模型,然后评估它对剩余10个值的预测?如果是,这10个值应该如何在我的数据集中选择才能具有代表性?
此致,
Amir
无需测试最终模型,您已经使用交叉验证测试了该配置。该测量结果告诉您模型平均预期表现如何。
嗨,Jason,我已保存并加载了模型,但在进行单次预测时遇到了问题。您有什么办法可以进行单次预测吗?抱歉提问,因为我只是机器学习的初学者。谢谢您,Jason
是的,请看这些例子
https://machinelearning.org.cn/make-predictions-scikit-learn/
谢谢你,Jason。这对我很有帮助。 🙂
不客气!
嗨,Jason,
感谢您的帖子。您能帮我回答一个非常重要的问题吗?
我目前正在进行我的毕业设计项目,该项目涉及对从互联网抓取的文本进行文本分类。为此,我必须进行特征工程来训练SVM (SVC) 分类器。这些特征包括:整个句子的平均tfidf值、词根的存在和命名实体识别(NER)的存在。
现在我已经训练并保存了模型,我面临一个困境。我想使用这个预训练模型为稍后将要抓取的未知数据生成标签。但问题是,我必须创建名为tfidf平均值(句子中所有token的tfidf值之和/句子中token总数)的特征。因此,如果我稍后需要为未知数据生成这些特征,单词和值将大不相同。因此,模型可能表现良好,也可能表现不佳。
我该如何避免这种情况并确保模型正常工作?有没有办法获取标准值?
好问题,也许您需要将用于训练数据的数据准备对象与模型一起存储,并重新使用它们来准备新数据。
很棒的帖子!信息量很大..
但我有个问题。
据我所知,如果我们有大量数据,就不需要做k折交叉验证,可以直接使用训练/测试数据集。但当我们数据不足时,应该优先选择k折(或其他交叉验证方法)。
鉴于此,我们真的需要用所有数据(比如包含数十亿个观测值)来训练我们的最终模型吗?这些数据我们甚至在训练时都没有使用过。
谢谢。
是的,通常是这样。
如果你的训练数据集足够大且具有代表性,也许不需要。
嗨,Jason!
我非常感激并惊叹于您以简单易懂的方式解释非常复杂的概念。
我想感谢您并祝您一切顺利。
祝福您!
谢谢,你太客气了!
嗨,Jason,
非常好的帖子,回答了常见的困惑!但我仍然有一个困惑:我注意到人们有时使用整个数据集进行交叉验证,有时他们首先将整个数据集分成训练集和测试集,然后只使用训练集进行交叉验证。哪种是正确的或者它们有不同的目的?
如果我理解您的帖子正确,我们应该首先应用第二种方法(先将数据分成训练集和测试集,然后只使用训练集进行交叉验证),通过这样做,我们比较不同的机器学习方法,并选择最好的。然后使用最好的方法,并使用整个数据集来训练模型以获得最终模型。这是否正确?
非常感谢,期待您的回答!
谢谢。
两者都正确,也都不正确。您必须根据您的具体项目和目标选择合理的方法。
不,这篇帖子是说,在你选择了一个模型/配置之后,把所有的模型都扔掉,用所有数据训练一个最终模型,然后开始用它来预测新数据。
我是一名学生,正在努力完成我在粗糙集理论分类方面的研究,需要一些基本答案
如何找到一个约简
如何构建一个测试模型,因为我的是算法方法(我正在使用工具RSES)
以及如何检查模型的准确性
将是
抱歉,我没有粗糙集理论的教程,我无法就此主题向您提供建议。
你好
我正在继续上面的帖子
将不胜感激并期待您的答复
谢谢……
嘿,
我想知道,如果我想用一些新的和更新的数据重新训练机器学习模型,该怎么做?
如果我想从现有模型中删除一些训练数据,例如现在不那么重要的旧数据。在重新训练机器学习模型时是否可以省略它?
您能提供一些信息或合适的链接吗?
此致,
很好的问题。
我建议测试不同的更新策略,看看哪种最适合您的具体数据和模型。
有哪些不同的更新策略?您能稍微详细阐述一下您的解释吗?
我正在使用编码器-解码器模型,处理温度等数值数据。
这会给你一些思路
https://machinelearning.org.cn/update-lstm-networks-training-time-series-forecasting/
嗨,Jason,
感谢这篇精彩的帖子。我认为这是我发现的少数几篇关于交叉验证和模型构建的有用在线帖子之一。我对交叉验证这个主题还比较陌生,仍然有一些问题;想知道您是否能分享您的专家意见。
我正在尝试构建一个用于预测目的的多项式逻辑回归模型,并被要求进行交叉验证。我得到了一组候选独立变量(IVs)。
我使用所有独立变量,并使用k折交叉验证进行多项式逻辑回归;我发现模型表现不佳:伪R2非常低,只有少数独立变量是显著的。因此,我需要找到一个预测变量数量较少的更好模型。我的问题是
• 每次我尝试一个新模型(使用不同的独立变量集)时,我是否需要进行k折交叉验证?然后识别最佳模型并将其拟合到整个数据集上?
• 或者我是否首先在整个样本的特定子集上执行这些程序(即尝试使用不同预测变量集的不同模型),识别最相关/有用的模型,然后只对该模型使用剩余样本进行k折交叉验证?
• 或者我是否在整个样本上执行那些寻找最终模型的步骤,然后只对最终模型进行k折交叉验证?
我担心上述选项#1和#3的问题是,用于开发模型的数据不应用于测试/验证模型,因为它会给出过于“乐观”的结果。上述选项#1和#3将包含一部分数据集,这部分数据集可能在模型“开发”和“验证”样本中重叠……
感谢您的意见。谢谢!
是的,每个模型都应该以相同的方式(相同的折叠)进行评估。
嗨,Jason,
非常感谢您的及时回复!我真的很感激!只是想确认我理解了您的建议:“每个模型都应该以相同的方式(相同的折叠)进行评估”,使用k折交叉验证,然后最终模型拟合到整个数据集上……?再次感谢!
诚挚地
Rimi
是的。
谢谢!!!
不客气。
尊敬的Jason博士
再次感谢您的信息。
我从您的页面了解到,当像我一样使用
sklearn.model_selection import train_test_split
1) 不需要使用K折交叉验证吗?
2) 另外,我正在使用GBRT进行分类和回归,并且我将20%的数据分配给测试数据。
我的数据是否可能发生过拟合或欠拟合?
我如何理解并防止过拟合和欠拟合?
我的数据集有980条数据,包含14个特征
好问题,这会给你一些想法
https://machinelearning.org.cn/introduction-to-regularization-to-reduce-overfitting-and-improve-generalization-error/
通常您使用交叉验证或训练/测试分割来评估您的模型。
您必须选择适合您数据集的方法,如果不确定,对于小数据使用10折交叉验证,对于非常大的数据或缓慢的模型使用训练/测试。
感谢您的指导
根据你的信息,我在GBRT中获得了这些超参数来克服过拟合和欠拟合
参数 = {‘n_estimators’: 1000,
‘max_depth’: 4,’subsample’:0.25,
‘min_samples_split’: 5,
‘learning_rate’:0.004,
‘loss’: ‘ls’,’min_samples_leaf’:5,
‘random_state’:7}
这个学习率合理吗,因为大多数文献都提到最小学习率是0.01?
或许可以测试一下看看?
是的,我测试了,我只是想知道没有最小学习率是正确的吗?
我的训练偏差图是这样的,因为0.004的学习率波动很大,与测试相比,测试曲线非常平滑。
没有最小学习率。
感谢您的精彩文章!
如果我想从各种模型类型中选择最好的一个,以及超参数的最佳组合,我是否应该首先对每种模型类型进行交叉验证以获得最佳超参数集,然后再进行另一次交叉验证以选择具有最佳超参数的最佳模型?
一种方法是在每个模型的每个交叉验证中进行调优。这被称为嵌套交叉验证。
另一种方法是快速测试一系列模型,然后对表现最佳的模型进行调优,以充分发挥其潜力。理想情况下,第一步和第二步将使用不同的数据,但这可能并非总是可行。
亲爱的 Jason,
非常感谢您宝贵的贡献!
您能帮我解决几个问题吗?
我发现在回复中您说,如果新数据可用,我们必须决定是重新拟合模型还是照常使用。
>. 如果我们决定重新拟合,我们需要从头开始重新做所有选择最佳程序然后确定模型的工作吗?
>. 如果是这样,有多少新数据可用后,我们才重新做这些工作?
>. 如果我们不重新做,这是否意味着我们假设数据中的模式不会随时间变化?
此致,
汤姆
这取决于您想做多少工作或不做多少工作。
最简单的方法是假设该方法仍然可行,并在新数据上重新拟合它。
感谢这篇非常有用的帖子
关于交叉验证后实现最终模型的问题:我现在想在所有数据上重新训练模型。
现在大概没有保留数据(验证或独立测试数据)了。
有没有一种策略可以用来选择训练的 epoch 数量,以防止过拟合/欠拟合?在10次交叉验证中,收敛所需的平均 epoch 数量(带早停)是25-30。将10折中收敛所需的平均 epoch 数量作为在整个数据集上训练的有效策略吗?
那么最终模型的 fit 调用看起来像这样吗
model.fit(allcountdata, allonehotlabels, epochs=25)
再次感谢这篇非常有用的帖子!
一种方法是使用您的测试工具来查找纪元数。
另一种方法是保留一个验证集,并使用提前停止来训练最终模型。
感谢您的教程。但我有一个愚蠢的问题。我正在Keras中使用许多相同维度的数据集训练我的模型。它运行得非常好,最后我想保存模型……但我的问题是,对于每个数据集,模型都会更新,如果我错了请纠正我……那么我应该将哪个模型保存到.h5和.json文件呢……是运行完所有数据集后获得的模型吗……
保存所有数据训练出的模型。
你好,感谢这篇非常棒的帖子!
我对最终模型的分类数据有一个疑问
——我将数据分割成训练/测试集
——我在训练数据上拟合了一个sklearn OnehotEncoder,并转换了训练/测试数据
——我做了交叉验证来选择我的模型
现在我将我的模型拟合到所有数据上以完成它,但是……我需要重新拟合我的OneHotEncoder与所有数据才能转换它,还是我必须重新使用在训练数据上拟合的那个?
是的。
嗨,Jason,
又是一篇很棒的帖子!谢谢你!
希望这个问题既不幼稚也不跑题
如果我像这里一样完成了我的模型(lstm-时间序列预测),然后再次在所有数据上运行model.predict()(以查看过去的预测准确度),这应该会给我一个 nicely aligned 的 y 和 yhat 曲线吗?还是预测会偏离,因为模型无法再次预测时间序列的早期状态?(我尝试过,结果偏离了。所以我担心我构建了一个糟糕的模型……)——谢谢。
我想你是在问模型在训练集上能否做出好的预测。如果是这样,答案是应该能,但它们不会是完美的——我们试图泛化时总会有一些错误。
这有帮助吗?
要选择一个好的模型,请选择一个指标并对其进行优化,并且回顾模型在保留集(测试集)中对预期值的预测以及错误图表是一个好主意。它可以为您提供错误范围的思路,以及如何更好地建模问题。
嗨,Jason,
谢谢。这确实有帮助。预测结果相差甚远,真的……让我感到困惑的是,我在训练和测试过程中取得了大约2%的优秀RMSE。我将重新思考我使用的模型,希望能找到错误的转折点。然而,我仍然想知道训练和测试的RMSE图表看起来如此有希望,而最终预测却相差甚远。
我将更深入地研究我的模型😉
祝你好运!
很棒的帖子。但我有一个问题。如何在一个神经网络上训练所有数据?
我们需要一个验证集来停止NN的训练以防止过拟合。即使我们把最终数据分成训练-验证集,其中10%用于验证以停止网络的训练,那么问题是如何选择验证集呢?
不同的训练-验证可能会导致训练模型的准确性不同。我们是否应该尝试另一个10折交叉验证而不使用任何测试数据,然后选择最佳的一个作为最终模型?
谢谢。
如果你需要数据进行提前停止,那么就保留一些数据用于提前停止。
是的,如果您想抵消高方差,请拟合 n 个模型并集成它们的预测。
是的,集成模型总是可行的。但如果我们只需要一个模型作为最终解决方案,而不是集成模型呢?
那么如何选择验证集(用于早期停止?)以及以什么比例?10%?15%?……
如果我拟合了n个最终模型,那么选择最好的一个还是最差的一个作为最终产品是明智的呢?
随机抽样。然后也许进行敏感性分析以确定适当的比例。
感谢您宝贵且实用的资料。
它们在算法实现和理解基础概念方面都对我帮助很大。
请继续保持。
感谢您的努力。
埃尔凡
不客气!
我使用5折交叉验证比较和调整了3个不同的模型。
我通过查看验证集(而非训练集)上5折交叉验证分数的平均值来调整模型的超参数。我发现模型#2是最好的模型,在验证集上具有最高的5折交叉验证平均分数。
现在我将选择经过调优的模型#2,并在所有数据集上拟合,以获得我的最终模型。
我这样做对吗?
提前感谢您的回复。
根据模型在相同测试工具上相对于其他模型的平均性能来选择模型是个好主意。
嗨,Jason
我有一个不平衡的数据集。在使用分层10折(每个折叠使用3NN和欠采样)后,我获得了83%的f1_score平均值。最后,我在所有可用数据上训练我的模型,并将其应用于新的未见过的数据,得到了67%的f1_score。这是因为类别不平衡吗?我是否应该对所有数据进行欠采样并应用3NN?或者最好保留我在最后一个折叠中使用的模型?
提前感谢!
您应该只在未见过的数据上评估模型,而不是在训练数据上。
也许这个框架会有帮助
https://machinelearning.org.cn/framework-for-imbalanced-classification-projects/
嗨,Jason
感谢您的帖子,非常棒。我是一个初学者。我困惑的是,对于K折交叉验证的单个折叠,测试集对于在训练数据上训练的模型来说是未见数据,所以如果我们不尝试使用K折交叉验证来选择最佳参数,我是否可以认为K折交叉验证是K个最终模型的组合?
抱歉,我不确定我是否理解您的问题。
也许您可以重新措辞?
嗨,我刚开始学习机器学习这个有趣的世界,我想问您,一旦我的模型训练好,如何让它随着时间的推移学习新数据。
您提到一旦最终确定,训练数据集将不再需要。模型的学习将如何存储?
谢谢!
您将模型保存到文件,加载它,然后开始对新数据进行预测。
模型从训练数据集中学到的一切都在模型中。
这有帮助吗?
嗨,Jason,我是您的忠实粉丝!感谢您为教育我们所做的一切。我们是否可以使用Sklearn中CV的return_train_score而不是mean_test_score来确定模型的稳定性和过拟合?如果是,我们是否应该将测试集和训练集之间的最小分数差异作为我们选择的基础?
也许这会有帮助。
https://machinelearning.org.cn/overfitting-machine-learning-models/
非常感谢!您推荐的链接非常有帮助!
不客气。
嗨,Jason,
感谢这篇文章。
我目前正在研究一个分类问题,预测共享经济中的服务提供商流失。我将以优步司机为例来解释我的问题。
假设我有一个包含500名司机的数据集,我用它来创建一个模型,我在测试集上获得了不错的准确性,然后使用所有数据来训练一个最终模型。有没有办法预测我们目前雇用的司机(模型中使用的那些)——例如,我是否可以使用模型在1个月后对相同的司机进行预测,当时许多用于创建模型的值已经改变了?改变的变量示例可以是:“已处理的订单(驾驶)”、“总收入”、“客户评论”。您对此有何看法——它是否必须是新数据,或者它可以是“相同”数据,但现在已发展为不同的数据?
提前感谢,并请注意安全。
如果您有新的或不同的变量,通常模型会失效。
嗨 Jason
祝贺你的网页。我开发了一个随机森林模型,能够使用20个预测变量预测数值响应,在训练/测试集上偏差为90%,方差约为15%。一旦我将模型部署到生产环境几周后,我检查了模型的性能。令我大吃一惊的是,我发现偏差和方差接近零(R2 –>0)。我检查了20个预测变量的分布,发现其中一些有轻微的均值偏移,尽管分布仍然在相同的数值范围内。为了验证这种微小差异可能是模型在生产环境中表现不佳的原因,我将所有数据放在一起,并随机选择了一些实例,以便稍后检查部署的模型。这次用于构建模型的预测变量与未见过的预测变量之间的分布完全相同。并且模型表现出与测试集相同的准确性。那么,均值上的微小差异如何能在模型性能方面造成如此大的差异呢?如何才能使模型对这种差异不那么敏感?在我工作的半导体生产中,均值分布随时间略有差异的可能性很高。在这种情况下,应该采用什么更好的策略?
提前感谢
菲利克斯
谢谢!
是的,也许您的模型需要随着数据的变化频繁更新。这被称为概念漂移。
https://machinelearning.org.cn/gentle-introduction-concept-drift-machine-learning/
Jason,谢谢你的留言。
根据你的经验,如果我有一个像这样的表格
日期 X1 X2 ….. Y
1/1/2020 0.1 3 6.2
1/2/2020 0.3 5 7
1/3/2020 0.2 10 5.9
其中X预测变量是来自生产机器(半导体领域)的传感器数据,Y是生产线末端测量的电学数据,这是一个多时间序列问题吗?我想根据传感器数据X来预测响应Y。训练/验证/测试的分割是应该随机进行,还是应该考虑时间轴的过去/现在/未来?
在第一种情况下,例如随机森林返回了一个非常好的结果。而在第二种情况下,同样的模型根本不起作用。
谢谢你的帮助。
菲利克斯
这可能是,这会帮助你
https://machinelearning.org.cn/taxonomy-of-time-series-forecasting-problems/
杰森和各位
我正在使用Windows 10。我已导入并初始化H2O。我正在尝试运行XGBOOST。我已导入H2OXGBoostEstimator。当我运行模型时,我收到一个错误:Error Post/3/Model Builders/xgboost not found。请提供任何帮助。谢谢
我建议直接使用xgboost库和API。
嗨,Jason!
您如何决定何时使用嵌套交叉验证?有人说只要样本量小(约2000)就应该使用,但也有人说只在比较算法时(例如,弹性网络与SVM)才应该使用。您的看法是什么?
另外,您提到在训练最终模型时应该丢弃所有交叉验证模型。这意味着我们不使用最佳交叉验证模型中选择的顶级特征来训练最终模型吗?但是使用最佳调优的超参数来训练最终模型可以吗?
谢谢!
没有严格的规定。如果你喜欢,那就去做吧。
在嵌套交叉验证中,我们可以丢弃外循环以用于最终模型,并使用内循环返回的“调优”模型作为最终模型——我认为sklearn会自动为我们拟合所有数据。否则,我们可以使用配置并自己拟合一个最终模型。
哦,那我们怎么确定选择哪个内部模型呢?因为每个外部循环都有自己的内部模型?我们是否只选择表现“最佳”的外部循环(根据R2或RMSE),然后选择该特定外部循环的内部模型来训练最终模型?
非常感谢 🙂
内循环测试许多配置,并推荐表现最佳的配置,它还返回一个具有该配置的模型。
所有这些都描述在这里
https://machinelearning.org.cn/nested-cross-validation-for-machine-learning-with-python/
嗨,Jason,
感谢您的澄清——
我们进行训练/测试分割或k折交叉验证只是为了检查
1) 给定的数据是否代表了生产数据 &
2) 我们构建的模型类型是否有助于获得准确的预测
一旦我们确定了以上两点,我们就可以使用所有数据来构建最终模型。
此致,
纳格什。
感谢您的反馈,Nagesh!
好文!
James,您能回答一下,在使用CatBoost和XGBoost等梯度提升算法进行交叉验证时,如何选择提前停止轮数后的最终估计器数量吗?
谢谢!
嗨,Simon……以下资源可能会对您有所帮助
https://www.analyticsvidhya.com/blog/2016/02/complete-guide-parameter-tuning-gradient-boosting-gbm-python/
你好 James,文章很棒!我的问题可能有点傻,但如果有一个包含一些预处理步骤的管道,我们应该怎么做呢?
一个简单的例子
# 带有预处理器的管道
log_clf = Pipeline([(‘preprocessor’, preprocessor), # OHE, Scalers, Imputers 等。
(‘smote’, SMOTE(random_state=42)), # 因为我处理的是不平衡数据集
(‘clf’, LogisticRegression(**log_clf_best_params))]) # 来自超参数调整的参数
log_clf.fit(X_train, y_train)
或者
log_clf.fitt(X, y)? 🙂
# joblib 转储
model_name = ‘log_clf_model.pkl’
joblib.dump(value=log_clf, filename=model_name)
我应该简单地在训练数据上拟合管道,在测试集上预测,如果结果良好,再在整个数据集上拟合并导出吗?
最好的!
嗨,A……感谢您的反馈!以下资源可能对数据准备和管道的最佳实践有所帮助。
https://machinelearning.org.cn/data-preparation-for-machine-learning/
https://machinelearning.org.cn/machine-learning-modeling-pipelines/
谢谢!我之前读过它们,它们非常有帮助。我目前唯一担心的是,是否可以使用整个管道在完整数据集上运行并将其导出为pkl文件,还是应该坚持使用在训练数据上拟合的管道——我找不到这个问题的简单答案。:)
真心感谢您的帮助……
谢谢!
那么,当我们使用交叉验证后想要选择最终模型进行预测时,是否应该在所有可用数据上重新训练模型?(可用数据是指训练集,例如70%)或者我该怎么做?
嗨
我想了解如何构建最终模型。
我读了这篇文章:https://machinelearning.org.cn/train-final-machine-learning-model/
假设我有100个项目,我将测试数据(90%)分割,剩下10%作为测试数据。我使用MinMaxScaler()对数据进行归一化,如下所示。
缩放器 = MinMaxScaler()
缩放器.fit(训练值)
训练 = 缩放器.transform(训练值)
测试 = 缩放器.transform(测试值)
之后,我完美地训练和调优了模型,得到了最佳模型。
最后,我将通过在所有数据(100个项目)上拟合模型来构建最终模型,用于生产运行。
问题是
我需要使用100个项目重新创建缩放器,然后进行拟合以获得最终结果,如下所示吗?
final_scaler = MinMaxScaler()
final_scaler =scaler.fit(所有值)
all_secaled_values = scaler.transform(所有值)
finale_model.fit(x=all_x, y=all_x, epochs=1)
或者我可以使用训练时的缩放器在生产环境中运行?
嗨,Pongthorn……您应该在投入生产之前,先在验证数据集(模型从未见过的数据)上测试您的想法。
如果我在K折交叉验证期间使用EarlyStop,那么在用所有数据集训练我的最终模型时,是否也应该使用它?
我们是否需要将所有可用数据作为准备最终模型的一部分来创建缩放器?
嗨,bhagath……以下资源解释了数据缩放的好处和方法
https://machinelearning.org.cn/standardscaler-and-minmaxscaler-transforms-in-python/
大家好,首先我要感谢你们发布这些非常有用的文章!但是,我仍然有一个问题悬而未决。
我有一个数据集,分为训练集、验证集和测试集。
如果我现在想使用k折交叉验证进行评估,那么我必须将训练子集和验证子集合并,然后从中形成N个折叠。如果我现在发现模型运行良好(经过交叉验证后),那么最终训练将使用来自训练集和验证集的数据进行。这意味着所有数据都用于训练,并且在训练期间省略了任何中间验证(没有数据用于此)。然而,最后,模型会使用在交叉验证期间未使用的测试数据集进行评估。我理解得对吗?如果最终模型之前已经证明是好的,是否有必要评估它?如果没有,那么我也可以使用测试数据集中的数据来训练最终模型。
嗨,Dennis……训练、验证、测试分割和交叉验证的最佳实践可以在这里找到
https://machinelearning.org.cn/training-validation-test-split-and-cross-validation-done-right/
我是Mirognal,我是工程水文学硕士研究生。我的研究题目是“评估土地利用土地覆盖和水土保持措施对土壤流失和泥沙产量的影响,使用机器学习方法”。因此,我需要你们所有人的支持,关于如何开始我的机器学习研究。如果您愿意,请从头到尾发布分步程序,说明我该怎么做。
感谢您的辛勤工作和将为我们所做的一切。
嗨,Mirongnal……我有一些研究学位,我当时热爱研究,现在也热爱。但我觉得自己不擅长研究。
事实上,我喜欢阅读和弄清楚别人的发现,也许比制定自己的研究计划更甚。也许我更像工程师和学者,而不是学术研究员。
因此,我觉得自己没有资格就您的研究提供建议。
我建议与您的研究导师讨论。毕竟,这正是他们的工作,您选择了他们,他们也选择了您。
此外,非常聪明的人们已经写下了他们的建议。
我建议阅读
《有效研究的原则》,迈克尔·尼尔森,2004年。
《机器学习研究的有偏见指南》,约翰·舒尔曼,2017年。
还有这些经典之作
《你和你的研究》,理查德·汉明,1986年。
《病理科学》,欧文·朗缪尔,1953年。
《货运崇拜科学》,理查德·费曼,1974年。
《为什么大多数已发表的研究结果都是错误的》,约翰·约安尼迪斯,2005年。