Verwenden eines Sweepauftrags für die Hyperparameteroptimierung

Abgeschlossen

In Azure Machine Learning können Sie Hyperparameter optimieren, indem Sie einen Sweepauftrag ausführen.

Erstellen eines Trainingsskripts für die Hyperparameteroptimierung

Zum Ausführen eines Sweepauftrags müssen Sie wie für jeden anderen Trainingsauftrag ein Trainingsskript erstellen, mit dem Unterschied, dass das Skript folgende Bedingungen erfüllen muss:

  • Einschließen eines Arguments für jeden Hyperparameter, den Sie variieren möchten.
  • Die Zielleistungsmetrik muss mit MLflow protokolliert werden. Eine protokollierte Metrik ermöglicht dem Sweepauftrag, die Leistung der von ihm initiierten Tests auszuwerten und den Durchlauf zu identifizieren, der das Modell mit der besten Leistung hervorbringt.

Das folgende Beispielskript trainiert beispielsweise ein logistisches Regressionsmodell mithilfe eines --regularization-Arguments, um den regularization rate-Hyperparameter festzulegen, und protokolliert die accuracy-Metrik mit dem Namen 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)

Konfigurieren und Ausführen eines Sweepauftrags

Zum Vorbereiten des Sweepauftrags müssen Sie zunächst einen grundlegenden Befehlsauftrag erstellen, der angibt, welches Skript ausgeführt werden soll, und die vom Skript verwendeten Parameter definiert:

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",
    )

Anschließend können Sie Ihre Eingabeparameter mit Ihrem Suchbereich überschreiben:

from azure.ai.ml.sweep import Choice

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

Rufen Sie schließlich sweep() in Ihrem Befehlsauftrag auf, um den Suchbereich zu durchsuchen:

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)

Überwachen und Überprüfen von Sweepaufträgen

Sie können Sweepaufträge in Azure Machine Learning Studio überwachen. Der Sweepauftrag initiiert Tests für jede Hyperparameterkombination, die getestet werden soll. Für jeden Test können Sie alle protokollierten Metriken überprüfen.

Darüber hinaus können Sie Modelle auswerten und vergleichen, indem Sie die Tests im Studio visualisieren. Sie können jedes Diagramm anpassen, um die Hyperparameterwerte und Metriken für jeden Test anzuzeigen und zu vergleichen.