使用 Azure Machine Learning Python SDK v2 設定 AutoML 訓練

適用於Python SDK azure-ai-ml v2 (現行)

使用本指南,了解如何使用 Azure Machine Learning Python SDK v2,設定自動化機器學習、AutoML、定型作業。 自動化 ML 會為您挑選演算法和超參數,並產生馬上可進行部署的模型。 本指南會詳述各種可讓您用來設定自動化 ML 實驗的選項。

如果您想要使用無程式碼的體驗,則也可以在 Azure Machine Learning 工作室中設定無程式碼 AutoML 定型

如果您想要使用 Azure Machine Learning CLI v2 擴充功能提交定型作業,請參閱 定型模型

先決條件

如要閱讀本文,您需要:

設定工作區

若要連線到工作區,您需要提供訂閱、資源群組和工作區名稱。 這些詳細資料會為 azure.ai.ml 中的 MLClient 所用,以掌握必要的 Azure Machine Learning 工作區。

在下列範例中,預設 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 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 第 2 版中,將定型資料提供給 AutoML,則需要透過 MLTable 將其上傳至雲端。

將資料載入 MLTable 的需求:

  • 資料必須是表格形式。
  • 要預測的值 (目標資料行) 必須位於資料中。

必須可從遠端計算存取定型資料。 自動化 ML 第 2 版 (Python SDK 和 CLI/YAML) 接受 MLTable 資料資產 (第 2 版),不過因為具備回溯相容性,因此也可透過相同輸入資料集屬性,支援自第 1 版 開始的表格式資料集 (已註冊的表格資料集)。 在此仍建議您使用第 2 版所提供的 MLTable。

下列 YAML 程式碼是 MLTable 的定義;其中 MLTable 可隨資料檔案 (.CSV 或 Parquet 檔案) 放在本機資料夾或雲端的遠端資料夾。

# MLTable definition file

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

因此,MLTable 資料夾會有 MLTable 定義檔和資料檔案 (在此案例中為 bank_marketing_train_data.csv 檔)。

下列說明兩種建立 MLTable 的方式。

  • 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 作業的 Factory 函式中提供 training_data 參數。

如果您未明確指定 validation_datan_cross_validation 參數,自動化 ML 會套用預設技術,以決定如何執行驗證。 會做出什麼決定取決於資料集內指派給 training_data 參數的資料列數目。

定型資料大小 驗證技術
大於 20000 個資料列 套用定型/驗證資料分割。 預設值是以 10% 的初始定型資料集做為驗證集。 接著,該驗證集會用於計量計算。
小於或等於 20000 個資料列 套用交叉驗證方法。 預設的摺疊數目取決於資料列數目。
如果資料集少於 1000 個資料列,則會使用 10 個摺疊。
如果資料列等於或介於 1000 到 20000 個之間,則會使用三個摺疊。

要執行實驗的計算

目前只有 Azure Machine Learning 遠端計算 (叢集或計算實例) 才支援使用 Python SDK v2 (或 CLI v2) 的自動化 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_algorithmsblocked_training_algorithms 參數,進一步使用可用的模型修改反覆項目,以便納入或排除。

在下列連結清單中,您可以探索以下各種機器學習工作所支援的演算法。

分類 迴歸 時間序列預測
羅吉斯迴歸* 彈性網路* AutoARIMA
Light GBM* Light GBM* Prophet
梯度提升* 梯度提升* 彈性網路
決策樹* 決策樹* Light GBM
K 最近鄰項目* K 最近鄰項目* K 最近鄰演算法
線性 SVC* LARS Lasso* 決策樹
支援向量分類 (SVC)* 隨機梯度下降 (SGD)* Arimax
隨機樹系* 隨機樹系 LARS Lasso
極度隨機樹狀結構* 極度隨機樹狀結構* 極度隨機樹狀結構*
Xgboost* Xgboost* 隨機樹系
貝氏機率分類* Xgboost ForecastTCN
隨機梯度下降 (SGD)* 隨機梯度下降 (SGD) 漸層停駐提升
ExponentialSmoothing
SeasonalNaive
Average
Naive
SeasonalAverage

使用下列其他演算法。

如需每一種工作類型的範例筆記本,請參閱此連結

主要計量

primary_metric 參數會決定在模型定型期間要用於最佳化的計量。 您可以選取的可用計量由您選擇的工作類型來決定。

為要最佳化的自動化 ML 選擇主要計量取決於許多因素。 建議您優先考慮選擇最能代表您商務需求的計量。 然後,再考慮該計量是否適用於您的資料集設定檔 (資料大小、範圍、類別分佈等等)。 下列各節會摘要說明根據工作類型和商務案例所建議的主要計量。

請在了解自動化機器學習結果中了解這些計量的特定定義。

分類多類別案例的計量

這些計量適用於所有分類案例,包括表格式資料、影像/電腦視覺和 NLP-文字。

對於小型資料集、類別大幅扭曲 (類別不平衡) 的資料集,或資料集預期的計量值極接近 0.0 或 1.0 時,閾值相依計量 (例如 accuracyrecall_score_weightednorm_macro_recallprecision_score_weighted) 可能無法最佳化。 在這些情況下,AUC_weighted 會是比較好的主要計量選擇。 自動化 ML 完成後,您可以根據最適合您商務需求的計量選擇勝出的模型。

計量 使用案例範例
accuracy 影像分類、情感分析、客戶流失預測
AUC_weighted 詐騙偵測、影像分類、異常偵測/垃圾郵件偵測
average_precision_score_weighted 情感分析
norm_macro_recall 客戶流失預測
precision_score_weighted

分類多標籤案例的計量

  • 如果是文字分類,目前多標籤的「正確性」是唯一支援的主要計量。

  • 若為影像分類多標籤,則支援的主要計量會於 ClassificationMultilabelPrimaryMetrics 列舉中定義

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 是由資料變異數的估計值加以正規化的平均平方誤差。 這是模型可以擷取到的變異比例。

注意

r2_scorenormalized_root_mean_squared_error 的行為模式和主要計量類似。 如果套用固定的驗證集,這兩個計量會將相同的目標 (即平均平方誤差) 最佳化,而且會由相同的模型進行最佳化。 如果只有定型集可供使用且套用了交叉驗證,則這兩個計量會稍有不同,因為 normalized_root_mean_squared_error 的正規化程式會固定為定型集的範圍,但是 r2_score 的正規化程式會隨每個摺疊而異,因為其為每個摺疊的變異數。

如果想要排名 (而不是確切值),則 spearman_correlation 會是比較好的選擇,因為其會測量實際值與預測之間的排名相互關聯。

不過,目前迴歸沒有任何主要計量可解決相對差異。 針對薪水為 $30k 的工作者和賺了 $20M 的工作者,r2_scorenormalized_mean_absolute_errornormalized_root_mean_squared_error 全都會將 $20k 預測誤差視為相同,前提是用於迴歸的這兩個資料點屬於相同資料集,或屬於時間序列識別碼所指定的相同時間序列。 雖然在現實中,預測 2 千萬美元的薪水只有 2 萬的誤差是非常接近的 (0.1% 的細微相對差異),但預測 3 萬美元卻誤差 2 萬美元就相距甚遠了 (67% 的大幅相對差異)。 為了解決相對差異的問題,您可以使用可用的主要計量來為模型定型,然後選取有最佳 mean_absolute_percentage_errorroot_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 列舉中定義

影像執行個體分割案例的計量

  • 若為影像執行個體分割情境,則支援的主要計量是在 InstanceSegmentationPrimaryMetrics 列舉中定義

資料特徵化

在每個自動化 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 實驗子執行。 不過,時機取決於叢集擁有的節點數目,以及這些節點是否可用來執行不同實驗。

叢集中的每個節點都會作為個別的虛擬機器 (VM),並可完成單一定型執行;對自動化 ML 來說,這代表子執行。 如果所有節點都處於忙碌狀態,則會將新實驗排入佇列。 但如果有可用節點,新實驗就會在可用節點/VM 中平行執行自動化 ML 子執行。

為了協助管理子執行及其可以執行的時間,建議您為每個實驗建立專用叢集,並讓實驗的 max_concurrent_iterations 數目符合叢集中的節點數目。 如此一來,您就可以同時使用叢集的所有節點,以及您想要的並行子執行/反覆項目數目。

在 .set_limits() setter 函式中,設定 max_concurrent_iterations。 如果未設定,則每個實驗預設只能允許一個並行的子執行/反覆項目。 如果是計算執行個體,則可將 max_concurrent_trials 設定為與計算執行個體 VM 上的核心數目相同的值。

探索模型和計量

自動化 ML 提供了一些選項供您監視及評估定型結果。

進行特定模型的定型時,您可以從模型頁面的 Azure Machine Learning UI 檢視所用的超參數,也可檢視並自訂已使用的內部模型定型程式碼。

註冊和部署模型

測試模型並確認要在生產環境中使用之後,便可註冊該模型以供稍後使用。

提示

針對已註冊的模型,可透過 Azure Machine Learning 工作室來進行一鍵式部署。 請了解如何從工作室部署已註冊的模型

管線中的 AutoML

若要在 MLOps 工作流程中運用 AutoML,您可以將 AutoML 作業步驟新增至 Azure Machine Learning 管線。 這可讓您將資料準備指令碼連結至 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 的更多範例,請參閱我們的範例存放庫

後續步驟