如何在 Python 中开发超级学习器集成

为预测建模问题选择机器学习算法涉及使用 K 折交叉验证评估许多不同的模型和模型配置。

超级学习器(super learner)是一种集成机器学习算法,它结合了您可能为预测建模问题研究的所有模型和模型配置,并使用它们进行预测,其效果与您可能研究的任何单个模型一样好或更好。

超级学习器算法是K 折交叉验证堆叠泛化(称为堆叠或混合)的一种应用,其中所有模型都使用相同的数据 K 折划分,并且元模型(meta-model)根据每个模型的折外预测(out-of-fold predictions)进行拟合。

在本教程中,您将了解超级学习器集成机器学习算法。

完成本教程后,您将了解:

  • 超级学习器是利用 K 折交叉验证中的折外预测进行堆叠泛化的应用。
  • 超级学习器集成算法在 Python 中使用 scikit-learn 模型实现起来非常简单。
  • ML-Ensemble (mlens) 库提供了一个便捷的实现,只需几行代码即可拟合和使用超级学习器。

通过我的新书《使用 Python 的集成学习算法启动您的项目,其中包括分步教程和所有示例的 Python 源代码文件

让我们开始吧。

  • **2020年1月更新**:已针对 scikit-learn v0.22 API 的变更进行更新。
How to Develop Super Learner Ensembles in Python

如何在 Python 中开发超级学习器集成
图片由Mark Gunn拍摄,部分权利保留。

教程概述

本教程分为三个部分;它们是:

  1. 什么是超级学习器?
  2. 使用 scikit-learn 手动开发超级学习器
  3. 使用 ML-Ensemble 库的超级学习器

什么是超级学习器?

对于一个预测建模问题,有数百种模型可供选择;哪种是最好的?

然后,在选择模型之后,如何针对您的特定数据集进行最佳配置?

这些都是应用机器学习中的开放性问题。目前我们最好的答案是使用经验实验来测试和发现最适合您数据集的方法。

实际上,事先通常不可能知道哪种学习器在给定的预测问题和数据集上表现最好。

《超级学习器》,2007。

这涉及选择许多可能适合您的回归或分类问题的不同算法,并使用重采样技术(例如K 折交叉验证)评估它们在您的数据集上的性能。

然后选择根据 K 折交叉验证在您的数据集上表现最好的算法,在所有可用数据上进行拟合,然后您可以开始使用它进行预测。

还有另一种方法。

考虑您已经在您的数据集上拟合了许多不同的算法,并且某些算法已使用不同的配置多次进行评估。您可能遇到数十或数百个不同的问题模型。为什么不使用所有这些模型,而不是从该组中选择最好的模型呢?

这就是所谓“超级学习器”集成算法背后的直觉。

超级学习器算法首先预定义数据的 K 折划分,然后在相同的数据划分上评估所有不同的算法和算法配置。然后保留所有折外预测,并用于训练一个算法,该算法学习如何最佳地组合这些预测。

算法可能在使用的协变量子集、基函数、损失函数、搜索算法以及调优参数范围等方面有所不同。

《预测中的超级学习器》,2010。

此模型的结果应不低于 K 折交叉验证期间评估的最佳性能模型,并且有可能优于任何单个模型。

超级学习器算法由伯克利的Mark van der LaanEric PolleyAlan Hubbard在他们2007年题为“《超级学习器》”的论文中提出。该论文发表在生物学期刊上,可能未被更广泛的机器学习社区所知。

超级学习器技术是“堆叠泛化”(简称“堆叠”)这种通用方法的一个例子,在应用机器学习中被称为混合,因为通常使用线性模型作为元模型。

超级学习器与神经网络上下文中引入的堆叠算法相关……

《预测中的超级学习器》,2010。

有关堆叠的更多信息,请参阅以下帖子

我们可以将“超级学习器”视为专门针对 K 折交叉验证的一种特定堆叠配置。

我有时会将这种混合集成称为交叉验证集成。

该过程可总结如下:

  • 1. 选择训练数据集的 K 折划分。
  • 2. 选择 m 个基本模型或模型配置。
  • 3. 对于每个基本模型:
    • a. 使用 K 折交叉验证进行评估。
    • b. 存储所有折外预测。
    • c. 在完整训练数据集上拟合模型并存储。
  • 4. 根据折外预测拟合一个元模型。
  • 5. 在保留数据集上评估模型或使用模型进行预测。

下面的图片取自原始论文,总结了此数据流。

Diagram Showing the Data Flow of the Super Learner Algorithm

超级学习器算法的数据流图
摘自《超级学习器》。

让我们仔细看看您可能在此过程中遇到的一些常见问题。

问:元模型的输入和输出是什么?

元模型将基本模型的预测作为输入,并预测训练数据集的目标作为输出。

  • 输入:来自基本模型的预测。
  • 输出:训练数据集的预测。

例如,如果我们有 50 个基本模型,那么一个输入样本将是一个包含 50 个值的向量,向量中的每个值代表一个基本模型对训练数据集中一个样本的预测。

如果训练数据集中有 1000 个示例(行)和 50 个模型,那么元模型的输入数据将是 1000 行和 50 列。

问:元模型不会过度拟合训练数据吗?

可能不会。

这正是超级学习器,以及通常堆叠泛化过程的诀窍。

元模型的输入是折外(样本外)预测。总体而言,一个模型的折外预测代表了该模型在对训练期间未见过的数据进行预测时的技能或能力。

通过在其他模型的样本外预测上训练元模型,元模型学习如何纠正每个模型的样本外预测,并学习如何最佳地组合来自多个模型的样本外预测;实际上,它同时完成了这两项任务。

重要的是,为了了解元模型的真实能力,必须在新的样本外数据上对其进行评估。也就是说,未用于训练基本模型的数据。

问:这适用于回归和分类吗?

是的,论文中描述了它用于回归(预测数值)。

它也同样适用于分类(预测类别标签),尽管最好预测概率,以便在组合预测时为元模型提供更多的粒度。

问:为什么我们在整个训练数据集上拟合每个基本模型?

每个基本模型都在整个训练数据集上进行拟合,以便该模型稍后可以用于对训练期间未见过的新示例进行预测。

在超级学习器需要预测之前,严格来说不需要此步骤。

问:我们如何进行预测?

为了对新样本(数据行)进行预测,首先将数据行作为输入提供给每个基本模型,以从每个模型生成预测。

然后将来自基本模型的预测连接成一个向量,并作为输入提供给元模型。元模型然后对数据行进行最终预测。

我们可以将此过程总结如下:

  • 1. 取一个训练期间模型未见过的样本。
  • 2. 对于每个基本模型:
    • a. 根据样本进行预测。
    • b. 存储预测。
  • 3. 将子模型的预测连接成一个单一向量。
  • 4. 将向量作为输入提供给元模型,以进行最终预测。

现在我们已经熟悉了超级学习器算法,让我们看一个实际的例子。

想开始学习集成学习吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

使用 scikit-learn 手动开发超级学习器

超级学习器算法相对容易在 scikit-learn Python 机器学习库之上实现。

在本节中,我们将开发一个用于回归和分类的超级学习器示例,您可以将其应用于您自己的问题。

用于回归的超级学习器

我们将使用 make_regression() 测试问题,生成 1,000 个示例(行),包含 100 个特征(列)。这是一个简单的回归问题,输入和输出之间存在线性关系,并添加了噪声。

我们将划分数据,其中 50% 用于训练模型,50% 留作评估最终的超级模型和基本模型。

接下来,我们将定义一系列不同的回归模型。

在这种情况下,我们将使用九种不同的算法,配置适中。您可以使用任何您喜欢的模型或模型配置。

下面的 get_models() 函数定义了所有模型并将其作为列表返回。

接下来,我们将使用 K 折交叉验证来生成折外预测,这些预测将用作训练元模型或“超级学习器”的数据集。

这包括首先将数据划分为 K 个折;我们将使用 10 个折。对于每个折,我们将在划分的训练部分上拟合模型,并在划分的测试部分上进行折外预测。对每个模型重复此操作,并存储所有折外预测。

每个折外预测将是元模型输入的一列。我们将从每个算法中收集一列数据,用于数据的一个折叠,水平堆叠行。然后对于我们收集的所有列组,我们将这些行垂直堆叠成一个长数据集,包含 500 行和 9 列。

下面的 get_out_of_fold_predictions() 函数针对给定的测试数据集和模型列表执行此操作;它将返回训练元模型所需的输入和输出数据集。

然后我们可以调用该函数来获取模型,并调用该函数来准备元模型数据集。

接下来,我们可以在整个训练数据集上拟合所有基本模型。

然后,我们可以在准备好的数据集上拟合元模型。

在这种情况下,我们将使用线性回归模型作为元模型,就像原始论文中使用的那样。

接下来,我们可以在保留数据集上评估基本模型。

最后,使用超级学习器(基本模型和元模型)对保留数据集进行预测,并评估该方法的性能。

下面的 super_learner_predictions() 函数将使用元模型对新数据进行预测。

我们可以调用此函数并评估结果。

综合起来,下面列出了使用 scikit-learn 模型进行回归的超级学习器算法的完整示例。

运行该示例首先报告准备好的数据集的形状,然后报告元模型数据集的形状。

接下来,报告每个基本模型在保留数据集上的性能,最后报告超级学习器在保留数据集上的性能。

注意:鉴于算法或评估过程的随机性,或数值精度差异,您的结果可能有所不同。请考虑多次运行示例并比较平均结果。

在这种情况下,我们可以看到线性模型在该数据集上表现良好,而非线性算法则表现不佳。

我们还可以看到超级学习器优于所有基本模型。

您可以想象在这个示例中插入各种不同的模型,包括 XGBoost 和 Keras 深度学习模型。

现在我们已经了解了如何开发用于回归的超级学习器,接下来我们来看一个用于分类的示例。

用于分类的超级学习器

用于分类的超级学习器算法基本相同。

元学习器的输入可以是类别标签或类别概率,后者可能更有用,因为其捕获了预测中增加的粒度或不确定性。

在这个问题中,我们将使用make_blobs()测试分类问题,并使用1000个样本,包含100个输入变量和两个类别标签。

接下来,我们可以更改 get_models() 函数来定义一套线性分类算法和非线性分类算法。

接下来,我们可以更改 get_out_of_fold_predictions() 函数,通过调用 predict_proba() 函数来预测概率。

fit_meta_model() 函数中,将使用逻辑回归算法而不是线性回归算法作为元算法。

并将使用分类准确率来报告模型性能。

下面列出了使用 scikit-learn 模型进行分类的超级学习器算法的完整示例。

和以前一样,首先报告数据集和准备好的元数据集的形状,然后是基本模型在保留数据集上的性能,最后是超级模型本身在保留数据集上的性能。

注意:鉴于算法或评估过程的随机性,或数值精度差异,您的结果可能有所不同。请考虑多次运行示例并比较平均结果。

在这种情况下,我们可以看到超级学习器的性能略好于基本学习器算法。

使用 ML-Ensemble 库的超级学习器

手动实现超级学习器是一个很好的练习,但并不理想。

我们可能会在实现中引入错误,并且所列出的示例没有利用多核来加快执行速度。

幸运的是,Sebastian Flennerhag在他的ML-Ensemble (mlens) Python 库中提供了超级学习器算法和其他集成算法的高效且经过测试的实现。它专门设计用于 scikit-learn 模型。

首先,必须安装该库,可以通过 pip 实现,如下所示

接下来,可以定义一个 SuperLearner 类,通过调用 add() 函数添加模型,通过调用 add_meta() 函数添加元学习器,然后像使用任何其他 scikit-learn 模型一样使用该模型。

我们可以在上一节的回归和分类问题上使用这个类。

使用 ML-Ensemble 库的回归超级学习器

首先,我们可以定义一个函数来计算我们问题的 RMSE,超级学习器可以使用它来评估基本模型。

接下来,我们可以配置 SuperLearner,使其采用 10 折交叉验证、我们的评估函数,并在准备折外预测以用作元模型的输入时使用整个训练数据集。

下面的 get_super_learner() 函数实现了这一点。

然后我们可以在训练数据集上拟合模型。

一旦拟合完成,我们可以通过访问模型的“data”属性,获得一份关于每个基本模型在使用 K 折交叉验证的训练数据集上性能的良好报告。

就是这样。

综合起来,下面列出了使用 mlens 库进行回归的超级学习器评估的完整示例。

运行该示例首先报告每个基本模型的 RMSE(得分-m),然后报告超级学习器本身的 RMSE。

由于后端使用了多线程,允许使用机器的所有核心,因此拟合和评估速度非常快。

注意:鉴于算法或评估过程的随机性,或数值精度差异,您的结果可能有所不同。请考虑多次运行示例并比较平均结果。

在这种情况下,我们可以看到超级学习器表现良好。

请注意,我们不能将表格中的基本学习器得分与超级学习器进行比较,因为基本学习器仅在训练数据集上进行评估,而不在保留数据集上进行评估。

使用 ML-Ensemble 库进行分类的超级学习器

ML-Ensemble 也非常容易用于分类问题,遵循相同的通用模式。

在这种情况下,我们将使用我们的分类器模型列表和逻辑回归模型作为元模型。

下面列出了使用 mlens 库为测试分类问题拟合和评估超级学习器模型的完整示例。

运行该示例总结了数据集的形状、基本模型的性能,最后是超级学习器在保留数据集上的性能。

注意:鉴于算法或评估过程的随机性,或数值精度差异,您的结果可能有所不同。请考虑多次运行示例并比较平均结果。

同样,我们可以看到超级学习器在这个测试问题上表现良好,更重要的是,与上一节中的手动示例相比,它的拟合和评估速度非常快。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

教程

书籍

论文

R 软件

Python 软件

总结

在本教程中,您学习了超级学习器集成机器学习算法。

具体来说,你学到了:

  • 超级学习器是利用 K 折交叉验证中的折外预测进行堆叠泛化的应用。
  • 超级学习器集成算法在 Python 中使用 scikit-learn 模型实现起来非常简单。
  • ML-Ensemble (mlens) 库提供了一个便捷的实现,只需几行代码即可拟合和使用超级学习器。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

掌握现代集成学习!

Ensemble Learning Algorithms With Python

在几分钟内改进您的预测

...只需几行python代码

在我的新电子书中探索如何实现
使用 Python 实现集成学习算法

它提供**自学教程**,并附有关于以下内容的**完整工作代码**:
堆叠、投票、提升、装袋、混合、超级学习器等等……

将现代集成学习技术带入
您的机器学习项目


查看内容

《如何在 Python 中开发超级学习器集成模型》的 159 条回复

  1. Mark Littlewood 2019年12月11日 晚上10:46 #

    Jason,这篇文章写得太棒了,对我来说清晰且非常有用。SuperLearner 在导入时是否像你的示例那样进行了 50% 的划分?

    • Jason Brownlee 2019年12月12日 早上6:22 #

      谢谢。

      是的,我在最终示例中将数据分成 50/50。

  2. Pawel 2019年12月12日 凌晨12:49 #

    非常感谢,Jason!

    您能解释一下如何使用已经训练好的超级学习器模型对单行进行预测吗?

    祝您一切顺利!

    • Jason Brownlee 2019年12月12日 早上6:28 #

      如果您使用的是自定义代码,请参阅 super_learner_predictions() 函数。

      如果您正在使用库,请调用 ensemble.predict(…)

  3. Mark Littlewood 2019年12月12日 早上4:11 #

    抱歉,我看到设置了 0.5,忽略上一个问题

  4. Markus 2019年12月12日 早上6:43 #

    有趣的是,无论我运行第一个完整示例多少次,线性回归的 RMSE 都小于超级学习器!

    以下是一个样本输出

    训练集 (500, 100) (500,) 测试集 (500, 100) (500,)
    元模型 (500, 9) (500,)
    线性回归: RMSE 0.562
    ElasticNet: RMSE 67.114
    SVR: RMSE 176.879
    决策树回归器: RMSE 162.378
    K 近邻回归器: RMSE 156.142
    AdaBoost回归器: RMSE 103.183
    Bagging回归器: RMSE 118.581
    随机森林回归器: RMSE 121.637
    ExtraTrees回归器: RMSE 109.636
    超级学习器: RMSE 0.571

    这是另一个
    训练集 (500, 100) (500,) 测试集 (500, 100) (500,)
    元模型 (500, 9) (500,)
    线性回归: RMSE 0.509
    ElasticNet: RMSE 64.889
    SVR: RMSE 173.591
    决策树回归器: RMSE 169.789
    K 近邻回归器: RMSE 155.547
    AdaBoost回归器: RMSE 96.808
    Bagging回归器: RMSE 119.754
    随机森林回归器: RMSE 112.420
    ExtraTrees回归器: RMSE 110.969
    超级学习器: RMSE 0.519

    这是第三个
    训练集 (500, 100) (500,) 测试集 (500, 100) (500,)
    元模型 (500, 9) (500,)
    线性回归: RMSE 0.540
    ElasticNet: RMSE 51.105
    SVR: RMSE 137.585
    决策树回归器: RMSE 126.397
    K 近邻回归器: RMSE 122.300
    AdaBoost回归器: RMSE 73.785
    Bagging回归器: RMSE 79.778
    随机森林回归器: RMSE 81.047
    ExtraTrees回归器: RMSE 74.907
    超级学习器: RMSE 0.545

    谢谢!

    • Pawel 2019年12月12日 早上6:56 #

      分类也遇到了同样的问题。
      XGB 几乎总是比超级学习器好????

    • Jason Brownlee 2019年12月12日 下午1:40 #

      干得好!

      是的,所选任务可能过于简单,导致集成算法表现不佳。

  5. Mark Littlewood 2019年12月12日 早上10:01 #

    不平衡数据集对个体学习算法的选择以及超级学习器提升能力有何影响?

    • Jason Brownlee 2019年12月12日 下午1:42 #

      可能会预测校准后的概率,并使用模型来最佳地组合这些概率。

      这是我第一时间想到的。

      另外,使用关注重要指标的度量,例如 f-measure 或 g-mean 等。

  6. Bartosz 2019年12月13日 早上6:49 #

    你好,

    我是一个完全的机器学习编程新手。但是,我了解建模的概念。
    您能否在代码中列出您导入的库,因为我对超级学习器非常感兴趣,并且我想使用 Spyder IDE 更好地理解这里发生的一切。

  7. Carlos 2019年12月13日 早上9:26 #

    谢谢 Jason,

    两个问题

    + 您是否尝试过 H2O 的方法在相同的分类示例中可能产生的性能:http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/stacked-ensembles.html

    + 您的任何书籍是否已经涵盖了这个问题?

    另外,考虑一下这个新的 Python 库 AutoViML 的性能也可能很有价值:https://towardsdatascience.com/why-automl-is-an-essential-new-tool-for-data-scientists-2d9ab4e25e46

    非常感谢您分享的一切!
    卡洛斯。

    • Jason Brownlee 2019年12月13日 下午1:41 #

      我还没有使用 H2O,抱歉。

      我对 AutoViML 不熟悉。谢谢你的分享。

    • Ram 2020年1月9日 早上8:58 #

      卡洛斯
      您可能想使用相同的数据集,尝试 H2O AutoML 和 Auto_ViML,并比较它们的性能与超级学习器。您可能想在这里回顾一下结果。

  8. Justin Mackie 2019年12月13日 下午1:26 #

    一如既往,解释得非常清晰!谢谢您!

    读者应注意,StackingClassifier 和 Regressor 是 scikit-learn 0.22 版本(2019年12月3日发布)中的新功能。分类器的链接如下。

    https://scikit-learn.cn/stable/modules/generated/sklearn.ensemble.StackingClassifier.html

    mlens 看起来已经存在多年,并且在速度和内存方面进行了优化。它具有一些高级模型选择功能。

    mlens: https://github.com/flennerhag/mlens

    • Jason Brownlee 2019年12月13日 下午1:45 #

      谢谢你,贾斯汀!

      是的,我希望写一篇关于新堆叠 API 的教程。

  9. Nel 2019年12月14日 早上6:17 #

    又一篇好文章,谢谢杰森!
    您能解释一下这个模型和堆叠集成模型(https://machinelearning.org.cn/stacking-ensemble-for-deep-learning-neural-networks/)之间的主要区别吗?我的意思是,除了它们不同的子模型和元模型架构之外。

    谢谢

    • Jason Brownlee 2019年12月14日 早上6:28 #

      谢谢!

      没什么区别。事实上,超级学习器就是一种堆叠。

      我在帖子中提到了这一点。

  10. venkatesh siddamsetti 2019年12月14日 晚上6:47 #

    好文章,杰森。

    我只是集成学习的初学者。在上面的例子(分类)中,您是否将基本模型的概率预测作为训练数据输入到第二层的逻辑回归中?还是直接将基本模型的预测作为训练集?

    • Jason Brownlee 2019年12月15日 早上6:04 #

      谢谢!

      是的,第一层模型的预测作为输入馈送给第二层模型。

  11. Branda 2020年1月11日 早上9:13 #

    非常感谢您的贡献,

    我只想问一下,如何将一个非机器学习模型集成进来。这个模型对我的问题非常强大,我希望将其集成到 get_model() 部分。

    先谢谢您了。

    • Jason Brownlee 2020年1月12日 早上7:57 #

      一种方法是直接使用堆叠集成,只取您优秀模型的预测并将其与元模型结合。

      另一种方法可能是将您的强大模型封装在 scikit-learn 库的分类器类中。

      • Gamze 2020年1月21日 早上8:52 #

        非常感谢您的友好回复。

        请问您能给我一些建议,如何将我的模型封装到 scikit-learn 库的 Classifier 类中。

        这个问题我不太熟悉。

  12. Suraj 2020年1月16日 早上4:40 #

    亲爱的Jason
    非常感谢您的慷慨工作(博客)。

    我期待了解 SL 背后的数学原理。我的意思是超级学习背后的方法论。它是如何从回归数据集开始,然后进行交叉验证,最后得到最佳预测值的。如果可能的话,请您给我一些启发吗?

    此致!
    Suraj

    • Jason Brownlee 2020年1月16日 早上6:24 #

      不客气。

      请参阅“延伸阅读”部分获取论文和书籍。

  13. Chester Brook 2020年1月20日 晚上10:22 #

    关于如何在 Python 中开发超级学习器集成模型的信息非常棒。这对于开发机器学习算法非常实用和有益。感谢分享如此精彩的信息。

  14. Gabe 2020年2月1日 早上10:10 #

    你好 Jason,感谢您提供如此精彩的内容。过去几年您对我帮助很大。

    关于这个问题,predict_proba似乎无法与SuperLearner一起使用。无论如何,它似乎只返回离散值(我从字符串标签转换而来的整数)。

    我想我可能需要根据你的代码自行设计,但也许你可以指出我遗漏了什么?

    谢谢

    • Jason Brownlee 2020年2月2日 早上6:19 #

      有趣,谢谢你指出这一点。

      一个粗略而简单的方法是,将每个模型对每个类别的概率分数求和,然后将这些值归一化,以得到一个类似概率的分数。

      一个更好的方法是系统地结合这些概率,也许可以深入研究 sklearn 的代码,看看在调用 predict_proba() 时,堆叠或投票集成是如何实现这一点的。

  15. Onkar Kakade 2020年2月28日 早上8:24 #

    你好 Jason,这提供了非常有用的信息。
    谢谢分享。
    对于二分类,我想将人工神经网络作为基础模型之一,同时结合 Catboost、LASSO 和随机森林分类器。你能在这方面帮助我吗?
    谢谢你

    • Jason Brownlee 2020年2月28日 下午1:25 #

      是的,你可以直接将 ML-Ensemble 库与 sklearn 模型一起使用。

      我无法为你编写代码。请以文章中的示例作为起点。

  16. David 2020年3月1日 早上9:43 #

    你好 Jason,我有一个关于分类集成方法的问题。我如何将其应用于多分类?对于元模型,我们可以选择我们偏好的分类器吗?谢谢。

  17. Gamze 2020年3月4日 早上8:55 #

    你好,

    是否可以将RBFNN添加到Super Learner中?

    谢谢你

  18. Esther 2020年3月7日 下午1:18 #

    Jason,非常感谢!我正尝试将自己的数据集整合到这里。我有1,875行(包括标题)和19列(其中18列是实际特征)。我正在尝试像这样设置X和y

    # 创建输入和输出
    X = dataframe.iloc[0:1874]
    Y = dataframe.iloc[:,0:18]

    但我一直收到这个错误

    ValueError: 找到输入变量的样本数量不一致:[1874, 1875]

    如果您能帮助我(或者此评论区中的其他人能帮助我),我将不胜感激。

  19. Esther 2020年3月7日 下午2:51 #

    当我终于修复了那个错误时,我得到了这个错误

    KeyError: “None of [Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\n …\n 926, 927, 928, 929, 930, 931, 933, 934, 935, 936],\n dtype=’int64′, length=843)] are in the [columns]”

  20. Esther 2020年3月7日 下午4:27 #

    实际上,我的朋友帮我解决了这个问题;她说这样做:

    # 创建输入和输出
    X = dataframe.iloc[0:1875].values #这一行从 0:1874 改为 0:1875,并添加了 .VALUES <–她在这里帮了我。
    y = dataframe.iloc[:,-1].values # 这一行做了修改,添加了 .VALUES <–她在这里帮了我。

    现在一切都正常了! 😀

  21. Gamze 2020年3月29日 下午1:46 #

    您认为对候选学习器进行超参数调整是合乎逻辑的吗?

    非常感谢!

    • Jason Brownlee 2020年3月30日 早上5:31 #

      抱歉,我不太明白你的意思,请详细说明一下?

  22. Gamze 2020年3月31日 早上8:22 #

    我想在将每个基础模型用于超级学习器之前,对它们进行超参数调优。我想问的是,在超级学习器模型中,使用最佳配置的超参数值而不是每个基础模型的默认参数是否合理?

    • Jason Brownlee 2020年3月31日 早上8:29 #

      好主意。

      通常,在集成模型中,使用“足够好”的模型比高度优化(脆弱)的模型效果更好。至少一般来说是这样。

  23. Gamze 2020年3月31日 早上8:32 #

    非常感谢您的巨大贡献!

  24. Anton Chigurh 2020年4月6日 晚上7:52 #

    从超级学习器中,我如何提取分配给基础模型的权重?原始论文和R包能够说明“超级学习器是20%的ElasticNet和80%的线性回归的组合”,例如。如何从Python实现中获取这些组合权重,即您的fit_meta_model函数。我不认为它们是fit_meta_model的回归系数,因为有些是负数且不和为1。谢谢

    • Jason Brownlee 2020年4月7日 早上5:44 #

      不确定,抱歉。你可能需要深入研究 API/代码。

      • Paul 2020年4月7日 晚上10:02 #

        R包中的超级学习器使用NNLS(非负最小二乘法)来估计超级学习器的回归系数,并确保系数和为1。而这里的Python实现则允许系数为负且不和为1。

        查阅原始论文,他们也表示超级学习器通过使OLS系数为正且和为1来组合基础学习器,以便它们代表分配给各个基础学习器的权重(Polley和van der Laan,2010年“预测中的超级学习器”,第16页;van der Laan等人,2008年“超级学习器”,第7页)。

        如何在 Python 中实现 NNLS?使用 scikit-learn 的 Lasso 并设置 positive=True 常常会出错,因为它专为坐标下降构建,而 scipy.optimize.nnls 没有封装到 scikit-learn 中,导致使用不便。

        • Jason Brownlee 2020年4月8日 早上7:52 #

          好问题,我没有现成的解决方案。你可能需要尝试一些方法。

  25. Jens 2020年4月15日 早上3:03 #

    嗨,Jason,

    尝试将超级学习器应用于自己的数据进行分类,但显然我遗漏了一个细节。数据存储在csv文件中,当我尝试将数据加载与名为“# create the inputs and outputs”的部分关联时,我发现算法没有集成数据。我原以为使用例如“data = pd.read_csv(path + file)”然后定义X = data[‘Column’]和y = data[‘target’]会与超级学习器进行分类。我做错了什么?谢谢,Jens

    • Jason Brownlee 2020年4月15日 早上8:02 #

      也许可以确认数据是否正确加载和拆分——检查操作做了什么以及它们是否是数字的 numpy 数组。

      • Jens 2020年4月15日 下午3:45 #

        我确实检查了好几次,但我似乎无法发现错误,见下文。我的数据实际上有1,000个条目,对应于n_samples=1000。但是当我尝试再次检查,例如将n_samples=10000或n_samples=2000时,我不会期望算法能够正常运行。然而,它确实运行了,这告诉我我没有正确地将算法与我的数据关联起来。谢谢。

        # 创建输入和输出

        data = pd.read_csv(path + file) # 数据条目 = 1,000

        X = data[‘Column’]
        y = data[‘target’]

        X, y = make_blobs(n_samples=1000, centers=2, n_features=100, cluster_std=20)
        # 划分
        X, X_val, y, y_val = train_test_split(X, y, test_size=0.1)
        print(‘训练集’, X.shape, y.shape, ‘测试集’, X_val.shape, y_val.shape)

        • Jason Brownlee 2020年4月16日 早上5:56 #

          很抱歉听到这个消息,也许你可以尝试将你的代码和错误发布到 stackoverflow.com

  26. Todd 2020年4月16日 早上4:43 #

    代码表明线性回归每次都胜出,因为所示示例中用于生成数据的过程本身就是一个线性模型(sklearn 的 make_regression 函数)。

    当数据 X 和 y 更改为 randn() 数据生成过程或时间序列时,基础模型的 R2 度量都变为负值,并且线性回归不再在集成中获胜。由于数据的变化,集成开始更多地与其他基础模型混合。

    当数据生成过程改变为OLS显然无法完全捕获的东西时,集成开始发挥作用,这如何解释?如果底层真实模型(数据)不再符合OLS,那么R2是否就不相关了?除了这个OLS示例之外,一些其他数据的示例会有所帮助。

    • Jason Brownlee 2020年4月16日 早上6:07 #

      好问题。

      我猜想问题的挑战性迫使子模型多样化,而混合允许技能提升超越子模型——例如,这就是我们最初想要使用集成的原因。

  27. Paul 2020年4月23日 晚上7:38 #

    为什么交叉验证要进行两次?第一次在 get_out_of_fold_predictions() 函数中,第二次在 super_learner_predictions() 中。这两个函数都从基础模型生成自己的 meta_X 矩阵。meta_X 不应该只由第一个函数生成一次,而第二个函数(超级学习器)只是对第一个 meta_X 的列进行加权吗?

    • Jason Brownlee 2020年4月24日 早上5:40 #

      一个用于准备子模型,一个用于评估整个方法。

      理想情况下,应该使用单独的验证数据集来评估最终模型。

  28. Grzegorz Kępisty 2020年4月28日 下午4:11 #

    早上好!

    感谢您的文章和有用的示例!问题:如果超级学习器集成“更有可能表现更好”,它是否应该始终作为机器学习项目管道的一部分进行检查?或者我们是否只应在特定条件下对其进行测试?如果目标只是提高项目的 KPI,那么我想超级学习器是不可忽视的。

    此致!

  29. Adriana 2020年6月28日 早上10:48 #

    嗨,Jason,

    是否可以将NN添加到回归的Super Learner中?您有示例吗?

    谢谢你。

    • Jason Brownlee 2020年6月29日 早上6:27 #

      我看不出为什么不。

      抱歉,我没有这方面的例子。

  30. Xiaobang Liu 2020年8月29日 下午6:38 #

    嗨 Jason
    感谢您的文章和有用的示例!
    我已成功运行上述代码,并使用了我自己的数据。
    我有一个问题,输出 score-m score-s ft-m ft-s pt-m pt-s 是什么意思?

    • Jason Brownlee 2020年8月30日 早上6:35 #

      干得好!

      m 和 s 应该是均值和标准差,至于其余的,我目前不知道。也许文档提供了想法。

  31. Bahar 2020年9月1日 晚上8:23 #

    您好,感谢您提供如此有用的教程。我有一个关于回归超级学习器模型的示例问题,我有一个多输入多输出 MIMO 模型,我将使用
    modelchain = LinearSVR()
    wrapperSVRchain = RegressorChain(modelchain)
    我可以使用 RegressorChain(LinearSVR()) 进行这种重新组装吗?

    即使我只是尝试使用我的数据(X 和 Y 基于 PCA 和归一化)来重用您的代码
    而不是
    # 创建输入和输出
    X, y = make_regression(n_samples=1000, n_features=100, noise=0.5)
    # 划分
    X, X_val, y, y_val = train_test_split(X, y, test_size=0.50)

    我使用
    X = XPCA
    X_val = X_testPCA
    y = YPCA
    y_val = Y_testPCA

    并且只使用 models.append(RandomForestRegressor(n_estimators=5))
    # 创建基本模型列表
    def get_models()
    models = list()
    # models.append(LinearRegression())
    # models.append(ElasticNet())
    # models.append(SVR(gamma=’scale’))
    # models.append(DecisionTreeRegressor())
    # models.append(KNeighborsRegressor())
    # models.append(AdaBoostRegressor())
    # models.append(BaggingRegressor(n_estimators=10))
    models.append(RandomForestRegressor(n_estimators=5))
    # models.append(ExtraTreesRegressor(n_estimators=10))
    return models

    我总是在“ensemble.fit(X, y)”行收到以下错误
    训练集 (11, 6) (11, 6) 测试集 (3, 6) (3, 6)
    ValueError: 无法将形状为 (2,6) 的输入数组广播到形状为 (2,1)

    它使用您创建的数据可以工作,但使用我的 MIMO 数据则不行。
    您能告诉我您的看法吗?
    提前感谢

  32. Bahar 2020年9月1日 晚上8:53 #

    我只是用以下代码替换了创建数据代码,使其成为 MIMO(多输入多输出)
    # 创建数据集
    X, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1, noise=0.5)
    并注释掉
    # models.append(LinearRegression())
    # models.append(ElasticNet())
    # models.append(SVR(gamma=’scale’))

    然后在 ensemble.fit(X, y) 行中给我这个错误
    ValueError: 输入形状错误 (500, 2)

    并进行了以下更改
    # 创建基本模型列表
    def get_models()
    models = list()
    models.append(LinearRegression())
    # models.append(ElasticNet())
    # models.append(SVR(gamma=’scale’))
    models.append(DecisionTreeRegressor())
    # models.append(KNeighborsRegressor())
    # models.append(AdaBoostRegressor())
    # models.append(BaggingRegressor(n_estimators=10))
    # models.append(RandomForestRegressor(n_estimators=10))
    # models.append(ExtraTreesRegressor(n_estimators=10))
    return models
    我又在 ensemble.fit(X, y) 行中遇到这个错误
    ValueError: 无法将形状为 (50,2) 的输入数组广播到形状为 (50,1)

    您能告诉我您的想法吗?

    提前感谢

  33. Mehtap 2020年11月11日 早上11:31 #

    亲爱的Jason

    感谢您的分享。

    我读了很多关于超级学习器的论文。我还研究了你的博客,并阅读了“我们为什么要在整个训练数据集上拟合每个基础模型?”这个问题的答案。

    但是,我无法理解 SL 图中的第 5 步。

    我们如何结合来自第 0 步和第 1-4 步的预测?第 0 步只包含训练。

    第0步的预测是超级学习器的一部分,还是我们只用于评估目的?

    提前感谢,

    诚挚的问候,

    梅塔普

    • Jason Brownlee 2020年11月11日 下午1:22 #

      该模型由许多子模型组成。子模型的预测被结合起来,例如通过平均或另一个模型。

      具体哪一部分令人困惑?

      • Mehtap 2020年12月9日 下午3:07 #

        简单地说,我不理解第0步的目的和第5步中的评估过程。

        • Mehtap 2020年12月9日 下午4:44 #

          这些步骤(第0步和第5步)在回归示例的Python代码中是什么?

          • Jason Brownlee 2020年12月10日 早上6:23 #

            在手动示例中,第 95 行在所有数据上拟合基础模型(第 0 步),第 101 行使用模型和元模型对新数据进行预测(第 5 步)。

        • Jason Brownlee 2020年12月10日 早上6:20 #

          好问题。

          我们想要在所有数据上训练的模型(步骤 0)。

          交叉验证步骤会找出如何对模型进行加权(步骤 1-4)。

          然后我们使用训练好的模型和我们学到的权重对新数据进行预测(步骤 5)

  34. Mitesh tank 2020年12月27日 早上2:23 #

    你好,先生,

    我将超级学习器用于我的项目,但它没有给我预期的结果。相反,其他模型给我的结果比超级学习器好。

  35. Mark Andrews 2021年1月7日 早上8:42 #

    嗨,Jason,

    这是一篇很棒的文章!它简洁地击中了 SuperLearner 的重要方面。

    来自R世界使用原始SuperLearner R包,我没有看到这个python实现如何执行嵌套交叉验证(不仅仅是k折)来评估估计器性能。您能阐明一个类似于R包中CV.superlearner的函数,该函数同时执行内部折叠交叉验证和外部折叠交叉验证吗?

    谢谢你,
    Mark

  36. Balaji Mohan 2021年1月29日 早上6:01 #

    这篇关于 Python 中 SuperLearner 实现的文章很棒。我有一个关于保存模型以备后用的问题。我尝试用简单的 joblib 保存模型,但当我再次加载模型时,它会给我一个错误。
    你能解释一下如何保存模型并在以后使用吗?

  37. Gamze 2021年1月30日 晚上8:50 #

    亲爱的 Jason,

    非常感谢分享?

    你认为机器学习算法的基于权重的组合是启发式的吗?

    提前感谢。

    • Jason Brownlee 2021年1月31日 早上5:33 #

      不完全是。也许吧。你到底是什么意思?

      • Gamze 2021年1月31日 下午5:16 #

        非常感谢您的回复,

        我只是想知道 SL 是否以最佳方式结合了候选学习器。

  38. gui mac 2021年2月12日 早上7:38 #

    嗨,Jason。首先,感谢您的网站提供的出色服务。

    问题:您编写的这个ML-ENS代码(用于分类)是否会自动将元学习器应用于预测*概率*而不是预测的类成员资格?

    谢谢!

    • Jason Brownlee 2021年2月12日 早上8:08 #

      不客气!

      我没有创建 ml-ens 库,我只是展示如何使用它。

      是的,我相信它内部使用0级模型的软投票。

  39. soheilre 2021年3月8日 晚上10:36 #

    嗨,Jason。首先,感谢您的网站提供的出色服务。

    问题:超级学习器算法可以用于多分类吗?

    我的目标有4个类别。

    谢谢。

    • Jason Brownlee 2021年3月9日 早上5:20 #

      不客气。

      是的,超级学习器可以用于多类分类。

  40. Reza 2021年3月25日 早上6:04 #

    嗨,Jason,

    非常感谢这篇精彩的文章和您的优秀网站。

    您能否详细说明如何使用输入来开发元学习器?

    例如,如果元模型的输入数据是一个 1000 x 50 矩阵(如图 3 所示),我们如何实际使用这个输入来创建元学习器?我们总是使用线性回归来组合模型吗?

    非常感谢!

    • Jason Brownlee 2021年3月26日 早上6:17 #

      不客气!

      您在子模型的预测结果上拟合一个模型——就像我们在教程中做的那样。

      这方面有什么具体问题吗?

  41. varsha 2021年5月1日 晚上9:34 #

    你好,您使用逻辑回归作为元模型,对于多类分类,我应该尝试哪个模型作为元模型?您有什么建议?
    谢谢

    • Jason Brownlee 2021年5月2日 早上5:32 #

      好问题。也许是多项式回归,也许是lda,也许是一个小型神经网络?

  42. Varsha 2021年5月5日 晚上8:59 #

    谢谢你。作为元模型,我尝试了逻辑回归处理多类数据集……它在召回率和准确率上仍然给出了更好的结果。逻辑回归作为元模型如何处理多类数据集呢?

    • Jason Brownlee 2021年5月6日 早上5:45 #

      逻辑回归可以以一对一 (OVO) 或一对多 (OVR) 的方式使用,或者可以将损失函数更改为多项式分布。

  43. Mutyala Sridevi 2021年8月19日 晚上10:36 #

    [MLENS] 后端:多线程
    训练集 (500, 100) (500,) 测试集 (500, 100) (500,)
    分数-m 分数-s ft-m ft-s pt-m pt-s
    第一层 Adaboost分类器 0.90 0.04 0.51 0.05 0.04 0.01
    第一层 Bagging分类器 0.83 0.06 0.21 0.01 0.01 0.00
    第一层 决策树分类器 0.68 0.07 0.03 0.00 0.00 0.00
    第一层 ExtraTrees分类器 0.80 0.05 0.09 0.01 0.00 0.00
    第一层 GaussianNB 0.96 0.04 0.01 0.00 0.00 0.00
    第一层 K近邻分类器 0.90 0.03 0.00 0.00 0.03 0.01
    第一层 逻辑回归 0.93 0.03 0.01 0.00 0.00 0.00
    第一层 随机森林分类器 0.81 0.06 0.09 0.03 0.00 0.00
    第一层 SVC 0.96 0.03 0.10 0.01 0.00 0.00

    超级学习器: 97.400

    您能解释一下最后结果中的这些术语——score-m score-s ft-m ft-s pt-m pt-s 吗?

    • Adrian Tam
      Adrian Tam 2021年8月20日 早上1:37 #

      它们是分数、拟合时间和预测时间的均值和标准差。

  44. Mehran 2021年8月23日 晚上11:33 #

    嗨 Jason
    在“什么是超级学习器?”一节中,这句话“然后保留所有折叠外的预测并用于训练一个学习如何最好地组合预测的模型。”在“一个”之后,肯定有什么词,比如“元学习器”之类的,现在被省略了!这是一个拼写错误!

    • Adrian Tam
      Adrian Tam 2021年8月24日 早上8:41 #

      谢谢。已修复。

  45. Danierl Otchere 2021年10月6日 晚上9:20 #

    你好 Jason,训练完超级学习器后,如何使用 pickle 或将其保存为 json 文件以供将来使用?

    • Adrian Tam
      Adrian Tam 2021年10月7日 早上3:51 #

      Pickle会奏效。

  46. mohammed 2021年11月10日 早上8:40 #

    你好,我正在使用mlens超级学习器,它有3层和元学习器,我想知道超级学习器的流程图或步骤。

    • Adrian Tam
      Adrian Tam 2021年11月14日 下午1:09 #

      难道你不认为这里的示例代码就足够了吗?

  47. Mohammed Saied 2021年11月24日 早上7:32 #

    我想知道步骤0有什么用?

    • Adrian Tam
      Adrian Tam 2021年11月24日 下午1:12 #

      用整个训练集训练学习器,不进行保留。这样,有了更多的数据,生成的学习器应该会更好、更强大。

  48. mohammed 2021年11月25日 早上5:27 #

    你的意思是这一步只是为了训练基础模型,而这一步与元学习器(超级学习器)之间没有关系吗?因为在流程图的第 5 步(通过结合第 0 步和第 1 到 4 步的预测来评估超级学习器)

    • Adrian Tam
      Adrian Tam 2021年11月25日 下午2:34 #

      步骤 1 到 4 是为了学习集成模型的权重,而步骤 0 是为了构建组件模型。您在步骤 1 到 4 中构建的模型不会用于最终的集成模型。

  49. mohammed 2021年11月25日 下午4:39 #

    那是否意味着基础模型仅用于预测折叠,并且预测用于训练元学习器?我们还在整个训练集上训练了基础模型,以评估它们与测试集,以比较超级学习器和基础模型之间的性能。但是在使用ML集成库的情况下,我们无法比较超级学习器和基础模型之间的性能,因为基础模型未在整个训练集上进行训练?

    • Adrian Tam
      Adrian Tam 2021年11月26日 早上2:11 #

      抱歉,我没明白你的问题。你能重述一下吗?

  50. mohamed 2021年11月26日 早上3:08 #

    我的意思是步骤0用于在完整训练集上训练基础模型,以在测试集上评估基础模型,而元学习器只在k折叠步骤中基于基础模型的预测进行训练。
    所以我们可以比较超级学习器和基础模型的性能。
    但是如果我们使用 ML 集成库,我们没有在完整的训练集上训练基础模型,我们只是使用 k-fold 训练基础模型,而超级学习器在完整的训练集上进行训练,所以我们无法比较基础模型和超级学习器的性能。

  51. mohamed 2021年11月28日 早上3:33 #

    我还想知道这句话的意思:“通过使用在 (2) 中拟合的学习器将新的测试集 T 映射到预测集 Z',然后使用在 (5) 中拟合的元学习器将 Z' 映射到 y',该集成模型可以用于预测。”

  52. Henrique 2021年12月6日 晚上11:21 #

    感谢您的文章!

    我相信由于超级学习器的结构,部分依赖图会连接预测与基础模型的输出,对吗?拥有像RF或SVM那样标准的PDP,将数据输入链接到最终模型的预测的想法是不可能的。

    • Adrian Tam
      Adrian Tam 2021年12月8日 早上7:50 #

      不确定。因为我认为 PDP 与模型无关?你总是可以创建一个 PDP 来查看某个特征如何影响结果。

  53. Eyob 2021年12月27日 晚上7:33 #

    在哪里调整代码,将混合模型如CNN-LSTM作为基础学习器,其中混合模型本身具有不同的超参数需要调整???

  54. Mohammed Saied 2022年1月10日 早上5:21 #

    我想知道当使用mlens库时,以下步骤是否正确
    1- 步骤0,我们在训练集上拟合基础学习器并保留它。
    2- 我们将训练集划分为k折(例如10折),并在10个k折上训练每个基础学习器,然后获取10个k折的所有预测,并将它们全部放入一个矩阵中,该矩阵的行数(即训练集的行数,例如如果训练集有100行,则矩阵的行数为100,列数为基础学习器的数量)
    3- 我们在矩阵中拟合(第二层)——如果使用多层——或者拟合(元学习器)——如果使用一层,该矩阵由行数和基础学习器数量组成的列构成。
    4- 在预测新数据时,即训练集中没有的数据,超级学习器调用步骤0的结果预测并进行预测。

    • James Carmichael 2022年1月10日 早上11:08 #

      你好 Mohammed…你概述的步骤是合理的。你实现这个算法了吗?让我知道它是如何工作的。

      • mohammed 2022年1月10日 下午4:34 #

        你好 James,我使用了mlens库,但我想知道如果我使用库中的超级学习器,这些步骤是否正确?
        但是我尝试了一下,如果你使用多层并改变基础学习器算法的参数,效果会很好,你会得到很高的准确率。

        • James Carmichael 2022年1月11日 早上8:42 #

          你好 Mohammed……你的方法实际上是合理的。

  55. mohammed 2022年1月16日 下午5:28 #

    我知道它在原始论文中,但我想知道它何时被使用。
    是在预测步骤还是交叉验证步骤中使用?

  56. mohammed 2022年1月17日 早上4:13 #

    为了更详细的解释,以下步骤摘自 ml ensemble 库引用的论文:
    1. 在整个数据集 X = {Xi : i =1,…,n} 上拟合 L 中的每个算法,以估计 ˆΨk(W),k= 1,…,K(n)。
    2. 根据 V 折交叉验证方案将数据集 X 分割为训练样本和验证样本:将有序的 n 个观测值分割为 V 个大小相等的小组,第 ν 组作为验证样本,其余组作为训练样本,ν =1,…,V。定义 T(ν)为第 ν 个训练数据分割,V(ν) 为对应的验证数据分割。T(ν)=X\V(ν),ν=1,…,V。
    3. 对于第 ν 折,在 T(ν) 上拟合 L 中的每个算法,并保存对相应验证数据的预测,ˆΨk,T(ν)(Wi), Xi ∈ V (ν)对于 ν =1,…,V。
    4. 将每个算法的预测堆叠在一起,创建一个 n × K 矩阵,Z =ˆΨk,T(ν)(WV(ν)),ν=1,…,V&k =1,…,K,其中我们使用 WV(ν) = (Wi : Xi ∈ V(ν)) 表示 V (ν)-验证样本的协变量向量。
    5. 提出一个由权重向量 α 索引的候选估计器的加权组合族:K m(z|α)= k=1 K αk ˆΨk,T(ν)(WV(ν)),αk ≥ 0 ∀k, k=1 αk =1。
    6. 确定在所有允许的 α 组合中,使候选估计器 K k=1 αk ˆΨk 的交叉验证风险最小化的 α:n ˆ α =argmin α i=1 (Yi −m(zi|α))2。
    7. 将 ˆα 与 ˆΨk(W),k=1,…,K 按照加权组合族 m(z|α) 进行组合,以创建最终的超级学习器拟合:K ˆ ΨSL(W)= k=1 ˆ αk ˆΨk(W)。
    因此,步骤5到7在ML集成库的伪代码中并不清楚。
    这个库是否不考虑算法的权重并使用所有算法?

  57. mohammed 2022年1月17日 早上8:00 #

    非常感谢 James,但我只是在谈论 ml 集成库,我想知道它是否使用了任何损失函数。

  58. Daniel 2022年1月18日 下午3:48 #

    你好 Jason,感谢你的教程。我可以使用它来完成我的工作吗?如果可以,我该如何引用你来为你署名?

    谢谢

    • James Carmichael 2022年1月20日 早上8:41 #

      你好 Daniel……非常欢迎!是的,但请理解我网站和书籍中的所有代码和材料仅用于教育目的。

      我对代码、它可能做什么或你如何使用它不承担任何责任。

      如果你在自己的项目中使用我的代码或材料,请注明来源,包括

      作者姓名,例如“Jason Brownlee”。
      教程或书籍的标题。
      网站名称,例如“Machine Learning Mastery”。
      教程或书籍的 URL。
      您访问或复制该代码的日期。
      例如

      Jason Brownlee, Python 中的机器学习算法, 机器学习精通, 可从 https://machinelearning.org.cn/machine-learning-with-python/ 获取, 访问日期:2018年4月15日。
      另外,如果您的作品是公开的,请联系我,我很乐意出于普遍兴趣看看它。

  59. Hosam Wajeeh 2022年3月25日 早上3:53 #

    堆叠和超级学习有什么区别?!它们是同一回事吗?!

  60. Kholood 2022年5月14日 早上4:35 #

    非常感谢您发布此教程,我可以将训练结果保存到 h5 文件中吗?还可以绘制元模型的学习曲线吗?

  61. sonnguyen129 2022年6月3日 下午12:54 #

    在本教程中,您说可以使用许多模型,除了 XGBoost 和 DNN。如果我想与 XGBoost 和 DNN 进行集成,我该怎么做?

  62. Emmanuel Akoto 2022年6月13日 下午1:07 #

    你好 James 先生,这种方法能处理多个输出(响应)吗?例如,我正在研究一些在一定限制内绘制的实验室实验性能曲线。这些曲线基本上分为四个象限。通过理论分析,第一个象限几乎可以获得完美的精度。我正在探索使用机器学习来预测其他三个象限,以第一个象限作为输入,实验室实验完整的性能曲线作为数据训练集。您能给我一些建议吗?

  63. salcc 2022年11月30日 早上9:40 #

    对于分类任务,如果输出类别的百分比不平衡,使用分层K折交叉验证(StratifiedKFold)会更好吗?

  64. Jake 2022年12月22日 下午3:31 #

    感谢 Jason 另一篇精彩的教程!

    在您的示例中,所有基础模型都在相同的特征集上进行训练,但是否有可能为在不同特征集上训练的基础模型(即使用在分类与数值编码数据上训练的模型)创建超级学习器算法?此外,超级学习器算法的概率校准将如何工作?我假设您可以用 sklearn 的 CalibratedClassifierCV 封装最终的超级学习器算法,但对于由在不同特征集上拟合的基础模型构建的超级学习器,这可能会变得复杂。

    再次感谢!

  65. Jake 2023年1月18日 早上8:51 #

    假设超级学习器集成中的每个基础模型都在不同的特征集上进行训练,并且可能在进行模型预测时使用不同的特征,那么如何评估整体超级学习器集成元模型的特征重要性?

  66. Shada 2023年10月12日 下午4:33 #

    你好,James,
    当我使用 mlens 运行 ensemble.fit(X,y) 时,为什么会出现“AttributeError: module 'numpy' has no attribute 'int'.”的错误?

  67. André Pimentel 2023年12月31日 下午12:47 #

    亲爱的 Janson,
    我正在尝试在 google colab (python 3.10) 上运行您的 Superlearner 教程,但在 Superlearner 导入时遇到错误 (from mlens.ensemble import SuperLearner)。错误是

    from collections import Sequence

    ImportError: 无法从 'collections' (/usr/lib/python3.10/collections/__init__.py) 导入名称 'Sequence'

    你知道如何解决这个问题吗?
    先谢谢您了。

  68. Andre Pimentel 2024年1月12日 早上6:53 #

    我如何使用 mlens 库通过超级学习器预测概率估计?

  69. Andre Pimentel 2024年1月12日 早上6:56 #

    我是说,我想预测 X 中的类别标签及其概率估计。

  70. Andre Pimentel 2024年1月12日 早上7:00 #

    我想预测 X 中的类别标签及其概率估计。我如何使用 mlens 库执行这些估计?

  71. Alex 2024年4月22日 早上9:19 #

    我通常看到回归作为元模型,但我想知道是否可以使用不同的算法。我在我的 SuperLearner 中尝试了其他算法,并且预测性能越来越好,直到我运行随机森林,它得到了 ROC AUC = 1。这很可能就是过拟合。我如何知道其他算法是否可能过拟合,以及如果 RF 过拟合,我如何证明它们的使用是合理的?

发表回复

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