Azure ML Python SDK v2 を使用して AutoML トレーニングを設定する

適用対象: Python SDK azure-ai-ml v2 (現行)

このガイドでは、Azure Machine Learning Python SDK v2 を使用して、自動機械学習 AutoML のトレーニング ジョブを設定する方法を説明します。 自動 ML では、ユーザーに代わってアルゴリズムとハイパーパラメーターを選択し、デプロイ可能なモデルを生成します。 このガイドでは、自動 ML 実験の構成に使用できるさまざまなオプションについて詳しく説明しています。

ノーコードで行いたい場合は、Azure Machine Learning スタジオでノーコードの Auto ML トレーニングを設定することもできます。

Azure Machine learning CLI v2 拡張機能を使用してトレーニング ジョブを送信する場合は、モデルをトレーニングするを参照してください。

前提条件

この記事では、以下が必要です。

  • Azure Machine Learning ワークスペース。 ワークスペースを作成するには、「ワークスペース リソースの作成」を参照してください。

  • Azure Machine Learning Python SDK v2 がインストールされていること。 SDK をインストールするには、次のいずれかを行います。

    • コンピューティング インスタンスを作成し、最新の AzureML Python SDK をあらかじめインストールし、ML ワークフロー用に事前構成します。 詳細については、「Azure Machine Learning コンピューティング インスタンスの作成と管理」を参照してください。

    • 次のコマンドを使用して、Azure ML Python SDK v2 をインストールします。

      • 以前のプレビュー バージョンをアンインストールします。
      pip uninstall azure-ai-ml
      
      • Azure ML Python SDK v2 をインストールします。
      pip install azure-ai-ml
      

    重要

    この記事の Python コマンドでは、最新の azureml-train-automl パッケージ バージョンが必要です。

ワークスペースのセットアップ

ワークスペースに接続するには、サブスクリプション、リソース グループ、ワークスペース名を指定する必要があります。 これらの詳細は、必要なAzure Machine Learning ワークスペースへのハンドルを取得するために、azure.ai.mlからMLClient の中で使用されます。

次の例では、既定の Azure 認証が、既定のワークスペース構成と共に使用されるか、フォルダー構造にコピーした config.json ファイルから使用されます。 config.json が見つからない場合は、MLClientを作成する際に subscription_id、resource_group および ワークスペース を手動で指定する必要があります。

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 AzureML 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 の使用をお勧めします。

次の YAML コードは、データ ファイル (.CSV または Parquet ファイル) と共にローカル フォルダーまたはクラウド内のリモート フォルダーに配置できる MLTable の定義です。

# MLTable definition file

paths:
  - file: ./bank_marketing_train_data.csv
transformations:
  - read_delimited:
        delimiter: ','
        encoding: 'ascii'

つまり、MLTable フォルダーには、MLTable 定義ファイルに加えてデータ ファイル (このケースでは bank_marketing_train_data.csv ファイル) が含まれます。

MLTable を作成する 2 つの方法を次に示します。

  • A. ローカル フォルダーのトレーニング データと MLTable 定義ファイルを指定すると、自動的にクラウド (デフォルトのワークスペース データストア) にアップロードされます
  • B. 既に登録され、クラウドにアップロードされている MLTable を指定します。
from azure.ai.ml.constants import AssetTypes
from azure.ai.ml import automl, Input

# A. Create MLTable for training data from your local directory
my_training_data_input = Input(
    type=AssetTypes.MLTABLE, path="./data/training-mltable-folder"
)

# B. Remote MLTable definition
my_training_data_input  = Input(type=AssetTypes.MLTABLE, path="azureml://datastores/workspaceblobstore/paths/Classification/Train")

トレーニング、検証、テストのデータ

個別のトレーニング データと検証データ セットを指定できますが、トレーニング データは、自動 ML ジョブのファクトリ関数の training_data パラメーターに指定する必要があります。

validation_data または n_cross_validation パラメーターを、明示的に指定しない場合、自動 ML では、デフォルトの手法を適用して検証の実行方法を決定します。 この決定は、training_data パラメーターに割り当てられたデータセット内の行の数によって異なります。

トレーニング データのサイズ 検証の方法
20,000 行を超える トレーニング/検証データの分割が適用されます。 既定では、初期トレーニング データ セットの 10% が検証セットとして取得されます。 次に、その検証セットがメトリックの計算に使用されます。
20,000 行以下 クロス検証アプローチが適用されます。 フォールドの既定の数は行数によって異なります。
データセットが 1,000 行より少ない場合は、10 個のフォールドが使用されます。
行数が 1,000 から 20,000 の場合は、3 個のフォールドが使用されます。

実験を実行するために計算する

Python SDK v2 (または CLI v2) を使用する自動 ML ジョブが現在サポートされるのは、Azure ML リモート コンピューティング (クラスターまたはコンピューティング インスタンス) のみです。

Python SDKv2 (または CLIv2) を使用したコンピューティングの作成について確認してください。

実験の設定を構成する

自動 ML 実験を構成するときは、いくつかのオプションを使用できます。 これらの構成パラメーターは、タスク メソッドに設定されます。 また、ジョブ トレーニング設定と終了基準も、それぞれ set_training() 関数と set_limits() 関数を使用して設定できます。

次の例は、精度をプライマリ メトリックと 5 分割交差検証として指定する分類タスクの必須パラメーターを示しています。

# note that the below is a code snippet -- you might have to modify the variable values to run it successfully
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=["LogisticRegression"], 
    enable_onnx_compatible_models=True
)

機械学習タスクの種類 (ML 問題) を選択する

自動 ML ジョブを送信する前に、解決しようとしている機械学習の問題の種類を特定する必要があります。 この問題により、自動 ML ジョブで使用される関数と、適用されるモデル アルゴリズムが決まります。

自動 ML では、表形式データに基づくタスク (分類、回帰、予測)、コンピューター ビジョン タスク (画像分類や物体検出など)、自然言語処理タスク (テキスト分類タスク、エンティティ認識タスクなど) がサポートされます。 タスクの種類についての詳細情報を参照してください。

サポートされているアルゴリズム

自動機械学習によって、自動化とチューニングのプロセス中にさまざまなモデルとアルゴリズムが試行されます。 ユーザーは、アルゴリズムを指定する必要はありません。

タスク メソッドによって、適用するアルゴリズム/モデルの一覧が決まります。 使用可能なモデルを包含または除外してさらにイテレーションを変更するには、set_training() setter 関数で allowed_training_algorithms または blocked_training_algorithms パラメーターを使用します。

次のリンクの一覧で、以下に示す機械学習タスクごとにサポートされているアルゴリズムを調べることができます。

分類 回帰 時系列予測
ロジスティック回帰* Elastic Net* AutoARIMA
Light GBM* Light GBM* Prophet
勾配ブースティング* 勾配ブースティング* Elastic Net
デシジョン ツリー* デシジョン ツリー* Light GBM
K ニアレスト ネイバー* K ニアレスト ネイバー* K ニアレスト ネイバー
Linear SVC* LARS Lasso* デシジョン ツリー
サポート ベクター分類 (SVC)* 確率的勾配降下法 (SGD)* Arimax
ランダム フォレスト* ランダム フォレスト LARS Lasso
Extremely Randomized Trees* Extremely Randomized Trees* Extremely Randomized Trees*
Xgboost* Xgboost* ランダム フォレスト
単純ベイズ* Xgboost ForecastTCN
確率的勾配降下法 (SGD)* 確率的勾配降下法 (SGD) 勾配ブースティング
ExponentialSmoothing
SeasonalNaive
Average
Naive
SeasonalAverage

以下のアルゴリズムが追加されています。

タスクの種類ごとのノートブックの例はこのリンクを参照してください。

主要メトリック

primary_metric パラメーターによって、モデルのトレーニング中に最適化のために使用されるメトリックが決まります。 選択できる使用可能メトリックは、選択したタスクの種類によって決まります。

自動 ML で何を primary metric (主要メトリック) に選ぶべきかは、多くの要素に左右されます。 最優先の考慮事項としてお勧めするのは、ビジネス ニーズを最も適切に表すメトリックを選択することです。 次に、メトリックがデータセット プロファイル (データのサイズ、範囲、クラスの分布など) に適しているかどうかを考慮します。 次のセクションでは、タスクの種類とビジネス シナリオに基づいて、推奨される主要メトリックをまとめています。

これらのメトリックの具体的な定義については、「自動化機械学習の結果の概要」を参照してください。

分類の多クラス シナリオのメトリック

これらのメトリックは、表形式データ、画像/Computer Vision や NLP テキストなど、すべての分類シナリオに適用されます。

accuracyrecall_score_weightednorm_macro_recall、並びにprecision_score_weighted などのしきい値に依存するメトリックでは、データセットが小さい場合や大きいクラス傾斜 (クラスの不均衡) がある場合、または予期されるメトリック値が 0.0 または 1.0 に非常に近い場合に、適切に最適化されないことがあります。 このような場合、主要メトリックには AUC_weighted が適しています。 自動 ML が完了したら、業務上の必要に最も適したメトリックを基準にして、最適なモデルを選ぶことができます。

メトリック ユース ケースの例
accuracy 画像分類、感情分析、チャーン予測
AUC_weighted 不正行為の検出、画像分類、異常検出/スパム検出
average_precision_score_weighted センチメント分析
norm_macro_recall チャーン予測
precision_score_weighted

分類の多ラベル シナリオのメトリック

  • テキスト分類の多ラベルでは、現在サポートされている唯一の主要なメトリックは 「正確性」 です。

  • 画像分類の多ラベルでは、サポートされる主要なメトリックが ClassificationMultilabelPrimaryMetrics Enum に定義されます。

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 はデータの分散の推定値で正規化された平均二乗誤差です。 これは、モデルでキャプチャできる変動の割合です。

Note

r2_scorenormalized_root_mean_squared_error はプライマリ メトリックと同様に動作します。 固定の検証セットが適用されている場合、これら 2 つのメトリックによって同じターゲットである平均二乗誤差が最適化され、同じモデルによって最適化されます。 トレーニング セットのみが使用可能であり、相互検証が適用される場合、normalized_root_mean_squared_error のノーマライザーはトレーニング セットの範囲として固定されていますが、r2_score のノーマライザーは各フォールドの変性であるため、フォールドごとに異なり、両者は若干異なります。

正確な値ではなく順位に関心がある場合は、実際の値と予測値の順位相関を測定する spearman_correlation を選ぶことをお勧めします。

ただし、現在のところ、相対的な差に対応する回帰の主要なメトリックはありません。 r2_scorenormalized_mean_absolute_errornormalized_root_mean_squared_error のいずれでも、これらの 2 つのデータ ポイントが回帰用の同じデータセット、または時系列識別子で指定された同じ時系列に属している場合、給料が 3 万ドルのワーカーと 2,000 万ドルのワーカーの 2 万ドルの予測誤差が同様に処理されます。 実際には、20,000 ドル隔たった 20,000,000 ドルの給与のみ予測することは非常に近く (相対差異は 0.1% で小さい)、一方 20,000 ドル隔たった 30,000 ドルを予測することは近くありません (相対差異は 67% で大きい)。 相対差の問題を解決するには、使用可能な主要メトリックを使ってモデルをトレーニングしてから、mean_absolute_percentage_error または root_mean_squared_log_error が最適なモデルを選ぶことができます。

メトリック ユース ケースの例
spearman_correlation
normalized_root_mean_squared_error 価格の予測 (家/製品/チップ)、レビュー スコアの予測
r2_score 飛行機の遅延、給与の見積もり、バグの解決時間
normalized_mean_absolute_error

時系列予測シナリオのメトリック

推奨事項は、回帰シナリオのものと似ています。

メトリック ユース ケースの例
normalized_root_mean_squared_error 価格の予測 (予想)、在庫の最適化、需要の予測
r2_score 価格の予測 (予想)、在庫の最適化、需要の予測
normalized_mean_absolute_error

画像物体検出シナリオのメトリック

  • 画像物体検出では、サポートされる主要なメトリックが ObjectDetectionPrimaryMetrics Enum に定義されます。

画像インスタンス セグメント化シナリオのメトリック

  • 画像インスタンス セグメント化シナリオでは、サポートされる主要なメトリックが InstanceSegmentationPrimaryMetrics Enum に定義されます。

データの特徴付け

すべての自動 ML 実験では、データは数値と数値のベクトルに自動的に変換されます (つまり、テキストが数値に変換されます)。加えて、さまざまなスケールの特徴を検知できる "特定の" アルゴリズムに対応するように、データのスケーリングと正規化も行われます。 このようなデータの変換、スケーリングおよび正規化は特徴量化と呼ばれます。

注意

自動化された機械学習の特徴付け手順 (機能の正規化、欠損データの処理、テキストから数値への変換など) は、基になるモデルの一部になります。 このモデルを予測に使用する場合、トレーニング中に適用されたのと同じ特徴付けの手順がご自分の入力データに自動的に適用されます。

自動 ML ジョブを構成するとき、.set_featurization() setter 関数を使用して 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 での子実行の実験は、既に別の実験が実行されているクラスターで実行することができます。 ただし、タイミングは、クラスターに含まれるノード数によって、および別の実験を実行するためにそれらのノードを使用できるかどうかによって異なります。

クラスター内の各ノードは、1 回のトレーニング実行を完了できる個別の仮想マシン (VM) として機能します。自動 ML の場合、これは子実行を意味します。 すべてのノードがビジー状態の場合は、新しい実験がキューに登録されます。 ただし、空きノードがある場合は、使用可能なノードと VM で、新しい実験によって自動 ML 子実行が並行して実行されます。

子実行とそれが実行されるタイミングを管理するには、実験ごとに専用のクラスターを作成し、実験の max_concurrent_iterations 数をクラスター内のノード数と一致させることをお勧めします。 このようにして、必要な同時子実行とイテレーションの数で、クラスターのノードをすべて同時に使用します。

.set_limits() setter 関数で max_concurrent_iterations を構成します。 構成されていない場合は、1 回の実験につき 1 回の同時子実行とイテレーションのみが既定で許可されます。 コンピューティング インスタンスの場合は、max_concurrent_trials をコンピューティング インスタンス VM 上のコア数と同じに設定できます。

モデルとメトリックを探索する

自動 ML では、トレーニング結果を監視および評価するためのオプションが提供されます。

モデルのページの Azure Machine Learning UI で、モデルをトレーニングするときに使用されたハイパーパラメーターを確認することもできます。また、使用された内部モデルのトレーニング コードを確認してカスタマイズすることもできます。

モデルを登録してデプロイする

モデルをテストし、運用環境で使うことを決めたら、後で使用できるようにモデルを登録することができます。

ヒント

登録済みのモデルの場合、Azure Machine Learning スタジオを使用してワンクリックでデプロイできます。 登録済みのモデルをスタジオからデプロイする方法に関するページを参照してください。

パイプラインでの AutoML

MLOps ワークフローで AutoML を利用するには、AzureML パイプラインに AutoML ジョブ ステップを追加します。 これにより、データ準備スクリプトを 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_classification = automl_classification(
    classification_train_data=Input(path="./training-mltable-folder/", type="mltable"),
    classification_validation_data=Input(path="./validation-mltable-folder/", type="mltable"),
)

# ...
# Note that the above is only 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 を組み込む方法を示すその他の例については、サンプル リポジトリを確認してください。

次のステップ