共用方式為


使用 Azure Machine Learning CLI 和 Python SDK 設定表格式資料的 AutoML 定型

適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)

在本文中,了解如何使用 Azure Machine Learning Python SDK v2 來設定 AutoML 訓練作業。 AutoML 會為您選擇演算法和超參數,並產生可立即部署的模型。 本文提供了您可用來設定 AutoML 實驗之各種選項的詳細資料。

如果您偏好無程式碼體驗,您也可以使用工作室 UI 為表格式資料設定無程式碼 AutoML 訓練

先決條件

如若要使用 SDK 資訊,請安裝適用於 Python SDK v2 的 Azure Machine Learning。

您可以透過兩種方式來安裝 SDK:

  • 建立計算執行個體,該執行個體已安裝最新的 Azure Machine Learning Python SDK,並已針對 ML 工作流程進行設定。 如需詳細資訊,請參閱建立 Azure Machine Learning 計算執行個體
  • 在本機電腦上安裝 SDK。

設定您的工作區

若要連線到工作區,您必須提供訂用帳戶、資源群組和工作區。

工作區詳細資料會從 MLClient 進入 azure.ai.ml,以連線到您的 Azure Machine Learning 工作區。

以下範例使用預設的 Azure 驗證,並搭配預設的工作區設定或資料夾結構中 config.json 檔案的設定。 如果它未找到 config.json,則您需要在建立 MLClient 時手動提供訂用帳戶識別碼、資源群組和工作區。

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,如下列範例所示:

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 Machine Learning 中使用資料表

定型、驗證和測試資料

您可以指定個別的訓練資料和驗證資料集。 您必須向 AutoML 作業的工廠函式中的 training_data 參數提供訓練資料。

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

定型資料大小 驗證技術
大於 20,000 個資料列 AutoML 會套用訓練和驗證資料分割。 預設值會採用初始訓練資料集的 10% 作為驗證集。 然後,AutoML 會使用該驗證集來進行計量計算。
小於或等於 20000 個資料列 AutoML 會套用交叉驗證方法。 預設的摺疊數目取決於資料列數目。
如果資料集少於 1,000 列,AutoML 會使用十個摺疊。
如果資料列等於或介於 1,000 到 20,000 之間,AutoML 會使用三個摺疊。

要執行實驗的計算

使用 Python SDK v2 (或 CLI v2) 的 AutoML 作業目前僅在 Azure Machine Learning 遠端計算叢集或計算執行個體上受支援。 如需使用 Python SDKv2 或 CLIv2 建立計算的詳細資訊,請參閱使用 Azure Machine Learning CLI、SDK 和 REST API 訓練模型 (部分機器翻譯)。

設定您的實驗設定

您可以使用數個選項來設定您的 AutoML 實驗。 這些設定參數會在您的工作方法中設定。 您也可以使用 training 設定來設定作業定型設定和limits

以下範例展示了分類工作所需的參數,該工作將準確度指定為主要計量,並指定了五摺交叉驗證。

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 參數。

在下表中,探索每個機器學習工作支援的演算法。

分類 迴歸 時間序列預測
羅吉斯迴歸* 彈性網路* AutoARIMA
淺色 GBM* 淺色 GBM* 先知
梯度提升* 梯度提升* 彈性網路
決策樹* 決策樹* 淺色 GBM
K 最近鄰項目* K 最近鄰項目* K 最近鄰項目
線性 SVC* LARS 套索* 決策樹
支援向量分類 (SVC)* 隨機梯度下降 (SGD)* Arimax
隨機樹系* 隨機樹系 LARS 套索
極度隨機樹狀結構* 極度隨機樹狀結構* 極度隨機樹狀結構*
Xgboost* Xgboost* 隨機樹系
貝氏機率分類* Xgboost TCNForecaster
隨機梯度下降 (SGD)* 隨機梯度下降 (SGD) 漸層停駐提升
ExponentialSmoothing
SeasonalNaive
平均值
Naive
SeasonalAverage

使用其他演演算法:

如需每個工作類型的範例 Notebooks,請參閱 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_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 可能是更好的選擇。 它會衡量真實值與預測值之間的排名相關性。

AutoML 目前不支援任何量值預測與觀察之間的相對差異的主要計量。 計量 r2_scorenormalized_mean_absolute_errornormalized_root_mean_squared_error 都是絕對差異的量值。 例如,如果預測與觀察相差 10 個單位,則如果觀察值為 20 單位或 20,000 單位,則這些計量會計算出相同的值。 相較之下,百分比差異 (相對量值) 的誤差分別為 50% 和 0.05%。 若要最佳化相對差異,您可以使用支援的主要計量執行 AutoML,然後選取有最佳 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 列舉中定義。

資料特徵化

在每一次 AutoML 實驗中,您的資料都會自動轉換為數字和數字向量。 資料也會進行調整和正規化,以幫助對不同規模的特徵敏感的演算法能妥善運作。 這些資料轉換稱為特徵化

附註

AutoML 特徵化的步驟 (例如特徵正規化、處理遺漏的資料,以及將文字轉換為數值) 會成為基礎模型的一部分。 當您使用模型進行預測時,訓練期間所套用的相同特徵化步驟會自動套用至您的輸入資料。

當您設定 AutoML 作業時,您可以啟用或停用 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() 函式中定義一些選項,以在作業完成之前結束實驗。

準則 說明
無準則 若未定義任何結束參數,實驗會繼續進行,直到主要計量沒有進一步的進度為止。
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 後,即可在工作區執行下列命令。


# 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 為您提供了一些監視及評估訓練結果的選項。

  • 如需針對每次執行所提供的效能圖表和計量的定義和範例,請參閱評估 AutoML 實驗結果

  • 若要取得特徵化摘要,以及了解已新增至特定模型的特徵,請參閱特徵化透明度

從模型頁面的 Azure Machine Learning UI 中,您也可以檢視在訓練特定模型時所使用的超參數,也可以檢視及自訂所使用的內部模型的訓練程式碼。

註冊和部署模型

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

秘訣

對於已註冊的模型,您可以使用 Azure Machine Learning 工作室來進行一鍵部署。 請參閱部署您的模型

在管線中使用 AutoML

若要在機器學習作業工作流程中使用 AutoML,您可以將 AutoML 作業步驟新增至 Azure Machine Learning 管線。 此方法可讓您透過將資料準備指令碼連接到 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_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 屬性。

屬性 描述
訓練模式 表示訓練模式:distributednon_distributed。 預設為 non_distributed
max_nodes 每次試驗用於訓練的節點數。 此設定必須大於或等於 4。

下列程式碼範例顯示分類作業的這些設定範例:

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 屬性。

屬性 描述
訓練模式 表示定型模式 distributednon_distributed。 預設為 non_distributed
enable_dnn_training 設定此旗標以啟用深度類神經網路模型。
最大並行試驗次數 此值是要平行訓練的試驗模型的最大數目。 預設值為 1。
max_nodes 要用於定型的節點總數。 此設定必須大於或等於 2。 對於預測工作,每個試用模型都是使用 $\text{max}\left(2, \text{floor}( \text{max_nodes} / \text{max_concurrent_trials}) \right)$ 節點來定型。

下列程式碼範例顯示預測作業的這些設定的範例:

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
)

如需完整組態程式碼的範例,請參閱先前的組態作業提交小節。