手册

本手册概述了 auto-sklearn 的不同方面。对于每个部分,我们提供示例引用或简短解释(点击标题展开文本),例如:

代码示例

我们提供了使用 auto-sklearn 的示例,涵盖了从简单分类到高级用法(如特征重要性、并行运行和自定义)等多种用例。这些示例可在 示例 中找到。

讲座和演示文稿资料

我们在 auto-sklearn-talks 下提供了关于 auto-sklearn 的讲座、教程和演示文稿资源。

Auto-sklearn 2.0

Auto-sklearn 2.0 包含了关于自动配置 AutoML 系统本身的最新研究,并包含大量改进以加速 AutoML 系统的拟合。具体来说,Auto-sklearn 2.0 自动设置 模型选择,决定是否可以使用高效的 bandit 策略 Successive Halving,并使用无元特征的 Portfolios 进行高效的元学习。

auto-sklearn 2.0 具有与常规 auto-sklearn 相同的接口,您可以通过以下方式使用它:

from autosklearn.experimental.askl2 import AutoSklearn2Classifier

一篇描述我们进展的论文可在 arXiv 上查阅。

资源限制

auto-sklearn 的一个关键特性是限制 scikit-learn 算法被允许使用的资源(内存和时间)。特别是对于大型数据集,算法可能需要几个小时并导致机器交换,因此重要的是在一段时间后停止评估,以便在合理的时间内取得进展。因此,设置资源限制是优化时间与可测试模型数量之间的权衡。

时间和内存限制

虽然 auto-sklearn 减轻了手动超参数调优的负担,但用户仍然必须设置内存和时间限制。对于大多数数据集,现代计算机上的 3GB 或 6GB 内存限制是足够的。对于时间限制,很难给出明确的指导。如果可能,一个好的默认设置是总时间限制一天,以及单次运行的时间限制 30 分钟。

更多指导可在 auto-sklearn/issues/142 中找到。

CPU 核心

默认情况下,auto-sklearn 使用 一个核心。另请参阅 并行计算 关于如何配置此项的说明。

管理数据压缩

Auto-sklearn 将尝试将数据集拟合到 memory_limit 的 1/10 中。除非您的数据集非常大或您的 memory_limit 较小,否则不会发生这种情况。这通过两种方法完成:降低精度子采样。您可能希望控制此项的一个原因是如果您需要高精度,或者您依赖预定义的分割,而子采样无法对此进行解释。

关闭数据预处理

AutoSklearnClassifier(
    dataset_compression = False
)

您可以使用以下方法指定执行哪些操作:

AutoSklearnClassifier(
    dataset_compression = { "methods": ["precision", "subsample"] },
)

您可以使用以下方法将数据集的内存分配更改为 memory_limit 的百分比或绝对数量:

AutoSklearnClassifier(
    dataset_compression = { "memory_allocation": 0.2 },
)

dataset_compression = True 时使用的默认参数是:

{
    "memory_allocation": 0.1,
    "methods": ["precision", "subsample"]
}

完整描述请参见 AutoSklearnClassifier(dataset_compression=...)

搜索空间

默认情况下,Auto-sklearn 搜索一个广阔的空间以找到性能良好的配置。但是,也可以限制搜索空间

限制搜索空间

以下示例展示了如何排除所有预处理方法并将配置空间限制为仅使用随机森林。

import autosklearn.classification
automl = autosklearn.classification.AutoSklearnClassifier(
    include = {
        'classifier': ["random_forest"],
        'feature_preprocessor': ["no_preprocessing"]
    },
    exclude=None
)
automl.fit(X_train, y_train)
predictions = automl.predict(X_test)

注意:用于识别估计器和预处理器的字符串是文件名,不包含 .py

完整列表请查看源代码(在 autosklearn/pipeline/components/ 中)

我们还提供了一个示例,说明如何限制分类器仅搜索 可解释模型

关闭数据预处理

数据预处理包括分类特征的 One-Hot 编码、缺失值的填充以及特征或样本的归一化。这些操作确保到达 sklearn 模型的数据格式良好且可用于训练模型。

虽然这通常是必要的,但如果您想禁用此步骤,请参考此 示例

关闭特征预处理

特征预处理是一个单一的转换器,它实现了例如特征选择或将特征转换为不同空间(即 PCA)。

可以通过设置 include={'feature_preprocessor'=["no_preprocessing"]} 来关闭此项,如上例所示。

模型选择

Auto-sklearn 实现了不同的策略来识别性能最佳的模型。对于某些用例,可能需要调整重采样策略或定义自定义指标

使用不同的重采样策略

使用留出法和交叉验证的示例可在 示例 中找到

使用自定义指标

使用自定义指标的示例可在 示例 中找到

集成

为了从评估过的模型中获得最佳性能,auto-sklearn 使用 Caruana 等人 (2004) 的集成选择方法,基于模型对验证集的预测来构建集成模型。

配置集成构建过程

以下超参数控制集成的构建方式

  • ensemble_size 确定集成的最大大小。如果设置为零,则不会构建集成。

  • ensemble_nbest 允许用户直接指定考虑用于集成的模型数量。此超参数可以是一个整数 n,表示最终集成中仅使用最好的 n 个模型。如果提供介于 0.0 和 1.0 之间的浮点数,ensemble_nbest 将被解释为一个分数,表示在集成构建过程中使用的模型百分比(即,如果 ensemble_nbest 是浮点数,则按照 Caruana 等人 (2006) 中描述的方式实现库剪枝)。

  • max_models_on_disc 定义了保留在磁盘上的最大模型数量,作为控制 auto-sklearn 消耗磁盘空间量的一种机制。在 AutoML 整个过程中,不同的个体模型被优化,并且它们的预测(及其他元数据)存储在磁盘上。用户可以设置可接受保留在磁盘上的模型数量上限,但此变量在集成构建器使用的模型数量定义中具有优先权(即,ensemble_sizeensemble_nbestmax_models_on_disc 中的最小值决定了集成中使用的最大模型数量)。如果设置为 None,则禁用此功能。

检查最终集成模型

可以通过调用 show_models() 来打印从最终集成获得的 results。auto-sklearn 集成由 scikit-learn 模型组成,这些模型可以进行检查,如示例 获取运行信息 所示。

事后拟合集成模型

如果仅使用一个核心,可以事后构建集成模型。关于如何执行此操作(首先搜索个体模型,然后从它们构建集成模型)的示例可以在 顺序使用 中看到。

检查结果

auto-sklearn 允许用户检查训练结果和统计信息。假设我们有一个已拟合的估计器

import autosklearn.classification
automl = autosklearn.classification.AutoSklearnClassifier()
automl.fit(X_train, y_train)

auto-sklearn 提供了以下检查结果的方法

基本统计信息

sprint_statistics() 是一个方法,它打印数据集名称、使用的指标以及运行 auto-sklearn 获得的最佳验证分数。它还会额外打印成功和不成功的算法运行次数。

性能随时间变化

performance_over_time_ 返回一个包含模型性能随时间变化数据的 DataFrame,可直接用于绘图(示例请参见:性能随时间变化图)。

automl.performance_over_time_.plot(
        x='Timestamp',
        kind='line',
        legend=True,
        title='Auto-sklearn accuracy over time',
        grid=True,
    )
    plt.show()
评估过的模型

通过调用 show_models() 可以打印从最终集成获得的结果。

排行榜

automl.leaderboard() 显示集成成员,请查看 文档 以了解如何使用 leaderboard 获取所有运行的信息。

其他

cv_results_ 返回一个 dict,其键作为列标题,值作为列,可以导入到 pandas DataFrame 中。

并行计算

在其默认模式下,auto-sklearn 使用 一个核心,并将集成构建与评估新配置交错进行。

使用 Dask 进行并行化

尽管如此,auto-sklearn 也支持通过使用 Dask.distributed 进行并行贝叶斯优化。通过在估计器构建时提供参数 n_jobs,可以控制 auto-sklearn 可用的核心数量(如示例 在单机上并行使用 所示)。通过向 auto-sklearn 提供自定义客户端对象,也支持分布式进程,如示例 并行使用:从命令行生成 worker 所示。当有多个核心可用时,auto-sklearn 将为每个核心创建一个 worker,并使用可用的 worker 搜索更好的机器学习模型以及构建集成模型,直到时间资源耗尽。

注意:auto-sklearn 要求所有 worker 都可以访问共享文件系统,以便存储训练数据和模型。

auto-sklearn 使用 threadpoolctl 来控制 numpy 或 scikit-learn 等科学计算库使用的线程数量。这仅在构建模型过程中进行,不在推断过程中进行。特别是,auto-sklearn 允许每个 pipeline 在训练期间最多使用 1 个线程。在预测和评分时,auto-sklearn 不强制执行此限制。您可以在运行 auto-sklearn 之前,通过在环境中设置以下变量来控制 pipeline 使用的资源数量

$ export OPENBLAS_NUM_THREADS=1
$ export MKL_NUM_THREADS=1
$ export OMP_NUM_THREADS=1

有关 scikit-learn 如何处理多进程的更多信息,请查看该库的 并行性、资源管理和配置 文档。

其他

支持的输入类型

auto-sklearn 可以接受以下任务的目标(更多详细信息请参见 Sklearn 算法

  • 二元分类

  • 多元分类

  • 多标签分类

  • 回归

  • 多输出回归

您可以向 auto-sklearn 提供特征和目标训练对(X_train/y_train)来拟合一系列 pipeline,如下一节所述。此 X_train/y_train 数据集必须属于支持的格式之一:np.ndarray, pd.DataFrame, scipy.sparse.csr_matrix 和 python lists。此外,您还可以通过提供可选的测试对(X_test/Y_test)来衡量此已拟合模型对未知数据的泛化能力。更多详细信息,请参考示例 性能随时间变化图

关于特征,有几点需要考虑:

  • 提供带有可选标志 feat_type 的 X_train/X_test numpy 数组。更多详细信息,请查看示例 特征类型

  • 您可以提供带有适当格式化列的 pandas DataFrame。如果列具有数值 dtype,auto-sklearn 将不会对其进行编码,并会直接传递给 scikit-learn。auto-sklearn 支持分类或字符串作为列类型。请确保您为任务使用了正确的 dtype。默认情况下,auto-sklearn 将 object 和 string 列视为字符串,并使用 sklearn.feature_extraction.text.CountVectorizer 对数据进行编码。

  • 如果您的数据包含分类值(在特征或目标中),请确保您明确将其标记为 categorical。标记为 categorical 的数据对于一维数据使用 sklearn.preprocessing.LabelEncoder 进行编码,对于多维数据使用 sklearn.preprodcessing.OrdinalEncoder 进行编码。

  • 有关如何正确编码数据的更多详细信息,您可以查看 Pandas 示例 处理分类数据)。如果您处理时间序列数据,建议您遵循此方法 处理时间数据

  • 如果您根本不希望使用字符串选项,可以禁用此选项。在这种情况下,objects、strings 和 categorical 列都将被编码为 categorical。

import autosklearn.classification
automl = autosklearn.classification.AutoSklearnClassifier(allow_string_features=False)
automl.fit(X_train, y_train)

关于目标(y_train/y_test),如果任务涉及分类问题,这些特征将自动编码。建议在拟合时同时提供 y_train 和 y_test,以便在这些分割之间创建通用编码(如果在拟合时仅提供 y_train,则分类编码器将无法处理 y_test 中独有的新类别)。如果任务是回归,则不会对目标进行编码。

模型持久化

auto-sklearn 主要是一个 scikit-learn 的包装器。因此,可以遵循 scikit-learn 的 持久化示例

Vanilla auto-sklearn

为了获得 高效且鲁棒的自动化机器学习 中使用的 vanilla auto-sklearn,请设置 ensemble_size=1, initial_configurations_via_metalearning=0allow_string_features=False

import autosklearn.classification
automl = autosklearn.classification.AutoSklearnClassifier(
    ensemble_size=1,
    initial_configurations_via_metalearning=0,
    allow_string_features=False,
)

大小为一的集成模型将始终选择根据其在验证集上的性能表现最好的当前模型。将元学习找到的初始配置设置为零,会使 auto-sklearn 使用常规的 SMAC 算法来建议新的超参数配置。

早期停止和回调

通过使用参数 get_trials_callback,我们可以获取运行结果的实时访问。查看此示例 早期停止和回调 了解更多!