使用 Azure ML Python SDK v2(预览版)设置 AutoML 训练

适用于:Python SDK azure-ai-ml v2(预览版)

重要

此功能目前处于公开预览状态。 此预览版在提供时没有附带服务级别协议,不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅适用于 Azure 预览版的补充使用条款

本指南介绍如何使用 Azure 机器学习 Python SDK v2(预览版)设置自动化机器学习 (AutoML) 训练作业。 自动化 ML 将自动选择算法和超参数,并生成随时可用于部署的模型。 本指南提供了可用于配置自动化机器学习试验的各种选项的详细信息。

如果你更喜欢无代码体验,还可以 在 Azure 机器学习工作室中设置无代码自动化机器学习训练

如果你偏好使用 Azure 机器学习 CLI v2 扩展提交训练作业,请参阅使用 CLI (v2) 训练模型

先决条件

在本文中,你需要:

  • Azure 机器学习工作区。 若要创建工作区,请参阅创建工作区资源

  • 已安装 Azure 机器学习 Python SDK v2(预览版)。 若要安装该 SDK,你可以:

    • 创建一个计算实例,其中已安装最新的 AzureML Python SDK 并预先配置了 ML 工作流。 有关详细信息,请参阅创建和管理 Azure 机器学习计算实例

    • 使用以下命令安装 Azure ML Python SDK v2:

      • 卸载以前的预览版:
      pip uninstall azure-ai-ml
      
      • 安装 Azure ML Python SDK v2:
      pip install azure-ai-ml
      

    重要

    本文中的 Python 命令需要最新的 azureml-train-automl 包版本。

    • 将最新的 包安装到本地环境。
    • 有关最新 azureml-train-automl 包的详细信息,请参阅azureml-train-automl

设置工作区

若要连接到工作区,需要提供订阅、资源组和工作区名称。 azure.ai.ml 中的 MLClient 将使用这些详细信息来获取所需 Azure 机器学习工作区的句柄。

在以下示例中,默认 Azure 身份验证将与默认工作区配置一起使用,或者与复制到文件夹结构的任何 config.json 文件中的配置一起使用。 如果未找到 config.json,则你需要在创建 MLClient 时手动引入subscription_id、resource_group 和 workspace。

from azure.identity import DefaultAzureCredential
from azure.ai.ml import MLClient

credential = DefaultAzureCredential()
ml_client = None
try:
    ml_client = MLClient.from_config(credential)
except Exception as ex:
    print(ex)
    # Enter details of your AzureML workspace
    subscription_id = "<SUBSCRIPTION_ID>"
    resource_group = "<RESOURCE_GROUP>"
    workspace = "<AZUREML_WORKSPACE_NAME>"
    ml_client = MLClient(credential, subscription_id, resource_group, workspace)

数据源和格式

若要在 SDK v2 中向 AutoML 提供训练数据,需要通过 MLTable 将数据上传到云中。

将数据加载到 MLTable 的要求:

  • 数据必须为表格格式。
  • 要预测的值(目标列)必须位于数据中。

必须可以从远程计算访问训练数据。 自动化 ML v2(Python SDK 和 CLI/YAML)接受 MLTable 数据资产 (v2),不过,为了后向兼容,它还通过相同的输入数据集属性支持 v1 中的 v1 表格数据集(已注册的表格数据集)。 但是,建议使用 v2 中提供的 MLTable。

以下 YAML 代码是 MLTable 的定义,可将它连同数据文件(.CSV 或 Parquet 文件)一起放在本地文件夹中或云上的远程文件夹中。

# MLTable definition file

paths:
  - file: ./bank_marketing_train_data.csv
transformations:
  - read_delimited:
        delimiter: ','
        encoding: 'ascii'

因此,MLTable 文件夹将包含 MLTable 定义文件以及数据文件(在本例中为 bank_marketing_train_data.csv 文件)。

下面介绍了创建 MLTable 的两种方法。

  • A. 从本地文件夹提供训练数据和 MLTable 定义文件,它将自动上传到云中(默认的工作区数据存储)
  • B. 提供已注册并已上传到云的 MLTable。
from azure.ai.ml.constants import AssetTypes
from azure.ai.ml import automl, Input

# A. Create MLTable for training data from your local directory
my_training_data_input = Input(
    type=AssetTypes.MLTABLE, path="./data/training-mltable-folder"
)

# B. Remote MLTable definition
my_training_data_input  = Input(type=AssetTypes.MLTABLE, path="azureml://datastores/workspaceblobstore/paths/Classification/Train")

训练、验证和测试数据

可以指定单独的训练数据和验证数据集,但必须将训练数据提供给自动化 ML 作业的工厂函数中的 training_data 参数。

如果未显式指定 validation_datan_cross_validation 参数,则自动化 ML 将应用默认技术来决定如何执行验证。 此决定依赖于分配给 training_data 参数的数据集中的行数。

训练数据大小 验证技术
大于 20,000 行 将应用训练/验证数据拆分。 默认行为是将初始训练数据集的 10% 用作验证集。 然后,该验证集将用于指标计算。
小于 20,000 行 将应用交叉验证方法。 默认折数取决于行数。
如果数据集小于 1,000 行,则使用 10 折。
如果行数在 1,000 到 20,000 之间,则使用 3 折。

大型数据

自动化 ML 支持使用有限数量的算法针对大型数据进行训练,以便在小型虚拟机上成功生成大数据的模型。 自动化 ML 启发式方法依据数据大小、虚拟机内存大小、试验超时和特征化设置等属性来确定是否应该应用这些大型数据算法。 详细了解自动化 ML 支持哪些模型

如果要替代这些启发式方法,请应用以下设置:

任务 设置 说明
阻止数据流式处理算法 set_training() 函数中使用 blocked_algorithms 参数,并列出你不想要使用的模型。 导致运行失败或运行时间过长
使用数据流式处理算法 set_training() 函数中使用 allowed_algorithms 参数,并列出你想要使用的模型。
使用数据流式处理算法
(工作室 UI 试验)
阻止除要使用的大数据算法之外的所有模型。

用于运行试验的计算环境

目前只有 Azure ML 远程计算(群集或计算实例)支持使用 Python SDK v2(或 CLI v2)的自动化 ML 作业。

接下来,确定要在何处训练模型。 自动化机器学习训练试验可在以下计算选项中运行。

  • 本地台式机或便携式计算机等本地计算机 - 如果数据集较小,并且你仍然处于探索阶段,则通常使用此选项。 有关本地计算示例,请参阅此笔记本

配置试验设置

可以使用多个选项来配置自动化机器学习试验。 这些配置参数将在任务方法中设置。 还可以分别使用 set_training()set_limits() 函数来设置作业训练设置和退出条件

以下示例演示了某个分类任务的必需参数,该任务将准确度指定为主要指标,并指定了 5 个交叉验证折叠。


classification_job = automl.classification(
    compute=compute_name,
    experiment_name=exp_name,
    training_data=my_training_data_input,
    target_column_name="y",
    primary_metric="accuracy",
    n_cross_validations=5,
    enable_model_explainability=True,
    tags={"my_custom_tag": "My custom value"}
)

# Limits are all optional

classification_job.set_limits(
    timeout=600,  # timeout
    trial_timeout=20,  # trial_timeout
    max_trials=max_trials,
    # max_concurrent_trials = 4,
    # max_cores_per_trial: -1,
    enable_early_termination=True,
)

# Training properties are optional
classification_job.set_training(
    blocked_models=["LogisticRegression"], 
    enable_onnx_compatible_models=True
)

选择机器学习任务类型(ML 问题)

在提交自动化 ML 作业之前,需要先确定要解决的机器学习问题的类型。 此问题决定了自动化 ML 作业使用的函数及其应用的模型算法。

自动化 ML 支持基于表格数据的任务(分类、回归、预测)、计算机视觉任务(例如图像分类和物体检测)和自然语言处理任务(例如文本分类和实体识别任务)。 详细了解任务类型

支持的算法

在自动化和优化过程中,自动化机器学习会尝试各种模型和算法。 用户不需要指定算法。

任务方法决定了要应用的算法/模型列表。 在 set_training() setter 函数中使用 allowed_algorithmsblocked_algorithms 参数通过要包含或排除的可用模型来进一步修改迭代。

在以下链接列表中,可以浏览下面列出的每个机器学习任务支持的算法。

单击此链接获取每种任务类型的示例笔记本。

主要指标

primary_metric 参数决定了将在模型训练期间用于优化的指标。 可以选择的可用指标由选择的任务类型决定。

选择自动化机器学习要优化的主要指标取决于许多因素。 建议主要考虑选择最能体现业务需求的指标。 然后考虑指标是否适用于数据集配置文件(数据大小、范围、类分布等)。 以下部分根据任务类型和业务方案总结了推荐的主要指标。

如需了解上述指标的具体定义,请参阅了解自动化机器学习结果集

分类多类方案的指标

这些指标适用于所有分类方案,包括表格数据、图像/计算机视觉和 NLP 文本。

对于类别偏斜严重(类别不均衡)的小型数据集或预期的指标值非常接近 0.0 或 1.0 时,依赖阈值的指标(如 accuracyrecall_score_weightednorm_macro_recallprecision_score_weighted)可能也不是最优的。 在这些情况下,对于主要指标,AUC_weighted 可能是更好的选择。 自动机器学习完成后,可以根据最能满足你业务需求的指标选择所需模型。

指标 示例用例
accuracy 图像分类、情绪分析、流失预测
AUC_weighted 欺诈检测、图像分类、异常检测/垃圾邮件检测
average_precision_score_weighted 情绪分析
norm_macro_recall 流失预测
precision_score_weighted

还可以在此“ClassificationPrimaryMetrics 枚举”参考页中查看可在 Python 中使用的枚举

分类多标签方案的指标

  • 对于文本分类多标签算法,目前唯一支持的主要指标是“准确度”。

  • 对于图像分类多标签算法,支持的主要指标将在 ClassificationMultilabelPrimaryMetrics 枚举中定义

NLP 文本 NER(命名实体识别)方案的指标

  • 对于 NLP 文本 NER(命名实体识别)算法,目前唯一支持的主要指标是“准确度”。

回归方案的指标

r2_scorenormalized_mean_absolute_errornormalized_root_mean_squared_error 均在尝试最大限度减少预测错误。 r2_scorenormalized_root_mean_squared_error 在最大限度减少平均平方误差,同时 normalized_mean_absolute_error 在最大限度减少平均绝对误差值。 绝对值会将所有误差大小均视为错误,而平方误差会对具有较大绝对值的误差实行更多处罚。 可以选择优化平方误差或绝对误差,具体取决于是否错误越大则处罚越多。

r2_scorenormalized_root_mean_squared_error 的主要区别是二者的标准与含义。 normalized_root_mean_squared_error 是以范围为标准的根均方误差,可解释为预测的平均误差大小。 r2_score 是以数据方差估计值为标准的均方误差。 它是模型可捕获的变化比例。

备注

r2_scorenormalized_root_mean_squared_error 的作用类似于主要指标。 如果应用固定验证集,则这两个指标将优化均方误差这一相同目标,并将通过相同的模型进行优化。 如果只有一个训练集且应用交叉验证,则二者将略有不同,原因是 normalized_root_mean_squared_error 的规范化器将固定在训练集范围,而 r2_score 的规范化器作为每个折叠的方差,对于每个折叠均有所不同。

如果关注点是排序而非精确值,则 spearman_correlation 可能是更好的选择,因为它会衡量实际值与预测值之间的排序相关性。

然而,当前没有可处理相对差异的主要回归指标。 例如,对于 3 万美元的薪水和 2000 万美元的薪金,如果这两个数据点属于相同的回归数据集或时序标识符指定的同一时序,r2_scorenormalized_mean_absolute_errornormalized_root_mean_squared_error 均会将预测误差视为 2 万美元。 但实际上,在 2000 万美元薪水的基础上增减 2 万美元和增减前的预测应该非常接近(相对差值很小,增减占比 0.1%),而在 3 万美元薪水的基础上增减 2 万美元和增减前的预测应该非常大(相对差值很大,增减占比 67%)。 要处理相对差异的问题,可通过可用主要指标来训练模型,然后选择具有最佳 mean_absolute_percentage_errorroot_mean_squared_log_error 的模型。

指标 示例用例
spearman_correlation
normalized_root_mean_squared_error 价格预测(房屋/产品/小费),查看分数预测
r2_score 航空延迟、薪金估算、Bug 解决时间
normalized_mean_absolute_error

还可以在此“RegressionPrimaryMetrics 枚举”参考页中查看可在 Python 中使用的枚举

时序预测方案的指标

这些建议与针对回归方案提供的建议类似。

指标 示例用例
normalized_root_mean_squared_error 价格预测(预测)、库存优化、需求预测
r2_score 价格预测(预测)、库存优化、需求预测
normalized_mean_absolute_error

还可以在此“ForecastingPrimaryMetrics 枚举”参考页中查看可在 Python 中使用的枚举

图像物体检测方案的指标

  • 对于图像物体检测,支持的主要指标将在 ObjectDetectionPrimaryMetrics 枚举中定义

图像实例分段方案的指标

  • 对于图像实例分段方案,支持的主要指标将在 InstanceSegmentationPrimaryMetrics 枚举中定义

数据特征化

在每个自动化 ML 试验中,数据将自动转换为数字和数字向量(例如,将文本转换为数字),此外还会标量化和规范化,以帮助某些对采用不同标量的特征非常敏感的算法进行处理。 这种数据转换、标量化和规范化称为特征化。

注意

自动化机器学习特征化步骤(特征规范化、处理缺失数据,将文本转换为数字等)成为了基础模型的一部分。 使用模型进行预测时,将自动向输入数据应用在训练期间应用的相同特征化步骤。

配置自动化 ML 作业时,可以使用 .set_featurization() setter 函数来启用/禁用 featurization 设置。

下表显示了特征化接受的设置。

特征化配置 说明
"mode": 'auto' 指示在处理过程中自动执行数据护栏和特征化步骤。 默认设置。
"mode": 'off' 表示不应自动执行特征化步骤。
"mode": 'custom' 指示应当使用自定义特征化步骤。

以下代码演示了在这种情况下如何为回归作业提供自定义特征化。

from azure.ai.ml.automl import ColumnTransformer

transformer_params = {
    "imputer": [
        ColumnTransformer(fields=["CACH"], parameters={"strategy": "most_frequent"}),
        ColumnTransformer(fields=["PRP"], parameters={"strategy": "most_frequent"}),
    ],
}
regression_job.set_featurization(
    mode="custom",
    transformer_params=transformer_params,
    blocked_transformers=["LabelEncoding"],
    column_name_and_types={"CHMIN": "Categorical"},
)

退出条件

可以在 set_limits() 函数中定义几个选项,以便在作业完成之前结束试验。

条件 description
无条件 如果未定义任何退出参数,则试验将继续,直到主要指标不再需要执行其他步骤。
timeout 定义试验应继续运行多长时间(分钟)。如果未指定,则默认的作业总超时为 6 天(8,640 分钟)。 若要指定小于或等于 1 小时(60 分钟)的超时,请确保数据集的大小不大于 10,000,000(行数乘以列数),否则会出错。

此超时包括设置、特征化和训练运行,但不包括流程结束时的系综和模型可解释性运行,因为这些操作需要在所有试运行(子作业)完成后立即发生。
trial_timeout 每个试运行(子作业)在终止之前可以运行的最长时间(分钟)。 如果未指定,则使用 1 个月(43200 分钟)作为值
enable_early_termination 如果评分在短期内没有提高,是否结束作业
max_trials 在 AutoML 作业期间使用不同的算法和超参数组合执行的各个试运行/运行的最大次数。 如果未指定,则默认执行 1000 次试运行。 如果使用 enable_early_termination,则使用的试运行次数可以更少。
max_concurrent_trials 表示将并行执行的最大试运行(子作业)次数。 最好是将此数字与群集的节点数保持匹配

运行试验

警告

如果多次使用相同的配置设置和主要指标运行试验,你可能会发现每个试验的最终指标分数与生成的模型之间存在差异。 自动化 ML 使用的算法本身具有随机性,这可能会导致试验输出的模型与建议的模型的最终指标分数(如准确度)之间出现细微差异。 你看到的结果也可能会模型名称相同但使用的超参数不同。

提交试验以运行和生成模型。 根据先决条件中所述创建 MLClient 后,可在工作区中运行以下命令。


# Submit the AutoML job
returned_job = ml_client.jobs.create_or_update(
    classification_job
)  # submit the job to the backend

print(f"Created job: {returned_job}")

# Get a URL for the status of the job
returned_job.services["Studio"].endpoint

群集上的多个子运行

自动化 ML 试验子运行可以在已经运行另一个试验的群集上执行。 但是,计时取决于群集具有的节点数,以及这些节点是否可用于运行不同的试验。

群集中的每个节点充当单个可以完成一次训练运行的虚拟机 (VM);对于自动化 ML,这意味着一个子运行。 如果所有节点都处于忙状态,则新的试验将排队。 但是,如果有空闲节点,新的试验将在可用节点/VM 中并行运行自动化 ML 子运行。

为了管理子运行及其执行时间,建议你为每个试验创建一个专用群集,使试验的 max_concurrent_iterations 数与群集中的节点数匹配。 这样就可以同时使用群集的所有节点以及所需数量的并发子运行/迭代。

在 .set_limits() setter 函数中配置 max_concurrent_iterations。 如果未进行配置,则默认情况下每个试验仅允许一个并发子运行/迭代。 对于计算实例,可以将 max_concurrent_trials 设置为与计算实例 VM 上的核心数相同。

探索模型和指标

自动化 ML 提供用于监视和评估训练结果的选项。

在 Azure 机器学习 UI 中,还可以从模型页查看训练特定模型时使用的超参数,并可以查看和自定义使用的内部模型训练代码。

注册和部署模型

测试模型并确认你要在生产环境中使用它后,可以注册该模型以备后用。

提示

对于已注册的模型,可通过 Azure 机器学习工作室获取一键式部署。 请参阅如何从工作室部署已注册的模型

后续步骤