Python 中用于分类的动态集成选择 (DES)

动态集成选择是一种集成学习技术,它在进行预测时,可以即时自动选择一个集成成员子集。

该技术包括在训练数据集上拟合多个机器学习模型,然后根据要预测的特定新示例的详细信息,选择在预测时预计表现最佳的模型。

这可以通过使用 k-最近邻模型来定位训练数据集中与要预测的新示例最接近的示例,在该邻域评估池中的所有模型,并使用在邻域中表现最佳的模型来为新示例做出预测来实现。

因此,动态集成选择通常可以比池中的任何单个模型表现更好,也比池中所有成员的平均值(所谓的静态集成选择)表现更好。

在本教程中,您将了解如何在 Python 中开发动态集成选择模型。

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

  • 动态集成选择算法在对新数据进行预测时会自动选择集成成员。
  • 如何使用 scikit-learn API 为分类任务开发和评估动态集成选择模型。
  • 如何探索动态集成选择模型的超参数对分类精度的影响。

立即开始您的项目,阅读我的新书 Python 集成学习算法,其中包含分步教程和所有示例的Python 源代码文件。

让我们开始吧。

Dynamic Ensemble Selection (DES) in Python

Python 中的动态集成选择 (DES)
照片由 Simon Harrod 拍摄,保留部分权利。

教程概述

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

  1. 动态集成选择
  2. k-最近邻预言机 (KNORA) 与 Scikit-Learn
    1. KNORA-Eliminate (KNORA-E)
    2. KNORA-Union (KNORA-U)
  3. KNORA 的超参数调优
    1. 探索 k-最近邻中的 k
    2. 探索分类器池的算法

动态集成选择

多分类器系统是指一类机器学习算法,它使用多个模型来解决分类预测建模问题。

最早取得成功的多分类器系统类别被称为动态分类器选择,简称 DCS。

  • 动态分类器选择:根据输入的特定详细信息,动态地从多个训练模型中选择一个来做出预测的算法。

动态分类器选择算法通常涉及以某种方式划分输入特征空间,并指定特定模型负责为每个分区做出预测。有多种不同的 DCS 算法,研究工作主要集中在如何评估和将分类器分配给输入空间的特定区域。

在训练了多个个体学习器之后,DCS 会动态地为每个测试实例选择一个学习器。…… DCS 通过使用一个个体学习器来做出预测。

— 第 93 页,Ensemble Methods: Foundations and Algorithms,2012。

DCS 的一个自然扩展是选择一个或多个模型以动态方式做出预测的算法。也就是说,动态地选择一个分类器的子集或集成。这些技术被称为动态集成选择,或简称 DES。

  • 动态集成选择:根据输入的特定详细信息,动态地选择一个训练模型子集来做出预测的算法。

动态集成选择算法的运行方式与 DCS 算法非常相似,不同之处在于预测是通过多个分类器模型的投票来做出的,而不是单一的最佳模型。实际上,输入特征空间的每个区域都由在该区域中表现最佳的模型子集拥有。

……鉴于只选择一个分类器可能非常容易出错,一些研究人员决定选择一个分类器池的子集,而不是只选择一个基本分类器。所有获得一定能力水平的基本分类器都用于组成 EoC,它们的输出被聚合以预测标签……

动态分类器选择:最新进展与展望,2018。

也许动态集成选择的典型方法是 k-最近邻预言机,或 KNORA,算法,因为它是典型的动态分类器选择算法“动态分类器选择局部精度”,或 DCS-LA 的自然扩展。

DCS-LA 包括选择给定新输入模式的训练或验证数据集中的 k-最近邻,然后根据其在该 k 个示例邻域中的性能选择最佳分类器来对新示例进行预测。

KNORA 由 Albert Ko 等人在其 2008 年题为“从动态分类器选择到动态集成选择”的论文中进行了描述。它是 DCS-LA 的扩展,它选择多个在邻域中表现良好的模型,然后通过多数投票结合它们的预测来做出最终输出预测。

对于任何测试数据点,KNORA 都会在其验证集中找到其 K 个最近邻,弄清楚哪些分类器正确地对验证集中的那些邻居进行了分类,并将它们用作集成模型来对该测试集中的给定模式进行分类。

从动态分类器选择到动态集成选择,2008。

所选的分类器模型被称为“预言机”,因此在该方法名称中使用了预言机。

该集成被认为是动态的,因为成员是根据需要预测的特定输入模式即时选择的。这与静态方法相反,静态方法是选择一次集成成员,例如对模型中所有分类器的预测进行平均。

这是以动态方式完成的,因为不同的模式可能需要不同的分类器集成。因此,我们称我们的方法为动态集成选择。

从动态分类器选择到动态集成选择,2008。

描述了 KNORA 的两个版本,包括 KNORA-Eliminate 和 KNORA-Union。

  • KNORA-Eliminate (KNORA-E):对新示例的邻域具有完美精度的分类器集成,邻域大小减小,直到找到至少一个完美的分类器。
  • KNORA-Union (KNORA-U):对邻域中至少一个正确预测做出贡献的所有分类器的集成,具有加权投票,投票比例与邻域精度成正比。

KNORA-Eliminate,简称 KNORA-E,包括选择在邻域的 k 个示例邻域中实现完美预测的所有分类器。如果没有分类器达到 100% 的准确率,则邻域大小减少一,并重新评估模型。此过程重复进行,直到找到一个或多个具有完美性能的模型,然后使用它们来为新示例做出预测。

在没有分类器能够正确分类测试模式的所有 K 个最近邻的情况下,我们只需减小 K 的值,直到至少有一个分类器正确分类其邻居。

从动态分类器选择到动态集成选择,2008。

KNORA-Union,简称 KNORA-U,包括选择在邻域中至少做出一次正确预测的所有分类器。然后,使用加权平均将每个分类器的预测组合起来,其中邻域中的正确预测数量指示分配给每个分类器的票数。

一个分类器正确分类的邻居越多,该分类器在测试模式中获得的票数就越多。

从动态分类器选择到动态集成选择,2008。

现在我们熟悉了 DES 和 KNORA 算法,让我们看看如何在我们自己的分类预测建模项目中进行使用。

想开始学习集成学习吗?

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

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

k-最近邻预言机 (KNORA) 与 Scikit-Learn

动态集成库,或简称 DESlib,是一个 Python 机器学习库,它实现了许多不同的动态分类器和动态集成选择算法。

DESlib 是一个易于使用的集成学习库,专注于实现动态分类器和集成选择的最新技术。

首先,我们可以使用 pip 包管理器安装 DESlib 库,如果尚未安装。

安装完成后,我们可以通过加载库并打印安装的版本来检查库是否已正确安装并可以使用。

运行脚本将打印您安装的 DESlib 库的版本。

您的版本应相同或更高。如果不是,则必须升级 DESlib 库的版本。

DESlib 通过 KNORAEKNORAU 类分别提供了与每个动态集成选择技术相关的 KNORA 算法的实现。

每个类都可以直接用作 scikit-learn 模型,从而允许直接使用 scikit-learn 的完整数据准备、建模管道和模型评估技术。

这两个类都使用 k-最近邻算法来选择邻居,默认值为 k=7

默认情况下,用于分类的分类器池模型使用引导聚合(bagging)决策树集成,尽管这可以通过将“pool_classifiers”设置为模型列表来更改。

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

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

现在我们熟悉了 DESlib API,让我们看看如何在合成分类数据集上使用每个 KNORA 算法。

KNORA-Eliminate (KNORA-E)

我们可以评估合成数据集上的 KNORA-Eliminate 动态集成选择算法。

在这种情况下,我们将使用默认的模型超参数,包括作为分类器模型池的带袋决策树,以及在进行预测时用于选择局部邻域的 k=7

我们将使用重复分层 k 折交叉验证来评估模型,重复三次,折数为 10。我们将报告模型在所有重复和折中的平均准确率和标准差。

完整的示例如下所示。

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

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

在这种情况下,我们可以看到 KNORA-E 集成和默认超参数实现了约 91.5% 的分类精度。

我们还可以将 KNORA-E 集成用作最终模型并进行分类预测。

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

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

运行示例将 KNORA-E 动态集成选择算法拟合到整个数据集,然后用于对新数据行进行预测,就像在应用程序中使用模型一样。

现在我们熟悉了使用 KNORA-E,让我们来看看 KNORA-Union 方法。

KNORA-Union (KNORA-U)

我们可以评估合成数据集上的 KNORA-Union 模型。

在这种情况下,我们将使用默认的模型超参数,包括作为分类器模型池的带袋决策树,以及在进行预测时用于选择局部邻域的 k=7

我们将使用重复分层 k 折交叉验证来评估模型,重复三次,折数为 10。我们将报告模型在所有重复和折中的平均准确率和标准差。

完整的示例如下所示。

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

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

在这种情况下,我们可以看到 KNORA-U 动态集成选择模型和默认超参数实现了约 93.3% 的分类精度。

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

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

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

运行示例将 KNORA-U 模型拟合到整个数据集,然后用于对新数据行进行预测,就像在应用程序中使用模型一样。

现在我们熟悉了使用 scikit-learn API 评估和使用 KNORA 模型,让我们来看看配置模型。

KNORA 的超参数调优

在本节中,我们将仔细研究您应该为 KNORA 模型考虑的一些超参数及其对模型性能的影响。

KNORA 有许多超参数可以研究,但在此案例中,我们将研究用于模型局部评估的 k-最近邻模型中的 k 值,以及如何使用自定义分类器池。

我们将以 KNORA-Union 为这些实验的基础,尽管选择具体方法是任意的。

探索 k-最近邻中的 k

k-最近邻算法的配置对 KNORA 模型至关重要,因为它定义了选择每个集成所考虑的邻域范围。

k 值控制邻域的大小,重要的是将其设置为适合您数据集的值,特别是特征空间中样本的密度。值太小意味着训练集中的相关示例可能被排除在邻域之外,而值太大可能意味着信号被过多示例稀释。

以下代码示例探索了 KNORA-U 算法在 k 值从 2 到 21 时的分类精度。

运行示例首先报告每个配置的邻域大小的平均准确率。

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

在这种情况下,我们可以看到准确率随着邻域大小的增加而增加,可能达到 k=10,此时它似乎趋于平稳。

为每个配置的邻域大小的准确率分数分布创建箱形图。

我们可以看到在达到平台期之前,模型性能和 k 值的总体趋势。

Box and Whisker Plots of Accuracy Distributions for k Values in KNORA-U

KNORA-U 中 k 值的准确率分布的箱形图

探索分类器池的算法

用于 KNORA 池的算法选择是另一个重要的超参数。

默认情况下,使用带袋决策树,因为它已被证明在各种分类任务上是一种有效的方法。尽管如此,可以考虑使用自定义分类器池。

在大多数 DS 出版物中,分类器池是通过使用已知的集成生成方法(如 Bagging)或使用异构分类器生成的。

动态分类器选择:最新进展与展望,2018。

这需要首先定义一个分类器模型列表,并在训练数据集上分别拟合它们。不幸的是,这意味着 scikit-learn 中的自动 k 折交叉验证模型评估方法在这种情况下不能使用。相反,我们将使用一个训练-测试拆分,以便我们可以手动在训练数据集上拟合分类器池。

然后,可以通过“pool_classifiers”参数将拟合分类器列表指定给 KNORA-Union(或 KNORA-Eliminate)类。在这种情况下,我们将使用一个包含逻辑回归、决策树和朴素贝叶斯分类器的池。

在合成数据集上评估 KNORA 集成和自定义分类器集的完整示例如下所示。

运行该示例首先报告了具有自定义分类器池的模型的平均准确率。

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

在这种情况下,我们可以看到该模型取得了约 91.3% 的准确率。

要采用 KNORA 模型,它必须优于任何贡献模型。否则,我们将只使用表现更好的贡献模型。

我们可以通过评估每个贡献分类器在测试集上的表现来检查这一点。

更新后的 KNORA 示例(具有单独评估的自定义分类器池)如下所示。

运行该示例首先报告了具有自定义分类器池的模型的平均准确率以及每个贡献模型的准确率。

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

在这种情况下,我们可以再次看到 KNORAU 取得了约 91.3% 的准确率,这优于任何贡献模型。

除了指定分类器池之外,还可以指定 scikit-learn 库中的单个集成算法,KNORA 算法将自动使用内部集成成员作为分类器。

例如,我们可以使用具有 1,000 个成员的随机森林集成作为基础分类器,在 KNORA 中考虑,如下所示:

将这些结合起来,具有随机森林集成成员作为分类器的 KNORA-U 的完整示例如下所示。

运行该示例首先报告了具有自定义分类器池的模型的平均准确率以及随机森林模型的准确率。

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

在这种情况下,我们可以看到,具有动态选择的集成成员的 KNORA 模型优于具有静态选择的(完整集)集成成员的随机森林。

进一步阅读

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

相关教程

论文

书籍

API

总结

在本教程中,您了解了如何在 Python 中开发动态集成选择模型。

具体来说,你学到了:

  • 动态集成选择算法在对新数据进行预测时会自动选择集成成员。
  • 如何使用 scikit-learn API 为分类任务开发和评估动态集成选择模型。
  • 如何探索动态集成选择模型的超参数对分类精度的影响。

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

掌握现代集成学习!

Ensemble Learning Algorithms With Python

在几分钟内改进您的预测

...只需几行python代码

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

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

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


查看内容

关于Python 中的动态集成选择 (DES) 的 2 条回复

  1. Ante 2022 年 3 月 7 日下午 11:53 #

    谢谢,杰森。
    DESlib 似乎只专注于分类。
    是否有用于回归的类似工具?

  2. RK 2023 年 1 月 7 日晚上 8:08 #

    我在“探索分类工具”的最后两个代码段中注意到。其中测试集大小为 0.5。我将测试集大小减小到 0.7 和 0.8,结果有所下降。令人惊讶的是,增加测试集(或减少训练集比例)会提高结果。请向我解释一下,为什么?

留下回复

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