使用 Azure 机器学习 CLI 和 Python SDK 为表格数据设置 AutoML 训练

适用范围:Azure CLI ml 扩展 v2(当前版本)Python SDK azure-ai-ml v2(当前版本)

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

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

先决条件

若要使用 SDK 信息,请安装适用于 Python 的 Azure 机器学习 SDK v2

若要安装该 SDK,你可以:

  • 创建一个计算实例,其中已安装最新的 Azure 机器学习 Python SDK 并针对 ML 工作流进行了预配置。 有关详细信息,请参阅创建 Azure 机器学习计算实例
  • 在本地计算机上安装 SDK

设置工作区

若要连接到工作区,需要提供订阅、资源组和工作区名称。

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 Azure Machine Learning 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。 在此示例中,我们假设数据存储在本地路径 ./train_data/bank_marketing_train_data.csv

可使用 mltable Python SDK 创建 MLTable,如以下示例所示:

import mltable

paths = [
    {'file': './train_data/bank_marketing_train_data.csv'}
]

train_table = mltable.from_delimited_files(paths)
train_table.save('./train_data')

此代码会创建一个新文件 ./train_data/MLTable,其中包含文件格式和加载说明。

现在,文件夹 ./train_data 包含 MLTable 定义文件以及数据文件 bank_marketing_train_data.csv

有关 MLTable 的详细信息,请参阅 mltable 操作指南一文

训练、验证和测试数据

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

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

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

用于运行试验的计算环境

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

详细了解使用 Python SDKv2(或 CLIv2)创建计算。

配置试验设置

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

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

from azure.ai.ml.constants import AssetTypes
from azure.ai.ml import automl, Input

# note that this is a code snippet -- you might have to modify the variable values to run it successfully

# make an Input object for the training data
my_training_data_input = Input(
    type=AssetTypes.MLTABLE, path="./data/training-mltable-folder"
)

# configure the classification job
classification_job = automl.classification(
    compute=my_compute_name,
    experiment_name=my_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_minutes=600, 
    trial_timeout_minutes=20, 
    max_trials=5,
    enable_early_termination=True,
)

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

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

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

自动化 ML 支持基于表格数据的任务(分类、回归、预测)、计算机视觉任务(例如图像分类和物体检测)和自然语言处理任务(例如文本分类和实体识别任务)。 有关详细信息,请参阅我们有关任务类型的文章。 有关设置预测作业的更多详细信息,请参阅我们的时序预测指南

支持的算法

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

任务方法决定了要应用的算法/模型列表。 在 AutoM 作业的 training 配置中使用 allowed_training_algorithmsblocked_training_algorithms 参数通过要包含或排除的可用模型来进一步修改迭代。

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

分类 回归 时序预测
逻辑回归* 弹性网络* AutoARIMA
Light GBM* Light GBM* Prophet
梯度提升* 梯度提升* 弹性网络
决策树* 决策树* Light GBM
K 最近的邻域* K 最近的邻域* K 最近的邻域
线性 SVC* LARS Lasso* 决策树
支持矢量分类 (SVC)* 随机梯度下降 (SGD)* Arimax
随机林* 随机林 LARS Lasso
极端随机树* 极端随机树* 极端随机树*
Xgboost* Xgboost* 随机林
Naive Bayes* Xgboost TCNForecaster
随机梯度下降 (SGD)* 随机梯度下降 (SGD) 渐进提升
ExponentialSmoothing
SeasonalNaive
平均值
Naive
SeasonalAverage

使用以下其他算法。

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

主要指标

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

分类多标签方案的指标

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

  • 对于图像分类多标签算法,支持的主要指标将在 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 可能是更好的选择,因为它会衡量实际值与预测值之间的排序相关性。

AutoML 目前不支持任何衡量预测值与观察值之间的相对差异的主要指标。 指标 r2_scorenormalized_mean_absolute_errornormalized_root_mean_squared_error 都是绝对差异的度量指标。 例如,如果预测值与观察值相差 10 个单位,则当观察结果为 20 个单位或 20,000 个单位时,这些指标将计算得到相同的值。 相比之下,百分比差异是一种相对衡量标准,其给出的误差分别为 50% 和 0.05%! 若要针对相对差异进行优化,可以使用支持的主要指标运行 AutoML,然后选择具有最佳 mean_absolute_percentage_errorroot_mean_squared_log_error 的模型。 请注意,当任何观察值为零时,这些指标是未定义的,因此它们可能并不总是很好的选择。

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

时序预测方案的指标

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

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

图像物体检测方案的指标

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

图像实例分段方案的指标

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

数据特征化

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

注意

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

配置自动化 ML 作业时,可以启用/禁用 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_minutes 每个试运行(子作业)在终止之前可以运行的最长时间(分钟)。 如果未指定,则使用 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 数与群集中的节点数匹配。 这样就可以同时使用群集的所有节点以及所需数量的并发子运行/迭代。

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

探索模型和指标

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

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

注册和部署模型

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

提示

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

管道中的 AutoML

若要在 MLOps 工作流中利用 AutoML,可以将 AutoML 作业步骤添加到 Azure 机器学习管道。 这样,便可以通过将数据准备脚本挂钩到 AutoML,然后注册并验证生成的最佳模型,来自动执行整个工作流。

下面是一个示例管道,其中包含 AutoML 分类组件和显示生成的 AutoML 输出的命令组件。 请注意输入(训练和验证数据)和输出(最佳模型)是如何在不同的步骤中引用的。

# Define pipeline
@pipeline(
    description="AutoML Classification Pipeline",
    )
def automl_classification(
    classification_train_data,
    classification_validation_data
):
    # define the automl classification task with automl function
    classification_node = classification(
        training_data=classification_train_data,
        validation_data=classification_validation_data,
        target_column_name="y",
        primary_metric="accuracy",
        # currently need to specify outputs "mlflow_model" explictly to reference it in following nodes 
        outputs={"best_model": Output(type="mlflow_model")},
    )
    # set limits and training
    classification_node.set_limits(max_trials=1)
    classification_node.set_training(
        enable_stack_ensemble=False,
        enable_vote_ensemble=False
    )

    command_func = command(
        inputs=dict(
            automl_output=Input(type="mlflow_model")
        ),
        command="ls ${{inputs.automl_output}}",
        environment="AzureML-sklearn-0.24-ubuntu18.04-py37-cpu:latest"
    )
    show_output = command_func(automl_output=classification_node.outputs.best_model)


pipeline_job = automl_classification(
    classification_train_data=Input(path="./training-mltable-folder/", type="mltable"),
    classification_validation_data=Input(path="./validation-mltable-folder/", type="mltable"),
)

# set pipeline level compute
pipeline_job.settings.default_compute = compute_name

# submit the pipeline job
returned_pipeline_job = ml_client.jobs.create_or_update(
    pipeline_job,
    experiment_name=experiment_name
)
returned_pipeline_job

# ...
# Note that this is a snippet from the bankmarketing example you can find in our examples repo -> https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-classification-bankmarketing-in-pipeline

有关如何在管道中包含 AutoML 的更多示例,请查看我们的示例存储库

大规模 AutoML:分布式训练

对于大型数据方案,AutoML 支持对有限的一组模型进行分布式训练:

分布式算法 受支持的任务 数据大小限制(近似值)
LightGBM 分类与回归 1TB
TCNForecaster 预测 200GB

分布式训练算法会自动在多个计算节点上对数据进行分区和分发,以便进行模型训练。

注意

分布式训练模式目前不支持交叉验证、集成模型、ONNX 支持和代码生成。 此外,AutoML 还可以做出选择,例如限制用于验证、可解释性和模型评估的可用特征化元素和子采样数据。

用于实现分类和回归的分布式训练

若要将分布式训练用于实现分类或回归,需要设置作业对象的 training_modemax_nodes 属性。

properties 说明
training_mode 指示训练模式;distributednon_distributed。 默认为 non_distributed
max_nodes 每个 AutoML 试运行用于进行训练的节点数。 该设置必须大于或等于 4。

以下代码示例演示了分类作业的这些设置的示例:

from azure.ai.ml.constants import TabularTrainingMode

# Set the training mode to distributed
classification_job.set_training(
    allowed_training_algorithms=["LightGBM"],
    training_mode=TabularTrainingMode.DISTRIBUTED
)

# Distribute training across 4 nodes for each trial
classification_job.set_limits(
    max_nodes=4,
    # other limit settings
)

注意

分类和回归任务的分布式训练目前不支持多个并发试运行。 模型试运行将按顺序执行,每个试运行均使用 max_nodes 节点。 max_concurrent_trials 限制设置目前将被忽略。

用于实现预测的分布式训练

若要了解分布式训练如何用于预测任务,请参阅我们的大规模预测一文。 若要使用分布式训练来实现预测,需要设置作业对象的 training_modeenable_dnn_trainingmax_nodes 和(可选的)max_concurrent_trials 属性。

properties 说明
training_mode 指示训练模式;distributednon_distributed。 默认为 non_distributed
enable_dnn_training 用于启用深度神经网络模型的标志。
max_concurrent_trials 这是要并行训练的最大试运行模型数。 默认值为 1。
max_nodes 用于训练的节点总数。 该设置必须大于或等于 2。 对于预测任务,每个试运行模型都使用 $\text{max}\left(2, \text{floor}( \text{max_nodes} / \text{max_concurrent_trials}) \right)$ 节点进行训练。

以下代码示例演示了预测作业的这些设置的示例:

from azure.ai.ml.constants import TabularTrainingMode

# Set the training mode to distributed
forecasting_job.set_training(
    enable_dnn_training=True,
    allowed_training_algorithms=["TCNForecaster"],
    training_mode=TabularTrainingMode.DISTRIBUTED
)

# Distribute training across 4 nodes
# Train 2 trial models in parallel => 2 nodes per trial
forecasting_job.set_limits(
    max_concurrent_trials=2,
    max_nodes=4,
    # other limit settings
)

有关完整配置代码的示例,请参阅前面有关配置作业提交的部分。

后续步骤