使用扫描作业进行超参数优化

已完成

在 Azure 机器学习中,可以通过运行扫描作业来优化超参数。

创建用于超参数优化的训练脚本

若要运行扫描作业,需要创建一个训练脚本,就像你在其他任何训练作业中所做的那样,只不过脚本必须

  • 为每个要改变的超参数添加参数。
  • 使用 MLflow 记录目标性能指标。 记录的指标使扫描作业能够评估它启动的试验的性能,并识别出生成最佳性能模型的运行。

例如,下面的示例脚本使用 --regularization 参数来训练逻辑回归模型,以设置正则化率超参数,并记录名为“Accuracy”的准确度指标:

import argparse
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import mlflow

# get regularization hyperparameter
parser = argparse.ArgumentParser()
parser.add_argument('--regularization', type=float, dest='reg_rate', default=0.01)
args = parser.parse_args()
reg = args.reg_rate

# load the training dataset
data = pd.read_csv("data.csv")

# separate features and labels, and split for training/validatiom
X = data[['feature1','feature2','feature3','feature4']].values
y = data['label'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)

# train a logistic regression model with the reg hyperparameter
model = LogisticRegression(C=1/reg, solver="liblinear").fit(X_train, y_train)

# calculate and log accuracy
y_hat = model.predict(X_test)
acc = np.average(y_hat == y_test)
mlflow.log_metric("Accuracy", acc)

配置并运行扫描作业

若要准备扫描作业,必须先创建一个基础命令作业,该作业指定要运行的脚本并定义脚本使用的参数:

from azure.ai.ml import command

# configure command job as base
job = command(
    code="./src",
    command="python train.py --regularization ${{inputs.reg_rate}}",
    inputs={
        "reg_rate": 0.01,
    },
    environment="AzureML-sklearn-0.24-ubuntu18.04-py37-cpu@latest",
    compute="aml-cluster",
    )

然后,可以使用搜索空间替代输入参数:

from azure.ai.ml.sweep import Choice

command_job_for_sweep = job(
    reg_rate=Choice(values=[0.01, 0.1, 1]),
)

最后,在命令作业上调用 sweep() 以扫描搜索空间:

from azure.ai.ml import MLClient

# apply the sweep parameter to obtain the sweep_job
sweep_job = command_job_for_sweep.sweep(
    compute="aml-cluster",
    sampling_algorithm="grid",
    primary_metric="Accuracy",
    goal="Maximize",
)

# set the name of the sweep job experiment
sweep_job.experiment_name="sweep-example"

# define the limits for this sweep
sweep_job.set_limits(max_total_trials=4, max_concurrent_trials=2, timeout=7200)

# submit the sweep
returned_sweep_job = ml_client.create_or_update(sweep_job)

监视和查看扫描作业

可以在 Azure 机器学习工作室中监视扫描作业。 扫描作业将为要试验的每个超参数组合启动试验。 对于每个试验,可以查看所有记录的指标。

此外,还可以通过在工作室中可视化试验来评估和比较模型。 可以调整每个图表,以显示和比较每个试验的超参数值和指标。

提示

详细了解如何可视化超参数优化作业