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

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

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

如果你更喜欢无代码体验,也可以使用工作室 UI 为表格数据设置无代码自动化 ML 训练

先决条件

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

若要安装该 SDK,你可以:

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

设置工作区

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

azure.ai.ml 中的 MLClient 将使用这工作区详细信息来获取所需 Azure 机器学习工作区的句柄。

以下示例使用默认 Azure 身份验证和默认工作区配置或文件夹结构中 config.json 文件内的配置。 如果它未找到 config.json,则你需要在创建 MLClient 时手动引入订阅 ID、资源组和工作区。

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 中提供训练数据,需要通过 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 的详细信息,请参阅在 Azure 机器学习中使用表

训练、验证和测试数据

可以指定单独的训练数据和验证数据集。 必须将训练数据提供给自动化机器学习作业的工厂函数中的 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)的自动化机器学习作业。 有关使用 Python SDKv2 或 CLIv2 创建计算的详细信息,请参阅使用 Azure 机器学习 CLI、SDK 和 REST API 训练模型

配置试验设置

可以使用多个选项来配置自动化机器学习试验。 这些配置参数将在任务方法中设置。 你还可以分别使用 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 支持不同的任务类型:

  • 基于表格数据的任务

    • 分类
    • 回归
    • 预测
  • 计算机视觉任务,包括

    • 图像分类
    • 对象检测
  • 自然语言处理任务,包括

    • 文本分类
    • 实体识别

有关详细信息,请参阅任务类型。 有关设置预测作业的详细信息,请参阅设置 AutoML 以训练时序预测模型

支持的算法

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

任务方法决定了要应用的算法或模型列表。 若要通过可包含或排除的可用模型来进一步修改迭代,请在作业的 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

使用其他算法:

有关每个任务类型的示例笔记本,请参阅 automl-standalone-jobs

主要指标

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

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

若要了解这些指标的特定定义,请参阅评估自动化机器学习试验结果

分类多类方案的指标

这些指标适用于所有分类方案,包括表格数据、图像或计算机视觉以及自然语言处理文本 (NLP-Text)。

对于类别偏斜严重(类别不均衡)的小型数据集或预期的指标值非常接近 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 文本命名实体识别方案的指标

对于 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 可以是更好的选择。 它测量实际值和预测之间的排名相关性。

自动化 ML 目前不支持任何衡量预测值与观察值之间的相对差异的主要指标。 指标 r2_scorenormalized_mean_absolute_errornormalized_root_mean_squared_error 都是绝对差异的度量指标。 例如,如果预测值与观察值相差 10 个单位,则当观察结果为 20 个单位或 20,000 个单位时,这些指标将计算得到相同的值。 相比之下,百分比差异是一种相对衡量标准,其给出的误差分别为 50% 和 0.05%。 若要针对相对差异进行优化,可以使用支持的主要指标运行自动化 ML,然后选择具有最佳 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 枚举中定义。

数据特征化

在每个自动化机器学习试验中,数据会自动转换为数字和数字矢量。 数据也会进行缩放和规范化,以帮助对比例不同的特征敏感的算法。 这些数据转换称为“特征化”。

注意

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

配置自动化机器学习作业时,可以启用或禁用 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 在作业期间使用不同的算法和超参数组合执行的各个试运行/运行的最大次数。 如果未指定,则默认执行 1,000 次试运行。 如果使用 enable_early_termination,则使用的试运行次数可以更少。
max_concurrent_trials 表示将并行执行的最大试运行(子作业)次数。 最好是将此数字与群集的节点数保持匹配。

运行试验

提交试验以运行和生成模型。

注意

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

警告

如果你已在工作区的防火墙或网络安全组中设置了规则,请验证是否向配置入站和出站网络流量中定义的入站和出站网络流量授予了所需的权限。

根据先决条件中所述创建 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,这一事实意味着子运行。 如果所有节点都处于忙碌状态,则新的试验将排队。 如果有空闲节点,新试验将在可用节点或虚拟机中并行运行子运行。

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

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

探索模型和指标

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

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

注册和部署模型

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

提示

对于已注册的模型,可以使用 Azure 机器学习工作室进行一键式部署。 请参阅部署模型

使用管道中的 AutoML

若要在机器学习运营工作流中使用自动化 ML,可以将 AutoML 作业步骤添加到你的 Azure 机器学习管道。 此方法允许通过将数据准备脚本连接到自动化 ML 来自动执行整个工作流。 然后注册并验证生成的最佳模型。

此代码是一个示例管道,其中包含自动化 ML 分类组件和显示生成的输出的命令组件。 此代码引用了不同步骤中的输入(训练和验证数据)和输出(最佳模型)。

# 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

有关如何在管道中包含自动化 ML 的更多示例,请参阅示例存储库

大规模使用 AutoML:分布式训练

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

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

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

注意

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

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

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

properties 说明
training_mode 指示训练模式:distributednon_distributed。 默认为 non_distributed
max_nodes 每个试运行用于进行训练的节点数。 该设置必须大于或等于 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
)

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