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

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

本文介绍如何使用 Azure 机器学习 Python SDK v2 设置 AutoML 训练作业。 AutoML 为你选取一个算法和超参数,并生成一个可供部署的模型。 本文详细介绍了可用于配置 AutoML 试验的各种选项。

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

先决条件

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

可以通过两种方式安装 SDK:

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

设置工作区

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

要连接到您的 Azure 机器学习工作区,请将工作区详细信息输入 MLClient 并从 azure.ai.ml 进行连接。

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

Python
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 的要求:

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

必须可以从远程计算访问训练数据。 AutoML v2(Python SDK 和 CLI/YAML)支持使用 MLTable 数据资产(v2)。 为了向后兼容,它还通过相同的输入数据集属性支持 v1 中的 v1 表格数据集(一种已注册的表格数据集)。 建议使用 v2 中提供的 MLTable。 在此示例中,数据存储在本地路径 ./train_data/bank_marketing_train_data.csv

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

python
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 机器学习中使用表

训练、验证和测试数据

可以指定单独的训练数据和验证数据集。 必须为 AutoML 作业的工厂函数中的 training_data 参数提供训练数据。

如果未显式指定 validation_datan_cross_validation 参数,AutoML 会应用默认技术来确定如何进行验证。 此决定依赖于分配给 training_data 参数的数据集中的行数。

训练数据大小 验证技术
大于 20,000 行 AutoML 应用训练和验证数据拆分。 默认值采用初始训练数据集的 10 个% 作为验证集。 然后,AutoML 使用该验证集进行指标计算。
小于或等于 20,000 行 AutoML 应用交叉验证方法。 默认折数取决于行数。
如果数据集少于 1,000 行,AutoML 将使用 10 倍交叉验证。
如果行等于或介于 1,000 到 20,000 之间,AutoML 将使用三个折叠。

用于运行试验的计算环境

Python SDK v2(或 CLI v2)的 AutoML 作业目前仅在 Azure 机器学习远程计算群集或计算实例上受支持。 有关使用 Python SDKv2 或 CLIv2 创建计算的详细信息,请参阅 使用 Azure 机器学习 CLI、SDK 和 REST API 训练模型

配置试验设置

可以使用多个选项来配置 AutoML 试验。 这些配置参数将在任务方法中设置。 你还可以分别使用 training 设置来设置作业训练设置和limits

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

python
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
)

选择机器学习任务类型

在提交 AutoML 作业之前,请确定要解决的机器学习问题类型。 此问题决定了你的作业使用的函数及其应用的模型算法。

AutoML 支持不同的任务类型:

  • 基于表格数据的任务

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

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

    • 文本分类
    • 实体识别

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

支持的算法

AutoML 在自动化和优化过程中尝试不同的模型和算法。 作为用户,你不需要指定算法。

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

在下表中,浏览每个机器学习任务支持的算法。

使用其他算法:

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

主要指标

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

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

若要了解这些指标的特定定义,请参阅 评估 AutoML 试验结果

分类多类方案的指标

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

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

指标 示例用例:
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_score 同时 normalized_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_error 或最佳模式 root_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 定义了支持的主要指标。

数据特征化

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

备注

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

配置 AutoML 作业时,可以启用或禁用 featurization 设置。

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

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

以下代码演示如何在此示例中为回归作业提供自定义特征化。

python
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 每个试运行(子作业)在终止之前可以运行的最长时间(分钟)。 如果未指定,AutoML 将使用值 1 个月或 43200 分钟。
enable_early_termination 如果评分在短期内没有提高,是否结束作业。
max_trials 在作业期间使用不同的算法和超参数组合执行的各个试运行/运行的最大次数。 如果未指定,则默认执行 1,000 次试运行。 如果使用 enable_early_termination,AutoML 可能会使用较少的试用版。
max_concurrent_trials 将并行运行的试验(子任务)的最大数目。 最好是将此数字与群集的节点数保持匹配。

运行试验

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

备注

如果多次运行具有相同配置设置和主要指标的试验,则可能会看到每个试验的最终指标分数和生成的模型的变化。 AutoML 使用的算法具有固有的随机性,这可能会导致试验输出的模型和推荐模型的最终指标分数(如准确性)略有变化。 你也可能会看到模型名称相同但使用的超参数不同的结果。

警告

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

根据先决条件中所述创建 MLClient 后,可在工作区中运行以下命令。

python

# 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

群集上的多个子运行

可以在已在运行另一个试验的群集上运行 AutoML 试验子运行。 计时取决于群集具有多少个节点,以及这些节点是否可用于运行不同的试验。

群集中的每个节点充当单个虚拟机 (VM),可以完成单个训练运行。 对于 AutoML,这意味着一个子运行过程。 如果所有节点都忙,AutoML 会将新试验排在队列中。 如果有可用节点,新试验将在可用节点或虚拟机中并行运行子进程。

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

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

探索模型和指标

AutoML 提供用于监视和评估训练结果的选项。

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

注册和部署模型

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

提示

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

使用管道中的 AutoML

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

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

python
# 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 分类与回归 1 TB(兆字节)
TCNForecaster 预测 200 GB

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

备注

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

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

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

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

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

python
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。 对于预测任务,每个试运行模型都使用 max(2,floor(max_nodes/max_concurrent_trials)) 节点进行训练。

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

python
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
)

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