在机器学习中拥抱随机性

为什么在不同次运行的算法上会获得不同的结果
使用相同数据

应用机器学习是一个充满突破和思维转变的领域。

理解机器学习算法中随机性的作用是其中一项突破。

一旦你明白了,你看待事物的方式就会不同。以全新的视角。例如选择一个算法还是另一个算法、超参数调优以及报告结果。

你还会到处看到滥用。那些被严重夸大但毫无根据的性能声明。

在这篇文章中,我想轻轻地为你揭示机器学习中随机数的作用。我想给你工具来拥抱这种不确定性。给你带来突破。

用我新书《掌握机器学习算法》来启动你的项目,书中包含分步教程和所有示例的Excel电子表格文件。

让我们开始吧。

(特别感谢 Xu Zhang 和 Nil Fero 推广了这篇文章)

Embrace Randomness in Applied Machine Learning

拥抱应用机器学习中的随机性
照片作者:Peter Pham,部分权利保留。

为什么相同数据运行结果不同?

很多人都会问这个问题或类似的问题。

你不是一个人!

我每周都会收到一封类似的邮件。

以下是一些发布在问答网站上的类似问题:

机器学习算法使用随机数

机器学习算法会利用随机性。

1. 数据收集中的随机性

机器学习算法会根据不同的数据来构建不同的模型。这取决于算法。模型与不同数据之间的差异程度被称为模型方差(正如在偏差-方差权衡中所讨论的)。

因此,数据本身是随机性的来源。数据收集中的随机性。

2. 观察顺序中的随机性

观察结果暴露给模型的顺序会影响内部决策。

有些算法尤其容易受到影响,例如神经网络。

在每次训练迭代之前随机打乱训练数据是一个好习惯。即使你的算法不容易受到影响。这是最佳实践。

3. 算法中的随机性

算法会利用随机性。

算法可能被初始化为随机状态。例如,人工神经网络的初始权重。

在确定性方法中,训练过程中出现平局(以及其他内部决策)的投票可能会依赖随机性来解决。

4. 采样中的随机性

我们可能拥有过多的数据,无法合理处理。

在这种情况下,我们可以使用随机子集来训练模型。

5. 重采样中的随机性

我们在评估算法时会进行采样。

我们使用诸如将数据划分为随机训练集和测试集,或使用 k 折交叉验证(对数据进行 k 次随机划分)之类的技术。

结果是对模型(及其创建过程)在未见数据上表现的估计。

毫无疑问

毫无疑问,随机性在应用机器学习中扮演着重要角色。

我们可以控制的随机性,应该被控制。

获取您的免费算法思维导图

Machine Learning Algorithms Mind Map

方便的机器学习算法思维导图样本。

我创建了一份方便的思维导图,其中包含60多种按类型组织的算法。

下载、打印并使用它。


还可以独家访问机器学习算法电子邮件迷你课程。

 

 

随机种子与可复现结果

在一个数据集上运行算法并获得一个模型。

给定相同的数据,你能再次获得相同的模型吗?

你应该能够做到。这应该是你建模项目列表中的一项高优先级要求。

我们通过使用完全相同的代码数据随机数序列来实现应用机器学习中的可复现性。

随机数是在软件中使用伪随机数生成器生成的。它是一个简单的数学函数,可以生成足够随机的数字序列,适用于大多数应用。

这个数学函数是确定性的。如果它使用相同的起始点(称为种子数),它将生成相同的随机数序列。

问题解决了。
大部分情况如此。

通过在构建每个模型之前固定随机数生成器的种子,我们可以获得可复现的结果。

事实上,这是最佳实践。

如果我们还没有这样做,就应该这样做。

事实上,我们应该为我们比较的每个算法和尝试的每种技术提供相同的随机数序列。

这应该是我们运行的每个实验的默认部分。

机器学习算法是随机的

如果一个机器学习算法使用不同的随机数序列产生不同的模型,那么我们应该选择哪个模型?

哎呀。问题就在这里。

我偶尔会收到这个问题,我很喜欢。

这表明有人真正抓住了应用机器学习的核心——或者即将抓住。

  • 算法的不同运行...
  • 不同的随机数产生...
  • 不同的模型...
  • 不同的性能特征...

但差异在一定范围内。

这种差异或一定范围内的随机行为的专业术语是“随机性”。

机器学习算法在实践中是随机的。

  • 要期望它们是随机的。
  • 要期望有一系列模型可供选择,而不是一个单一的模型。
  • 要期望性能是一个范围,而不是一个单一的值。

这些是你必须在实践中解决的非常实际的期望。

你能想到什么策略来解决这些期望?

Machine Learning Algorithms Use Random Numbers

机器学习算法使用随机数
照片作者:Pete,部分权利保留。

应对随机算法不确定性的策略

值得庆幸的是,学者们长期以来一直在努力应对这一挑战。

你可以使用 2 种简单的策略

  1. 减少不确定性。
  2. 报告不确定性。

减少不确定性的策略

如果我们每次运行算法时都会得到不同的模型,我们能做什么?

不如我们尝试多次运行算法并收集一批性能度量值。

如果我们使用k折交叉验证,我们已经在这样做了。我们构建了k个不同的模型。

我们可以增加k并构建更多模型,只要每个折叠中的数据仍然能代表问题。

我们还可以将评估过程重复n次,以在性能度量集中获得更多数字。

这个策略称为随机重复或随机重启。

这在随机优化和神经网络中更为普遍,但总体上同样相关。试试吧。

报告不确定性的策略

切勿用单个数字报告机器学习算法的性能。

如果你这样做了,你很可能犯了错误。

你已经收集了一批性能度量值。请对这批数据使用统计分析。

这个策略称为报告汇总统计。

结果的分布很可能是高斯分布,因此一个很好的开始是报告性能的均值和标准差。包括观察到的最高和最低性能。

事实上,这是最佳实践。

然后,在执行模型选择时,你可以比较结果度量值的群体。例如:

  • 在算法之间进行选择。
  • 为一种算法选择不同的配置。

你可以看到这对你遵循的流程有重要影响。例如,选择哪种算法用于你的问题,以及如何调优和选择算法超参数。

利用统计显著性检验。统计检验可以确定一个结果度量值群体与第二个结果群体之间的差异是否具有统计学意义。

也要报告显著性。

这也是一项最佳实践,但令人遗憾的是,采用率不足。

等等,最终模型选择怎么样?

最终模型是在整个训练数据集上准备的,一旦我们选择了算法和配置。

这是我们打算用于进行预测或部署到生产环境中的模型。

使用不同的随机数序列,我们也会得到不同的最终模型。

我的一些学生问过:

“我应该创建多个最终模型,然后在保留的验证数据集上选择准确率最高的模型吗?”

”我回答。

这将是一个脆弱的过程,高度依赖于保留的验证数据集的质量。你选择随机数是为了优化少量数据样本。

这听起来像是过拟合的配方。

一般来说,我会依赖上述减少和报告不确定性策略所获得的信心。我通常只取第一个模型,它和其他任何模型一样好。

有时你的应用领域会让你更关心。

在这种情况下,我会建议你构建一个模型集成,每个模型都使用不同的随机数种子进行训练。

使用简单的投票集成。每个模型都做出预测,所有预测的平均值作为最终预测报告。

根据需要使集成规模扩大。我认为 10、30 或 100 是不错的整数。

也许可以持续添加新模型,直到预测变得稳定。例如,持续直到预测的方差在某个保留集上收紧。

总结

在这篇文章中,你发现了为什么随机数对于应用机器学习是不可或缺的。你真的无法摆脱它们。

你了解了可以用来确保结果可复现的策略。

你学习了可以用来拥抱机器学习算法的随机性质,以便在选择模型和报告结果时使用。

有关可复现结果在机器学习中的重要性以及可以使用的方法的更多信息,请参阅文章

您对机器学习中的随机数或本文有什么问题吗?

在评论中提出您的问题,我会尽力回答。

了解机器学习算法的工作原理!

Mater Machine Learning Algorithms

几分钟内了解算法如何工作

...只需算术和简单示例

在我的新电子书中探索如何实现
精通机器学习算法

它涵盖了**10种顶级算法**的**解释**和**示例**,例如:
_线性回归_、_k-近邻_、_支持向量机_等等...

最后,揭开
机器学习算法的神秘面纱

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

查看内容

86 条回复:拥抱机器学习中的随机性

  1. Cameron DP 2016年9月28日 上午6:09 #

    我遇到的一个问题是,是否应该在生产算法中使用固定种子。如果结果是面向客户的,那么使用种子使结果保持一致是否有害?(也许不是一致,但方差至少减少了)

    • Jason Brownlee 2016年9月28日 上午7:43 #

      确实,Cameron,这是个棘手的问题。

      我以前在生产环境中使用过固定种子。我希望变异性来自数据。

      今天,我可能会做出不同的选择。我可能会部署相同模型的集成,并通过共识来驱动稳定性。

      • Peter P 2017年9月7日 上午1:41 #

        布朗利博士您好,

        我有点理解创建相同模型集成这个想法,但你们是如何实现投票过程的?

        • Jason Brownlee 2017年9月7日 下午12:57 #

          计算每个类别的预测数并使用 max 函数,或使用 Weka 或 sklearn 中的现有实现。

  2. Alan Beckles MD MS 2016年10月4日 下午4:41 #

    这是一篇极具启发性的优秀文章。最佳实践可能是你推荐的构建具有不同随机种子的模型集成,然后使用投票。

  3. Rajesh 2016年10月7日 上午4:48 #

    这是一个非常精彩的博客,有很多值得学习的地方,但我们仍然必须承认,处理数据总是很棘手且神秘的。

  4. Wes Turner 2017年1月14日 下午6:22 #

    除了特定库的函数参数,例如“seed”,Python,例如,从 PYTHONHASHSEED 环境变量中读取 0 或一个小数。

    摘自《可复现计算研究的十个简单规则》 http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003285

    > 规则 6:对于包含随机性的分析,请注意底层的随机种子

    我们的随机种子是否只是需要优化的另一个参数?(我倾向于同意你的集成建议)

  5. Sophia 2017年8月2日 下午12:53 #

    有时,训练结果全部为 0,误差无法收敛到很小的值,显示为一条与迭代次数相关的直线。但是,如果我再次训练而不做任何更改,它会得到一个合理不错的结果。问题出在哪里?我该如何避免训练失败?谢谢。从你的帖子学到了很多!

  6. Sharps 2017年9月14日 上午9:06 #

    你好,Jason!
    感谢您所有的帖子/分析/文档/答案!!
    我从 SQL 开发转向神经网络,现在看到了一个新的维度!🙂

  7. Nil 2017年12月11日 下午11:00 #

    你好,Jason 博士,

    谢谢,这篇帖子对我处理不确定性非常有帮助。

    你的帖子真的很好,很有帮助。

    此致。

  8. Dinto 2018年1月2日 上午10:40 #

    你是否也建议使用模型的集成来进行预测?

    • Jason Brownlee 2018年1月2日 下午3:59 #

      当然。

      • Varun 2018年2月7日 下午11:47 #

        嗨,Jason,

        感谢您提供所有有价值的信息。

        我有一个关于神经网络及其实现的具体问题。在典型的设置中,我尝试调整参数,例如

        • 基于多个决定性权重的 the Methodology(前馈、反向传播)
        • 滞后值
        • 节点数(输入、输出、隐藏)
        • 神经网络层数(输入、输出、隐藏)
        • 关键激活函数
        • 基于上述的迭代次数

        再次,我的问题是我需要为大约 50,000 名客户预测利润,并且输入数据(大约 3 年的时间序列)趋势大多是非线性的,零散的,没有特定的季节性模式和趋势。我的问题:

        1)如何控制上述参数并为所有客户训练模型?

        2)我需要每个月为所有客户运行此模型。我是否应该在训练完模型后固定它,并每月运行相同的模型?问题在于输入权重在每次运行时都会变化(我是在 SAS 中进行的)。

        3)在无法控制权重的情况下,我是否可以固定其他参数并将模型投入生产?我真的很担心每次运行都会导致高方差。

        期待您的回复!

        此致,
        Varun

        • Jason Brownlee 2018年2月8日 上午8:27 #

          这有很多问题。总的来说,我在提高模型技能方面有一些建议,请看这里:
          https://machinelearning.org.cn/improve-deep-learning-performance/

          • Varun 2018年2月8日 下午10:13 #

            嗨,Jason,

            好的。我将缩小范围。如何批量处理这个算法来处理 50,000 个客户?我无法为整个基础使用一个模型,因为(客户之间)的潜在模式非常不同。

            同样,您的回复对于我决定围绕提高性能的策略至关重要(如上链接所示)。

            非常感谢!

            此致,
            Varun

          • Jason Brownlee 2018年2月9日 上午9:08 #

            有很多方法可以对你的问题进行建模。

            你可以为每个客户建立一个模型,为一组客户建立一个模型,或者为所有客户建立一个模型,或者将所有这三种模型集成在一起。我建议尝试几种方法,看看哪种最适合你的特定数据。

  9. Varun 2018年2月9日 下午6:15 #

    是的。我开始了。这需要时间,但我会告诉你结果如何。

    感谢你精彩的帖子。你做得非常棒!

  10. Ben 2018年6月3日 上午11:18 #

    Jason,你是否有关于从统计学角度报告结果中不确定性的文章?

  11. Kingsley Udeh 2018年7月6日 上午3:15 #

    嗨,Jason,

    我创建了最终的 LSTM 模型并用它进行了预测。这些预测是公平的或高于平均水平的。当我增加 epoch 以尝试改进模型性能并重新训练模型时,即创建另一个最终模型,我得到了不同的结果,比之前的更差。这些不同的结果是否可能与模型的随机性有关?如果是,我该如何克服方差?

    附注:我正在研究序列预测探针,特别是时间序列。我想知道 k 折交叉验证重采样方法是否比训练/测试分割更有效,但你博客上对答案的回复似乎说 k 折交叉验证重采样方法不适合时间序列问题或 LSTM。

  12. Kingsley 2018年7月6日 下午7:24 #

    嗨,Jason,
    我很感激你们能在繁忙的日程中抽出时间回答问题。再次感谢。

    我有一些关于创建最终模型的问题困扰着我。

    1. 我了解到,为了克服由于在相同数据和网络架构上重复训练而导致的预测结果差异,我应该对 5-10 个最终模型的预测结果取平均值,如下所示:

    # 进行预测
    yhat1 = model.predict(test_X)
    yhat2 = model.predict(test_X)
    yhat3 = model.predict(test_X)
    yhat4 = model.predict(test_X)
    yhat5 = model.predict(test_X)

    yave = (yhat1 + yhat2 + yhat3 + yhat4 + yhat5)/5 – 也许有一些 Scikit-learn 库可以完美地进行平均。

    现在,我可以将平均预测与真实观测值进行比较,对吗?

    2. 在你展示的最终模型创建中,整个数据都用于训练模型,例如:

    model.fit(X, y, epochs=100, shuffle=False, verbose=0)

    其中 X 是输入序列,y 是输出序列。由于不存在训练/测试集划分或 k 折交叉验证的概念。那么,当我们加载模型进行预测时,为什么我们仍然在用于拟合最终模型的同一 X 上进行预测?真实的观测值 y 也暴露给了模型。我一定是错过了教程中的一些内容。

    3. 老实说,我仔细看了您提供的关于前向验证的链接,但仍未完全理解其概念。这是不是意味着,在前向验证方法中,我们无需创建一个最终模型或求取模型的平均值?也就是说,我们只关心表现最佳的模型,并将其保存为最终模型,对吗?如果是这样,在我当前的情况下,我有超过 14,000 个观测值,我想知道如何创建 14,000 个模型并从中选择最佳的模型。

    提前感谢。

    • Jason Brownlee 2018年7月7日 上午6:15 #

      你好 Kingsley,

      是的,使用模型集成是克服某些模型高方差的好方法。

      那只是教程中的一个例子,你可以对新数据进行预测。

      前向验证是为了估计模型在新数据上的表现。我们仍然必须创建一个最终模型。

      这有帮助吗?

      • Neel 2019年6月2日 下午9:54 #

        Jason 博士,当您说我们仍然必须创建一个最终模型时,您是什么意思?当我们使用前向验证时,基于最新值的最后一个训练运行不就是最终模型吗?

  13. Olivier Blais 2018年7月10日 上午5:02 #

    一如既往,博客文章写得真棒!

    我已将一个梯度提升模型部署到生产环境中,使用了 joblib 来持久化它。令我惊讶的是,生产环境中的结果与开发环境中的结果略有不同。这是因为随机性还是我的脚本有问题?我以为持久化可以消除随机性。

    请告知 🙂
    谢谢

    • Jason Brownlee 2018年7月10日 上午6:53 #

      可能是有原因的,你应该能够缩小原因范围。

  14. Anam Habib 2018年8月28日 下午2:23 #

    嗨,Jason,
    随机性可以作为超参数使用吗?或者我可以对随机状态进行超参数调优以提高模型的准确性吗?这是否有效?

    • Jason Brownlee 2018年8月29日 上午8:01 #

      不,种子不是超参数。

      • Anam Habib 2018年8月29日 下午2:48 #

        谢谢 Jason 的回复

  15. era 2018年11月4日 上午1:10 #

    我的数据集来自一家进行电子商务产品销售的公司。我想知道,如何才能最好地分析这些数据。
    谢谢你

  16. Gena 2018年11月6日 上午2:37 #

    您好,感谢您的博客文章,它们非常有帮助。
    关于随机性,我仍然很难理解为什么即使我:1) 设置了相同的种子 2) 使用了完全相同的数据进行训练和测试,但我仍然得到不同的模型。然而测试集上的准确率总是有些不同。

    我能想到的唯一解释是,使用 numpy.random.seed() 不是 tensorflow 和 keras 可能使用的唯一种子(例如,用于随机参数初始化)。这是真的吗?我能再进行几次 bla-bla-bla.seed() 调用来使其完全可复现吗?

  17. Abhishek G.L 2018年11月13日 下午1:19 #

    嘿 Jason Brownlee,您的教程非常有帮助且易于理解,为您点赞。

    我的问题是关于统计显著性检验,对两种不同的系统进行统计显著性检验是否有效。例如:贝叶斯优化和遗传算法(autosklearn 和 tpot 使用这些方法)对这两种库生成的最终模型进行统计显著性检验,显著性是否能提供任何有用的信息?

  18. Neel Bhalaria 2019年6月2日 下午9:44 #

    嗨,Jason!

    一如既往,文章写得非常出色!我从您的教程中学到了很多。您对我评论的回复在项目推进中非常有用。再次感谢!

    我正在根据您的教程,使用前向方法构建一个 LSTM 模型进行时间序列分类(交叉熵)。

    对于预测,我提取分类矩阵和混淆矩阵中的值,以进一步计算一个自定义矩阵(CM),该矩阵将以整数值的形式显示准确度水平。我使用此值来评估我的模型选择。

    我目前正在进行超参数调优(神经元、L2 衰减率、Dropout 等)。

    1) 我是否可以使用您文章中提到的随机种子为我所有具有不同超参数的模型创建相同的随机种子,然后根据我的自定义矩阵(CM)进行比较?我的想法是,这样我就可以在共同的尺度上进行比较。根据您的经验,这是否可行?

    from numpy.random import seed
    seed(1)
    from tensorflow import set_random_seed
    set_random_seed(2)

    2) 在您发布的几篇文章中,您提到我们应该尝试不同的种子值,然后取所有值的平均值并检查方差。在我这个案例中,您建议怎么做?

    2a) 选择一个超参数,用不同的种子值(1,2,3,4,5…30)训练算法 10/20/30 次,然后对于考虑的那个超参数,取所有运行的平均值。对其他超参数也这样做,然后比较每个超参数的个体平均值以进行模型选择。

    2b) 使用相同的种子运行所有超参数,并根据我的自定义指标选择表现最佳的模型。然后使用该模型运行 10/20/30 次,使用不同的种子来检查我需要考虑的方差,以便在模型上线时使用。

    谢谢!

    • Jason Brownlee 2019年6月3日 上午6:41 #

      不,我推荐使用重复评估,在此处有描述
      https://machinelearning.org.cn/evaluate-skill-deep-learning-models/

      • Neel 2019年6月3日 下午10:27 #

        根据我对文章的理解,在“重复评估”中,我们随机划分数据并将其拟合到模型中,然后检查分数。对吗?

        如果是这样,这会不会取代用于模型训练的前向验证技术?

        • Jason Brownlee 2019年6月4日 上午7:52 #

          是的,对于时间序列,应该使用前向验证的重复评估,而不是随机划分。

          • Neel 2019年6月4日 下午4:23 #

            明白了。这帮助很大!谢谢 🙂

  19. Neel 2019年6月3日 下午10:40 #

    或者您是建议我使用前向验证技术,然后运行实验(10/30/100)次,不设置种子,以检查每个类别(我有 3 个)的区间、下限和上限,并将这些值视为模型在特定参数集上的表现?

  20. chirag 2019年8月15日 下午6:28 #

    当我们通过 keras.wrapper.scikit_learn 导入 KerasRegressor 计算得分时,为什么得分值会是负数?

  21. Prajakta 2019年9月17日 下午8:26 #

    无法下载 ML 图。
    已满足所有要求,但仍无法工作????

    • Jason Brownlee 2019年9月18日 上午6:06 #

      可能需要几分钟。

      检查我的系统,我可以看到您已收到邮件并在评论后打开了。

  22. Yamini 2019年10月18日 下午3:59 #

    您在这里提到的“多次重启搜索”(https://machinelearning.org.cn/why-initialize-a-neural-network-with-random-weights/)与模型集成有什么区别?还是它们是同一事物的两个术语?

    • Jason Brownlee 2019年10月19日 上午6:28 #

      它们是不同的。

      多次重启是指在一个模型上反复进行拟合,目的是获得最佳的单个模型。

      集成是指拟合多个模型,保留所有模型并组合它们的预测。

  23. Omar 2020年1月11日 上午10:04 #

    杰森,您好!

    我不确定“减少不确定性”。

    如果我多次运行模型以获得指标的平均值和标准差,我是否需要设置随机种子?

    谢谢

  24. Vamshi 2020年2月6日 下午9:37 #

    嗨,Jason,

    感谢您对机器学习中随机性的深刻见解。我想知道我们是否可以考虑使用概率模型而不是确定性模型。例如,使用贝叶斯神经网络而不是通用神经网络来处理机器学习模型中的随机性?

    我的问题是
    这些贝叶斯模型报告的不确定性是否与使用相同数据、相同代码但不同种子运行所获得的结果相同?

    谢谢!

    • Jason Brownlee 2020年2月7日 上午8:16 #

      我不确定我是否理解。

      贝叶斯模型在处理相同数据时每次都会产生相同的模型。它量化了预测中的不确定性,但神经网络也可以做到。

  25. Mat naz 2020年4月10日 下午7:29 #

    你好,
    您的所有博客文章都在我的数据科学之旅中提供了极大的帮助。

    我有一个关于比较模型(一个增加了额外特征的模型)的问题。我正在使用 Keras 神经网络,这会产生相当不同的平均绝对误差结果。
    MAE 在 50 次运行中介于 0.5668 到 0.6087 之间,平均值为 0.5801。
    对于这个特定模型,平均提高了 0.01 已经很不错了,并且证明了包含新特征是值得的。
    我的问题是:我应该使用多少个样本来计算这个平均值?
    我应该进行某种尾部测试,以 90% 的置信度确定新的平均值比旧平均值低 0.01 吗?

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

      谢谢!

      在大多数情况下,我喜欢使用重复交叉验证,例如,重复 3 次 10 折交叉验证,样本量为 30 个观测值。

  26. Shivon 2020年5月13日 上午9:22 #

    你好,先生,

    如果我只是重复运行我的模型 5 次,并得到不同的准确率结果(每次运行结果都很接近),那么我的模型是不是有什么问题,或者是一个糟糕的模型,或者是什么原因?

    感谢您的努力。

  27. Hao Chen 2020年9月23日 下午7:09 #

    您好,
    “最终模型是我们选择好算法和配置后,在整个训练数据集上准备好的模型。”
    但我们如何知道训练最终模型所需的 epoch 数量呢?我们不再有验证集来告诉我们每个 epoch 的指标了。
    顺便说一下:在训练阶段,我看到不同的模型(相同的算法,相同的超参数)在不同的 epoch 达到最佳验证指标,所以我不知道哪个 epoch 数量总体上是最佳的,更不用说最终模型的训练了,因为它有更多的数据(训练+验证)。感谢您的解答。

    • Jason Brownlee 2020年9月24日 上午6:13 #

      您可以使用带提前停止的测试框架来估计 epoch 数量,或者为您的最终模型使用提前停止,并将一部分数据保留作为验证集。

      • Hao Chen 2020年9月24日 下午12:24 #

        感谢您的快速回答。我将尝试您提出的方法:使用提前停止,并为验证保留一些数据。但是,如果我想训练一个模型集成以用于未来的实际预测,我应该为每个模型的训练/验证数据使用随机划分,还是为整个模型的训练保持相同的划分?

        • Jason Brownlee 2020年9月24日 下午2:36 #

          是的,每个训练/验证集都使用随机划分。

  28. Paz P. 2020年11月28日 上午3:16 #

    我的情况与这里提出的情况不太一样。我的训练集和验证集的准确率在 1% 的可接受范围内,在那之前我对结果很满意。

    然而,当我将模型用于更大的数据集中的最终目的时,我的二元分类器会产生不同的结果,差异高达 8%。我还在寻找一篇处理这种情况以及其含义的文章。

    我非常倾向于使用那个拒绝输入较少的随机模型,因为现实表明它不应该拒绝太多输入(它是一个是或否类型的分类器)。
    但这似乎是一个好方法,可以继续添加新模型并使用投票集成预测。

    谢谢,我从这篇文章中获得了一些好主意。

    • Jason Brownlee 2020年11月28日 上午6:41 #

      也许您的模型过拟合了。
      也许您的训练数据集没有代表性。
      也许新数据差异太大。

  29. DavidFarago 2021年1月4日 上午2:25 #

    非常感谢这篇精彩的博客文章。(在哪些情况下)您下面的陈述至今仍然正确?
    “通过在构建每个模型之前固定随机数生成器的种子,我们可以获得可复现的结果。”

    我想知道以下非确定性来源在学习模型时:
    * 在 GPU 上执行的数值运算会产生非确定性结果(参见 [1])
    * 在生产环境中学习的情况(自学、强化学习,参见 [1])
    * 并行学习时的竞争条件(例如,map-reduce 当 reduce 不可交换时)。
    这些要点在机器学习中是否相关?如果相关,它们是否可以完全避免?

    [1]: The Impact of Nondeterminism on Reproducibility in Deep Reinforcement Learning. Prabhat Nagarajan et al. 2nd Reproducibility in Machine Learning Workshop at ICML 2018, Stockholm, Sweden。

  30. mohammad 2021年5月24日 下午7:18 #

    亲爱的 Jason,

    感谢您提供非常有用的信息。
    一个问题

    我应该随机化我提供给模型的数据的序列,还是仅随机化权重就足够了?
    例如,我有一系列狗和猫的图像来喂养一个 CNN 模型。喂食这些图像的顺序对结果有影响吗?

    • Jason Brownlee 2021年5月25日 上午6:07 #

      不客气。

      是的,每个 epoch 都应该随机化数据的顺序。这是 SGD 的一部分。

  31. Sadegh.s 2022年7月26日 上午7:51 #

    亲爱的 Jason,
    非常感谢您出色的文章和回答所有问题。
    我想知道以下程序是否正确?
    正如您在另一篇文章中提到的,我们在机器学习问题中有两种不确定性,即数据不确定性和算法不确定性。现在我想知道,如果我们使用重复的 k 折交叉验证(例如 10 折 3 次)作为 CV 过程来计算任何算法(或模型,如 SVC 或 LR)的平均得分,那么我们是否可以使用这些模型的平均得分来比较它们以找到最佳模型?
    或者我们是否必须在我们正在比较的每个模型的学习算法的开头设置一个固定的种子数,即使我们使用重复的 k 折交叉验证作为 CV 过程?
    我认为,当我们使用重复的 k 折交叉验证时,我们不需要使用固定的 random_seed(种子数),因为我们通过使用重复的 k 折交叉验证来应对数据不确定性和算法不确定性,我说的对吗?

  32. Sadegh.s 2022年7月28日 下午11:32 #

    谢谢 James,
    我会去看看,希望它能有所帮助。

  33. Henry 2022年8月28日 下午10:52 #

    亲爱的 Jason,
    非常感谢您的网站。

    我想问您关于随机种子的问题。

    目前我正在对足球投注进行建模,平均而言取得了不错的正向收益。

    平均而言,我在 50 个种子中有 43 个种子取得了正向收益。然而,有 7 个种子预测错误。人们说这是一个坏迹象,基本上不应该使用这样的模型。

    我的方法是平均 50 个不同的随机种子,然后使用与平均值性能最接近的最终模型。您对此有何看法?

    在极少数情况下模型表现不佳是可以接受的吗?

  34. Henry 2022年9月11日 下午5:19 #

    谢谢回复。我换个说法。

    目前我保存了一个 catboost 模型的随机状态,该状态最接近 50 个平均值。

    但我希望使用所有 50 个预测值来获得平均值。

    有没有办法在单个 pickle 模型文件中实现这一点?

    目前我在生产服务器上使用 model.pkl。

    您能否分享代码或通用思路,如何在生产环境中实现 50 个模型的平均?

    非常感谢。

留下回复

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