如何在Python中开发AdaBoost集成模型

提升(Boosting)是一类集成机器学习算法,它涉及结合许多弱学习器的预测结果。

弱学习器是一个非常简单的模型,尽管它在数据集上具有一定的能力。在开发出实用算法之前,提升长期以来一直是一个理论概念,而 AdaBoost(自适应提升)算法是该思想的第一个成功方法。

AdaBoost 算法涉及使用非常短(一层)的决策树作为弱学习器,这些学习器按顺序添加到集成模型中。每个后续模型都试图纠正序列中前一个模型所做的预测。这是通过加权训练数据集来实现的,以便将更多关注点放在先前模型做出预测错误的训练样本上。

在本教程中,您将学习如何开发用于分类和回归的 AdaBoost 集成模型。

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

  • AdaBoost 集成模型是由按顺序添加到模型中的决策树创建的集成模型。
  • 如何使用 AdaBoost 集成模型进行分类和回归(使用 scikit-learn)。
  • 如何探索 AdaBoost 模型超参数对模型性能的影响。

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

让我们开始吧。

  • 2020 年 8 月更新:添加了网格搜索模型超参数的示例。
How to Develop an AdaBoost Ensemble in Python

如何在Python中开发AdaBoost集成模型
图片由 Ray in Manila 拍摄,保留部分权利。

教程概述

本教程分为四个部分;它们是

  1. AdaBoost 集成算法
  2. AdaBoost Scikit-Learn API
    1. 用于分类的 AdaBoost
    2. 用于回归的 AdaBoost
  3. AdaBoost 超参数
    1. 探索树的数量
    2. 探索弱学习器
    3. 探索学习率
    4. 探索替代算法
  4. 网格搜索 AdaBoost 超参数

AdaBoost 集成算法

提升(Boosting)是指一类机器学习集成算法,其中模型按顺序添加,并且序列中后面的模型纠正前面模型所做的预测。

AdaBoost,是“Adaptive Boosting”的缩写,是一种提升集成机器学习算法,也是最早成功的提升方法之一。

我们将该算法称为 AdaBoost,因为与以前的算法不同,它能自适应地调整弱假设的误差。

在线学习的决策理论泛化及其在 Boosting 中的应用,1996 年。

AdaBoost 结合了短一层决策树(称为决策树桩)的预测结果,尽管也可以使用其他算法。使用决策树桩算法是因为 AdaBoost 算法旨在利用许多弱模型,并通过添加额外的弱模型来纠正它们的预测。

训练算法包括从一个决策树开始,找到训练数据集中被错误分类的样本,并增加这些样本的权重。然后在相同数据上训练另一个树,但现在根据错误分类误差进行加权。重复此过程,直到添加所需数量的树。

如果训练数据点被错误分类,则该训练数据点的权重会增加(提升)。使用不再相等的权重构建第二个分类器。同样,错误分类的训练数据会增加其权重,并重复该过程。

多类 AdaBoost,2009 年。

该算法是为分类开发的,涉及结合集成模型中所有决策树所做的预测。也为回归问题开发了类似的方法,其中预测是使用决策树的平均值进行的。每个模型对集成预测的贡献是根据模型在训练数据集上的性能加权的。

……新算法无需预先了解弱假设的准确性。相反,它会自适应地调整这些准确性,并生成一个加权多数假设,其中每个弱假设的权重是其准确性的函数。

在线学习的决策理论泛化及其在 Boosting 中的应用,1996 年。

既然我们熟悉了 AdaBoost 算法,那么让我们看看如何在 Python 中拟合 AdaBoost 模型。

想开始学习集成学习吗?

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

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

AdaBoost Scikit-Learn API

AdaBoost 集成模型可以从头开始实现,但这对于初学者来说可能具有挑战性。

有关示例,请参阅教程

scikit-learn Python 机器学习库提供了用于机器学习的 AdaBoost 集成模型的实现。

它在库的现代版本中可用。

首先,通过运行以下脚本确认您正在使用该库的现代版本

运行脚本将打印您的 scikit-learn 版本。

您的版本应该相同或更高。如果不是,您必须升级您的 scikit-learn 库版本。

AdaBoost 通过 AdaBoostRegressorAdaBoostClassifier 类提供。

这两个模型的操作方式相同,并接受影响决策树创建方式的相同参数。

模型构建中使用了随机性。这意味着每次在相同数据上运行算法时,它都会生成一个略有不同的模型。

在使用具有随机学习算法的机器学习算法时,最好通过对其在多次运行或交叉验证重复中的性能进行平均来评估它们。在拟合最终模型时,可能需要增加树的数量,直到模型在重复评估中的方差减小,或者拟合多个最终模型并对它们的预测进行平均。

让我们看看如何为分类和回归开发 AdaBoost 集成模型。

用于分类的 AdaBoost

在本节中,我们将探讨在分类问题中使用 AdaBoost。

首先,我们可以使用 make_classification() 函数 创建一个包含 1,000 个示例和 20 个输入特征的合成二元分类问题。

完整的示例如下所示。

运行示例会创建数据集并总结输入和输出组件的形状。

接下来,我们可以在此数据集上评估 AdaBoost 算法。

我们将使用重复分层 k 折交叉验证评估模型,其中包含三次重复和 10 折。我们将报告模型在所有重复和折叠中的准确性的平均值和标准差。

运行示例报告了模型的平均准确度和标准差。

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

在这种情况下,我们可以看到具有默认超参数的 AdaBoost 集成模型在此测试数据集上实现了大约 80% 的分类准确率。

我们还可以将 AdaBoost 模型用作最终模型并进行分类预测。

首先,AdaBoost 集成模型在所有可用数据上进行拟合,然后可以调用 predict() 函数对新数据进行预测。

以下示例在我们的二元分类数据集上演示了这一点。

运行示例后,AdaBoost 集成模型会在整个数据集上拟合,然后用于对新数据行进行预测,就像我们在应用程序中使用模型时一样。

现在我们熟悉了 AdaBoost 用于分类,接下来让我们看看回归的 API。

用于回归的 AdaBoost

在本节中,我们将探讨在回归问题中使用 AdaBoost。

首先,我们可以使用 make_regression() 函数 创建一个包含 1,000 个示例和 20 个输入特征的合成回归问题。

完整的示例如下所示。

运行示例会创建数据集并总结输入和输出组件的形状。

接下来,我们可以在此数据集上评估 AdaBoost 算法。

与上一节一样,我们将使用重复的 k 折交叉验证评估模型,其中包含三次重复和 10 折。我们将报告模型在所有重复和折叠中的平均绝对误差 (MAE)。scikit-learn 库将 MAE 设置为负值,以便最大化而不是最小化。这意味着较大的负 MAE 更好,完美模型的 MAE 为 0。

完整的示例如下所示。

运行示例报告了模型的平均准确度和标准差。

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

在这种情况下,我们可以看到具有默认超参数的 AdaBoost 集成模型实现了大约 100 的 MAE。

我们还可以将 AdaBoost 模型用作最终模型并进行回归预测。

首先,AdaBoost 集成模型在所有可用数据上进行拟合,然后可以调用 predict() 函数对新数据进行预测。

以下示例在我们的回归数据集上演示了这一点。

运行示例后,AdaBoost 集成模型会在整个数据集上拟合,然后用于对新数据行进行预测,就像我们在应用程序中使用模型时一样。

既然我们熟悉了使用 scikit-learn API 评估和使用 AdaBoost 集成模型,接下来让我们看看如何配置模型。

AdaBoost 超参数

在本节中,我们将更深入地研究您应该考虑为 AdaBoost 集成模型调整的一些超参数及其对模型性能的影响。

探索树的数量

AdaBoost 算法的一个重要超参数是集成模型中使用的决策树的数量。

回想一下,集成模型中使用的每个决策树都设计为弱学习器。也就是说,它具有超越随机预测的能力,但并非高度熟练。因此,使用一层决策树,称为决策树桩。

添加到模型的树的数量必须很高才能使模型运行良好,通常是数百甚至数千。

树的数量可以通过“n_estimators”参数设置,默认为 50。

下面的示例探讨了树的数量在 10 到 5,000 之间对性能的影响。

运行示例首先报告每个配置的决策树数量的平均准确率。

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

在这种情况下,我们可以看到在此数据集上,性能在大约 50 棵树之后有所改善,之后有所下降。这可能表明在添加更多树后,集成模型对训练数据集过拟合。

为每个配置的树数量创建了准确率分数的箱线图。

我们可以看到模型性能和集成模型大小的总体趋势。

Box Plot of AdaBoost Ensemble Size vs. Classification Accuracy

AdaBoost 集成模型大小与分类准确率的箱线图

探索弱学习器

默认情况下,使用一层决策树作为弱学习器。

我们可以通过增加决策树的深度来使集成模型中使用的模型不那么弱(更熟练)。

以下示例探讨了增加 DecisionTreeClassifier 弱学习器深度对 AdBoost 集成模型的影响。

运行示例首先报告每个配置的弱学习器树深度的平均准确率。

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

在这种情况下,我们可以看到随着决策树深度的增加,集成模型在该数据集上的性能也随之增加。

为每个配置的弱学习器深度创建了准确率分数的箱线图。

我们可以看到模型性能和弱学习器深度的总体趋势。

Box Plot of AdaBoost Ensemble Weak Learner Depth vs. Classification Accuracy

AdaBoost 集成模型弱学习器深度与分类准确率的箱线图

探索学习率

AdaBoost 还支持一个学习率,它控制每个模型对集成预测的贡献。

这由“learning_rate”参数控制,默认设置为 1.0 或完全贡献。根据集成模型中使用的模型数量,较小或较大的值可能更合适。模型的贡献和集成模型中树的数量之间存在平衡。

更多的树可能需要较小的学习率;较少的树可能需要较大的学习率。通常使用 0 到 1 之间的值,有时为了避免过拟合而使用非常小的值,例如 0.1、0.01 或 0.001。

以下示例探讨了以 0.1 为增量,在 0.1 到 2.0 之间的学习率值。

运行示例首先报告每个配置的学习率的平均准确率。

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

在这种情况下,我们可以看到 0.5 到 1.0 之间的值相似,之后模型性能下降。

为每个配置的学习率的准确度分数分布创建了一个箱线图。

我们可以看到在此数据集上,学习率大于 1.0 时模型性能普遍下降的趋势。

Box Plot of AdaBoost Ensemble Learning Rate vs. Classification Accuracy

AdaBoost 集成模型学习率与分类准确率的箱线图

探索替代算法

集成模型中使用的默认算法是决策树,尽管也可以使用其他算法。

目的是使用非常简单的模型,称为弱学习器。此外,scikit-learn 实现要求使用的任何模型都必须支持加权样本,因为它们是通过根据训练数据集的加权版本拟合模型来创建集成模型的。

基础模型可以通过“base_estimator”参数指定。对于分类情况,基础模型还必须支持预测概率或类似概率的分数。如果指定的模型不支持加权训练数据集,您将看到以下错误消息:

支持加权训练的一个模型示例是逻辑回归算法。

以下示例演示了一个使用 LogisticRegression 弱学习器的 AdaBoost 算法。

运行示例报告了模型的平均准确度和标准差。

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

在这种情况下,我们可以看到具有逻辑回归弱模型的AdaBoost集成模型在这个测试数据集上达到了约79%的分类准确率。

网格搜索 AdaBoost 超参数

AdaBoost的配置可能具有挑战性,因为该算法有许多关键的超参数,这些超参数会影响模型在训练数据上的行为,并且这些超参数之间会相互作用。

因此,最好使用搜索过程来发现适用于给定预测建模问题的模型超参数配置,或者找到最佳配置。常见的搜索过程包括随机搜索和网格搜索。

在本节中,我们将介绍AdaBoost算法关键超参数的常见范围的网格搜索,您可以将其作为自己项目的起点。这可以通过使用GridSearchCV类并指定一个将模型超参数名称映射到要搜索值的字典来实现。

在这种情况下,我们将对AdaBoost的两个关键超参数进行网格搜索:集成中使用的树的数量和学习率。我们将为每个超参数使用一系列流行的、表现良好的值。

每个配置组合都将使用重复的k折交叉验证进行评估,并且配置将通过平均分数(在本例中为分类准确率)进行比较。

下面列出了在我们的合成分类数据集上对AdaBoost算法关键超参数进行网格搜索的完整示例。

运行示例可能需要一些时间,具体取决于您的硬件。运行结束时,首先报告获得最佳分数的配置,然后是所有其他考虑过的配置的分数。

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

在这种情况下,我们可以看到一个包含500棵树和学习率为0.1的配置表现最佳,分类准确率约为81.3%。

该模型在更多树(例如1,000或5,000棵)的情况下可能表现更好,尽管为了确保网格搜索在合理时间内完成,本例中没有测试这些配置。

进一步阅读

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

教程

论文

API

文章

总结

在本教程中,您学习了如何为分类和回归开发AdaBoost集成模型。

具体来说,你学到了:

  • AdaBoost集成是一个由顺序添加到模型中的决策树组成的集成模型。
  • 如何使用 AdaBoost 集成模型进行分类和回归(使用 scikit-learn)。
  • 如何探索 AdaBoost 模型超参数对模型性能的影响。

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

掌握现代集成学习!

Ensemble Learning Algorithms With Python

在几分钟内改进您的预测

...只需几行python代码

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

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

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


查看内容

《如何在Python中开发AdaBoost集成模型》的13条回复

  1. Manish 2020年5月2日 上午6:54 #

    概念解释得很清楚,模型行为如何随着单个超参数的变化而变化。

    如果能有超参数组合的类似解释会更有效。例如,当学习率和估计器数量同时改变时,模型将如何表现。

  2. Lucia 2020年7月3日 上午2:59 #

    你好,我非常喜欢你的帖子和课程。

    我的问题是,我们使用交叉验证来评估给定模型的性能,但交叉验证不会改进模型,它只是告知我们正在测试的模型的性能,对吗?
    如果我们要预测新样本,我们需要使用我们在交叉验证中使用的并给出更高平均准确率的模型(?)。

  3. Mark Littlewood 2020年9月25日 晚上8:25 #

    嗨Jason,一如既往的好文章。

    你如何将模型参数设置为找到的最佳超参数?

    我尝试了**hyperParams,但在AdaBoost的情况下,它似乎会覆盖基本参数,并且只设置找到的最佳参数。

    • Jason Brownlee 2020年9月26日 上午6:17 #

      抱歉,Mark,我不明白你的问题。你能详细说明一下吗?

  4. Mark Littlewood 2020年9月25日 晚上11:16 #

    忽略我上次的评论,搞定了。

    你必须设置(在我的例子中)DecisionTreeClassifier(max_depth=3), **hyperParams

    很容易认为,像其他模型中的其他超参数一样,未被调整参数替换的参数会保持不变,但这个参数和AdaBoost的情况并非如此。

  5. bebeji 2021年5月18日 上午10:07 #

    谢谢你,Jason。真诚地说,我从你的教程中学到了很多。

  6. bebeji 2021年5月31日 上午2:05 #

    Jason,请问一个快速问题。

    我知道您使用了scikit-learn实现的AdaBoost分类器,在“探索树的数量”部分,您提到“请记住,集成中使用的每个决策树都被设计成一个弱学习器。也就是说,它比随机预测有技能,但技能不高……因此,使用单层决策树,称为决策桩。”

    然而,在scikit-learn的AdaBoostClassifier文档中,默认的树是50棵(n_estimators=50)。这怎么会是单层树/决策桩呢?
    https://scikit-learn.cn/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html

    • Jason Brownlee 2021年5月31日 上午5:50 #

      50棵树,其中每棵树都是一个决策桩,一次添加一个到集成模型中。

  7. Aditi Arora 2022年12月16日 晚上9:25 #

    解释得很好,先生。

    先生,请写一篇关于如何在图像数据集上将神经网络(CNN)用作adaboost中的弱分类器的博客。
    我在谷歌上读了很多关于adaboost的文章,但主要文章都讨论了在表格数据集上应用adaboost,并使用决策树作为弱分类器。

    请帮帮我!

    • James Carmichael 2022年12月17日 上午8:01 #

      感谢您的反馈和建议,Aditi!我们非常感谢。

发表评论

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