Auto-Sklearn 用于 Python 上的自动化机器学习

自动化机器学习(AutoML)是指在用户几乎不参与的情况下,为预测建模任务自动发现表现良好的模型的技术。

Auto-Sklearn是一款用于在Python中执行AutoML的开源库。它利用流行的Scikit-Learn机器学习库进行数据转换和机器学习算法,并使用贝叶斯优化搜索过程来为给定数据集有效地发现高性能的模型管道。

在本教程中,您将了解如何在Python中使用Auto-Sklearn为Scikit-Learn机器学习算法进行AutoML。

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

  • Auto-Sklearn是一款开源库,用于使用scikit-learn数据预处理和机器学习模型的AutoML。
  • 如何使用Auto-Sklearn自动发现分类任务的高性能模型。
  • 如何使用Auto-Sklearn自动发现回归任务的高性能模型。

让我们开始吧。

Auto-Sklearn for Automated Machine Learning in Python

Auto-Sklearn 用于 Python 上的自动化机器学习
照片由 Richard 拍摄,保留部分权利。

教程概述

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

  1. 使用 Auto-Sklearn 进行 AutoML
  2. 安装和使用 Auto-Sklearn
  3. Auto-Sklearn 用于分类
  4. Auto-Sklearn 用于回归

使用 Auto-Sklearn 进行 AutoML

自动化机器学习(简称AutoML)是一个发现数据转换、模型和模型配置的最佳性能管道的过程。

AutoML通常使用复杂的优化算法,例如 贝叶斯优化,来有效地导航可能的模型和模型配置空间,并快速发现对给定预测建模任务有效的模型。它允许非专家机器学习从业者通过很少的技术背景或直接输入,快速轻松地发现对给定数据集有效的甚至是最佳的模型。

Auto-Sklearn是一款开源Python库,用于使用scikit-learn机器学习库中的机器学习模型的AutoML。

它由 Matthias Feurer 等人开发,并在他们2015年的论文“Efficient and Robust Automated Machine Learning”中进行了描述。

…我们引入了一个基于scikit-learn的强大新型AutoML系统(使用了15个分类器、14个特征预处理方法和4个数据预处理方法,从而产生了具有110个超参数的结构化假设空间)。

- Efficient and Robust Automated Machine Learning, 2015。

Auto-Sklearn 的好处是,除了发现对数据集有效的数 据准备和模型外,它还可以从在类似数据集上表现良好的模型中学习,并能够自动创建在优化过程中发现的顶级性能模型的集成。

该系统(我们称之为AUTO-SKLEARN)通过自动考虑过去在类似数据集上的表现,并通过对优化过程中评估的模型进行集成,从而改进了现有的AutoML方法。

- Efficient and Robust Automated Machine Learning, 2015。

作者在论文中提供了他们系统的有用图示,如下所示。

Overview of the Auto-Sklearn System

Auto-Sklearn 系统概述。
取自:Efficient and Robust Automated Machine Learning, 2015。

安装和使用 Auto-Sklearn

第一步是安装Auto-Sklearn库,可以使用pip完成,如下所示:

安装后,我们可以导入该库并打印版本号以确认安装成功

运行示例将打印版本号。

您的版本号应与此相同或更高。

使用Auto-Sklearn非常简单。

根据您的预测任务是分类还是回归,您将创建并配置 AutoSklearnClassifierAutoSklearnRegressor 类的实例,在您的数据集上进行拟合,仅此而已。然后,可以使用生成的模型直接进行预测,或将其(使用pickle)保存到文件以备将来使用。

AutoSklearn 类作为参数提供了大量的配置选项。

默认情况下,搜索将在搜索过程中使用数据集的训练-测试拆分,并且此默认值推荐用于速度和简单性。

重要的是,您应该将“n_jobs”参数设置为您系统中的核心数,例如,如果您有8个核心,则设置为8。

优化过程将根据您的允许运行时间(以分钟为单位)进行。默认情况下,它将运行一个小时。

我建议为进程希望运行的秒数设置“time_left_for_this_task”参数。例如,对于许多小型预测建模任务(少于1000行),少于5-10分钟可能就足够了。

在本教程的示例中,我们将使用5分钟(300秒)。我们还将通过“per_run_time_limit”参数将分配给每个模型评估的时间限制为30秒。例如:

您可以限制搜索中考虑的算法以及数据转换。

默认情况下,搜索将创建一个在搜索过程中发现的顶级性能模型的集成。有时,这可能导致过拟合,并且可以通过将“ensemble_size”参数设置为1并设置“initial_configurations_via_metalearning”为0来禁用。

运行结束后,可以访问模型列表以及其他详细信息。

也许最实用的功能是sprint_statistics()函数,该函数总结了搜索过程和最终模型的性能。

现在我们已经熟悉了Auto-Sklearn库,让我们看一些实际的例子。

Auto-Sklearn 用于分类

在本节中,我们将使用Auto-Sklearn为雷达数据集发现一个模型。

声纳数据集是一个标准机器学习数据集,包含 208 行数据,其中有 60 个数值输入变量和一个具有两个类别值的目标变量,例如二元分类。

使用重复分层10折交叉验证和三次重复的测试硬件,一个简单的模型可以达到约53%的准确率。一个高性能的模型可以在此相同的测试硬件上达到约88%的准确率。这为该数据集上的预期性能提供了范围。

该数据集涉及预测声纳回波是否指示岩石或模拟水雷。

无需下载数据集;我们将在工作示例中自动下载它。

下面的示例下载数据集并汇总其形状。

运行此示例将下载数据集并将其拆分为输入和输出元素。正如预期的那样,我们可以看到有 208 行数据和 60 个输入变量。

我们将使用Auto-Sklearn来找到雷达数据集的一个好模型。

首先,我们将数据集分成训练集和测试集,让过程在训练集上找到一个好模型,然后稍后评估所找到模型在保留测试集上的性能。

AutoSklearnClassifier配置为运行5分钟,使用8个核心,并将每个模型评估限制为30秒。

然后,在训练数据集上执行搜索。

之后,将报告搜索和最佳性能模型的摘要。

最后,我们评估在保留数据集上准备好的模型的性能。

将这些结合起来,完整的示例列在下面。

鉴于我们为运行设置的硬性限制,运行示例大约需要五分钟。

注意:您 在机器学习中获得不同结果 的可能性可能因算法或评估程序的随机性,或数值精度的差异而有所不同。可以考虑多次运行示例并比较平均结果。

运行结束后,会打印出摘要,显示评估了1054个模型,最终模型的估计性能为91%。

然后我们在保留数据集上评估模型,发现分类准确率为81.2%,这是一个相当不错的表现。

Auto-Sklearn 用于回归

在本节中,我们将使用Auto-Sklearn为汽车保险数据集发现一个模型。

汽车保险数据集是一个标准的机器学习数据集,包含63行数据,一个数值输入变量和一个数值目标变量。

使用重复分层10折交叉验证和三次重复的测试硬件,一个简单的模型可以实现约66的平均绝对误差(MAE)。一个高性能的模型在此相同的测试硬件上可以实现约28的MAE。这为该数据集上的预期性能提供了范围。

该数据集涉及根据不同地理区域的索赔数量预测总索赔金额(以瑞典克朗千计)。

无需下载数据集;我们将在工作示例中自动下载它。

下面的示例下载数据集并汇总其形状。

运行示例会下载数据集并将其分割为输入和输出元素。正如预期的那样,我们可以看到有 63 行数据,其中有一个输入变量。

我们将使用Auto-Sklearn来找到汽车保险数据集的一个好模型。

我们可以使用与上一节相同的过程,但我们将使用AutoSklearnRegressor类而不是AutoSklearnClassifier

默认情况下,回归器将优化R^2指标。

在这种情况下,我们对平均绝对误差(MAE)感兴趣,可以在调用fit()函数时通过“metric”参数指定。

完整的示例如下所示。

鉴于我们为运行设置的硬性限制,运行示例大约需要五分钟。

您在运行过程中可能会看到一些警告消息,可以安全地忽略它们,例如:

注意:您 在机器学习中获得不同结果 的可能性可能因算法或评估程序的随机性,或数值精度的差异而有所不同。可以考虑多次运行示例并比较平均结果。

运行结束后,会打印出摘要,显示评估了1759个模型,最终模型的估计性能为MAE 29。

然后我们在保留数据集上评估模型,发现MAE为26,这是一个很好的结果。

进一步阅读

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

总结

在本教程中,您了解了如何在Python中使用Auto-Sklearn进行Scikit-Learn机器学习算法的AutoML。

具体来说,你学到了:

  • Auto-Sklearn是一款开源库,用于使用scikit-learn数据预处理和机器学习模型的AutoML。
  • 如何使用Auto-Sklearn自动发现分类任务的高性能模型。
  • 如何使用Auto-Sklearn自动发现回归任务的高性能模型。

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

发现 Python 中的快速机器学习!

Master Machine Learning With Python

在几分钟内开发您自己的模型

...只需几行 scikit-learn 代码

在我的新电子书中学习如何操作
精通 Python 机器学习

涵盖自学教程端到端项目,例如
加载数据可视化建模调优等等...

最终将机器学习带入
您自己的项目

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

查看内容

关于 Auto-Sklearn for Automated Machine Learning in Python 的 75 条回复

  1. Alessandro F. 2020年9月7日晚上7:29 #

    你好 Jason,

    我在Google CO-Lab上尝试运行Auto-Sklearn,但没有成功。
    似乎与当前版本的Pandas(1.0.x)存在冲突,而该包运行在先前版本(0.25.x)上。

    我将尝试解决这个问题。
    无论如何,您的解释总是最好的!

    此致,
    Alessandro

    • Jason Brownlee 2020年9月8日早上6:47 #

      也许可以尝试在您的工作站上运行。

      • Gábor 2020年9月8日晚上8:29 #

        我也遇到了Pandas >0.25.x的问题。降级到0.25.3,用liac-arff包替换arff包解决了这个问题。

        • Jason Brownlee 2020年9月9日早上6:47 #

          以下是我使用的版本,如果有所帮助的话:

          • Junaid Akhtar 2020年9月12日晚上4:09 #

            你是如何计算出这个列表的?

          • Jason Brownlee 2020年9月13日早上5:59 #

            我通过这个脚本逐个打印了每个库的版本:

  2. Gabriel 2020年9月8日早上3:49 #

    是否可以手动评估自动选择的模型?我的意思是,有没有一个方法可以调用以获取模型最终的所有参数和配置?

    • Jason Brownlee 2020年9月8日早上6:52 #

      是的,一旦定义了模型,您就可以在自己的测试硬件上对其进行评估。

  3. shamik 2020年9月8日早上11:25 #

    这是非常信息丰富的内容。非常有用。我想在我的实时项目中使用它,但无法继续。
    根据其官方网站,该软件包似乎不支持Windows。在Anaconda(我目前正在使用的)中也找不到解决方案。
    上面提到的命令在Anaconda中不起作用。
    sudo pip install autosklearn

    请帮忙说明如何在Anaconda环境中安装和使用它。

    • Jason Brownlee 2020年9月8日晚上1:36 #

      不客气。

      很抱歉听到这个。也许可以尝试使用conda安装该软件包?

  4. Manoj Ishi 2020年9月8日晚上7:06 #

    TypeError: ‘generator’ object is not subscribable
    在运行分类问题时出现了这个错误。

  5. Gábor Stikkel 2020年9月9日早上4:55 #

    感谢您又一篇精彩的文章 Jason!
    我在回归部分遇到了一个错误:

    —————————————————————————
    TypeError Traceback (most recent call last)
    in
    17 model = AutoSklearnRegressor(time_left_for_this_task=60, per_run_time_limit=30, n_jobs=8)#, metric=auto_mean_absolute_error)
    18 # 执行搜索
    —> 19 model.fit(X_train, y_train, metric=auto_mean_absolute_error)
    20 # 总结
    21 print(model.sprint_statistics())

    TypeError: fit() got an unexpected keyword argument ‘metric’

    我认为metric部分应该移到模型定义中(参见上面注释的部分)。

    [继续加油!]

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

      听到这个消息我很难过,也许检查一下你所有的库是否都是最新的?

      • Adeliya 2020年9月10日 晚上11:26 #

        嗨!

        我遇到了同样的错误。实际上,查看文档,`“metric”`是`AutoSklearnRegressor()`的参数,而不是`fit()`的参数。

        感谢教程!

  6. Bill 2020年9月11日 上午5:41 #

    感谢教程,

    我们非常期待看到有关知识图谱和知识图谱嵌入的教程:)

    谢谢,
    Bill

  7. Timothy 2020年9月11日 上午8:02 #

    这看起来正是我需要的。不幸的是,安装不成功。我得等有大量时间来解决这个问题时再回来。

  8. Xu Zhang 2020年9月11日 上午8:25 #

    感谢您的精彩文章。

    Auto-Sklearn 的性能是否总是优于微调的个体模型?

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

      不,但它可以很快地找到一个好模型。

  9. ct dyana 2020年9月11日 上午8:47 #

    感谢您提供的信息性解释……我非常喜欢……

    但我想知道 Python 在 auto sklearn 中用于机器学习的算法是什么?它的表现是否与使用 weka 相同……
    我如何知道 Python 库中适用的分类和回归算法?

    谢谢!

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

      不客气。

      它使用贝叶斯优化来搜索合适的算法。

  10. Amit Barik 2020年9月11日 下午4:13 #

    嗨,Jason,

    我有一台 windows10 笔记本电脑。当我尝试安装 auto-sklearn 时,它说由于系统兼容性问题无法安装。然后我查看了 git,得知我们无法在 Windows 机器上安装。我说得对吗?它只在 Unix 机器上运行吗?

    请帮忙!!!

    此致,
    Amit

  11. Santosh 2020年9月11日 下午6:06 #

    我们能否获得用于获得最佳结果的内部参数?

  12. Mark Littlewood 2020年9月11日 下午6:30 #

    你怎么知道它选择了什么算法,例如 GBM,或者它是一个集成模型?

    • Jason Brownlee 2020年9月12日 上午6:06 #

      您可以使用 `model.show_models()` 来显示模型集成。

  13. Anubha Pearline S 2020年9月11日 下午8:25 #

    嗨,Jason,
    如何检查 AutoSklearn 选择的是哪个模型?

    • Jason Brownlee 2020年9月12日 上午6:11 #

      您可以使用以下命令显示最终集成中的模型:

  14. shaheen mohammed saleh 2020年9月12日 上午1:12 #

    请问如何在 anaconda windows 10 中安装 auto-sklearn,因为 auto-sklearn 有以下系统要求:

    Linux 操作系统(例如 Ubuntu)(在此获取 Linux),

    Python(>=3.5)(在此获取 Python)。

    C++ 编译器(支持 C++11)(在此获取 GCC)和

    SWIG(需要 3.0.* 版本;不支持 >=4.0.0)(在此获取 SWIG)。

    • Jason Brownlee 2020年9月12日 上午6:18 #

      也许可以使用 AWS EC2 实例或 Linux 虚拟机。

  15. Rahul Goswami 2020年9月12日 上午2:51 #

    对于所有在 Google Colab 上安装 auto sklearn 时遇到问题的人,它也应该能在 jupyter 上运行,但我还没有尝试过。运行以下代码,auto sklearn 就能正常运行:

    !apt-get install swig -y
    !pip install Cython numpy

    # 有时在 colab 上需要运行以下命令两次
    # 我还没弄明白为什么
    !pip install auto-sklearn

  16. Rahul Goswami 2020年9月12日 上午3:14 #

    嗨,Jason,

    尝试 auto sklearn 的分类器时,我遇到了这个错误:

    TypeError: ‘generator’ object is not subscribable
    在运行分类问题时出现了这个错误。

    如果可能,请帮忙,也感谢您提供的所有精彩博文。

    • Jason Brownlee 2020年9月12日 上午6:20 #

      抱歉,我没见过这个错误。也许可以在 stackoverflow 上搜索/发帖。

  17. TC 2020年9月18日 下午2:04 #

    嗨,Jason,

    感谢您撰写这篇博文,因为网上很少有文章介绍 auto-sklearn。

    一个问题:auto-sklearn 是否真的提供了任何“特征工程”功能?它看起来像特征预处理器只是进行降维或压缩。例如,如果我们有一个日期时间变量,auto-sklearn 能否自动从该变量中创建小时、天、月、年等工程特征?

    • Jason Brownlee 2020年9月18日 下午2:52 #

      不完全是。您可以添加这些模块。

      • TC 2020年9月18日 下午6:06 #

        您能提供一个关于如何“添加这些模块”的例子吗?

  18. TC 2020年9月18日 下午6:13 #

    嗨,Jason,

    “使用重复分层 10 折交叉验证并进行三次重复的测试框架,朴素模型可以达到约 53% 的准确率。性能最佳的模型在此测试框架上可达到约 88% 的准确率。这提供了该数据集的预期性能范围。”

    您能告诉我您分别使用了什么算法来获得朴素模型和性能最佳的模型吗?

  19. TC 2020年9月18日 下午6:15 #

    嗨,Jason,

    “在运行结束时,会打印一个摘要,显示已评估了 1,759 个模型,并且最终模型的估计性能为 MAE 为 29。”

    是否有任何方法可以查看 auto-sklearn 用于生成这 1,759 个模型的算法?auto-sklearn 是否包含 xgboost 作为构建模型的算法之一?

    • Jason Brownlee 2020年9月19日 上午6:49 #

      是的,如下所示

      我不确定它是否支持 xgboost,抱歉。

  20. Gustavo 2020年9月22日 下午12:16 #

    它是否执行交叉验证来选择最佳模型?

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

      好问题,我一下子也说不清楚。

      也许可以查看库文档?

  21. Zineb 2020年9月29日 上午6:20 #

    嗨 Jason,一如既往地简洁有用。非常感谢。
    我感到有点沮丧,因为使用自动化机器学习,我觉得再也不需要浪费时间深入研究数据预处理的各个步骤,以及测试不同的技术来构建一个好的模型。
    你觉得呢?

    • Jason Brownlee 2020年9月29日 上午7:43 #

      我认为 AutoML 非常适合快速构建模型或快速了解什么有效。

      我们仍然可以从手工制作的模型中获得更好/最佳的结果。例如机器学习竞赛。一旦竞赛被 AutoML 一致赢得,就该升级了。

  22. josh 2020年10月9日 下午4:20 #

    嗨 Jason,我在 Google Colab 中尝试了相同的代码,但出现了以下错误:

    model.fit(X_train,y_train)
    TypeError: __init__() got an unexpected keyword argument ‘local_directory’

    你能帮帮我吗?谢谢!

  23. Dominick 2020年10月21日 上午6:51 #

    你好。这篇文章确实令人着迷,特别是
    上个星期天我一直在寻找关于这个主题的想法。

  24. Klemen 2021年1月7日 上午7:55 #

    非常有趣。我会试试的。它是否也执行特征选择?它是否预处理输入数据(标准化、分类值——独热编码)?还是所有这些仍然是手动预处理的一部分?

    • Jason Brownlee 2021年1月7日 上午9:41 #

      谢谢。

      好问题,我认为它确实涉及到选择一些数据预处理。

      我建议您仔细检查文档。

  25. frederic kleinemann 2021年2月24日 上午1:37 #

    您好,

    我正在尝试运行分类的 AutoSklearn 示例,使用 sonar.csv 数据集,每次都会出现这个错误:EOFError : unexpected EOF。

    ~/anaconda3/lib/python3.8/multiprocessing/forkserver.py in read_signed(fd)
    332 s = os.read(fd, length – len(data))
    333 if not s
    --> 334 raise EOFError(‘unexpected EOF’)
    335 data += s
    336 return SIGNED_STRUCT.unpack(data)[0]

    EOFError: unexpected EOF

    我使用的是 autosklearn:0.12.3,并且我已经尝试了 AutoSklearn 中的所有示例,它们都运行良好。所以我好奇您是否遇到过这个问题,如果有,您是如何解决的。

    谢谢你

    • Jason Brownlee 2021年2月24日 上午5:34 #

      抱歉,我没见过这个问题。

      也许可以试试在 stackoverflow 或 autosklaern 项目本身上发布代码/错误?

  26. Kai-Yun Li 2021年3月17日 上午5:34 #

    嗨 Jason,我正在将 Auto-Sklearn 用于分类任务,并且运行良好,
    但是,它没有提供太多可视化示例,
    我想知道我是否可以导入 wandb 来处理此类任务?

    https://wandb.ai/lavanyashukla/visualize-sklearn/reports/Visualize-Scikit-Models–Vmlldzo0ODIzNg

    如果不行,还有其他方法可以显示更好的图表吗?

    谢谢你

    • Jason Brownlee 2021年3月17日 上午6:10 #

      也许一旦搜索找到最终模型,您就可以重新拟合并可视化它。

  27. JG 2021年4月28日 上午4:41 #

    嗨,Jason,

    谢谢你的帖子。它看起来非常有趣!

    在尝试在 Mac 上使用 Python 3.6 安装 autosklearn 时(按照您的帖子
    https://machinelearning.org.cn/install-python-3-environment-mac-os-x-machine-learning-deep-learning/)

    使用您的命令
    % sudo pip install autosklearn

    我遇到了以下错误:
    ERROR: Could not find a version that satisfies the requirement autosklearn (from versions: none)
    ERROR: No matching distribution found for autosklearn

    我尝试了其他选项,遵循了 autosklearn 的建议
    % curl https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt | xargs -n 1 -L 1 pip3 install
    % sudo pip3 install -U auto-sklearn

    但也没有成功 🙁

    有什么建议吗?
    谢谢

    • Jason Brownlee 2021年4月28日 上午6:03 #

      哎哟!?

      很遗憾听到这个消息,也许这个库最近没有更新来跟上 sklearn 的更新。

      也许需要一个新的环境,并且回滚某些版本(可能是 sklearn)?

  28. Vinit 2021年8月16日 晚上10:31 #

    你好 jason,

    感谢您的精彩文章。学到了很多,但有一个问题我想知道:

    对于二元分类,auto sklearn 分类器是否默认采用 0.5 的概率阈值?可以更改吗?

    • Adrian Tam
      Adrian Tam 2021年8月17日 上午7:49 #

      当然可以更改。那是分类器的 `predict_proba()` 函数。然而,0.5 的阈值在数学上是有意义的,因为反转结果会得到二元分类的精确相反值。这就是它成为默认值的原因。

  29. Mary 2021年12月22日 上午11:18 #

    你好,

    感谢您的帖子。

    但是,我们如何报告所选的模型及其参数?此外,我们可以在搜索过程中选择要用于评估的指标吗?

    谢谢你。

  30. Mary 2021年12月22日 上午11:18 #

    你好,

    感谢您的帖子。

    但是,我们如何报告所选的模型及其参数?此外,我们可以在搜索过程中选择要用于评估的指标吗?

    谢谢你。

  31. Sushant Pawar 2023年5月4日 上午4:14 #

    很棒的文章,伙计!
    您能否提供一些关于如何避免过拟合的技巧?

留下回复

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