以 Azure ML Python SDK 第 2 版 (預覽) 設定 AutoML 定型

適用於Python SDK azure-ai-ml 第 2 版 (預覽)

重要

此功能目前為公開預覽狀態。 此預覽版本是在沒有服務等級協定的情況下提供,不建議用於生產工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款

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

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

如果您想要使用 Azure Machine Learning CLI 第 2 版延伸模組提交定型作業,請參閱使用 CLI (第 2 版) 進行模型定型

先決條件

如要閱讀本文,您需要:

設定工作區

若要連線到工作區,您需要提供訂閱、資源群組和工作區名稱。 這些詳細資料會為 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 AML workspace
    subscription_id = "<SUBSCRIPTION_ID>"
    resource_group = "<RESOURCE_GROUP>"
    workspace = "<AML_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 參數的資料列數目。

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

大型資料

自動化 ML 支援使用為數不多、可在小型虛擬機器上成功地為巨量資料建置模型的演算法,在大型資料上進行定型。 自動化 ML 啟發學習法要仰賴屬性 (例如資料大小、虛擬機器記憶體大小、實驗逾時和特徵化設定) 來判斷是否應套用這些大型資料演算法。 深入了解自動化 ML 中支援的模型

如果您想要覆寫這些啟發學習法,請套用下列設定:

Task 設定 備註
封鎖資料串流演算法 使用 set_training() 函式中的 blocked_algorithms 參數,列出不想要使用的模型。 導致執行失敗或執行時間很久
使用資料串流演算法 使用 set_training() 函式中的 allowed_algorithms 參數,列出想要使用的模型。
使用資料串流演算法
(工作室 UI 實驗)
封鎖所有模型,但您想要使用的巨量資料演算法除外。

要執行實驗的計算

Azure ML 遠端計算 (叢集或計算執行個體) 目前僅支援使用 Python SDK 第 2 版 (或 CLI 第 2 版) 的自動化 ML 作業。

接下來,請決定要在何處訓練模型。 自動化 ML 定型實驗可在下列計算選項上執行。

  • 您的本機電腦,例如本機桌上型電腦或膝上型電腦 – 通常適用於資料集並不大,且您尚在探索階段時。 如需本機計算範例,請參閱此筆記本

設定您的實驗設定

有數個選項可用來設定自動化 ML 實驗。 這些設定參數會在您的工作方法中設定。 您也可以分別使用 set_training()set_limits() 函式來設定作業定型設定和允出準則

下列範例說明分類工作的必要參數,其中將精確度指定為主要計量,並指定 5 個交叉驗證折。


classification_job = automl.classification(
    compute=compute_name,
    experiment_name=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=600,  # timeout
    trial_timeout=20,  # trial_timeout
    max_trials=max_trials,
    # max_concurrent_trials = 4,
    # max_cores_per_trial: -1,
    enable_early_termination=True,
)

# Training properties are optional
classification_job.set_training(
    blocked_models=["LogisticRegression"], 
    enable_onnx_compatible_models=True
)

選取您的機器學習工作類型 (ML 問題)

您要先確認正在解決的機器學習問題種類,才能提交自動化 ML 作業。 此問題會決定自動化 ML 作業所使用的函式,以及要套用的模型演算法。

自動化 ML 支援表格式資料型工作 (分類、迴歸、預測)、電腦視覺工作 (例如,影像分類和物件偵測),以及自然語言處理工作 (例如,文字分類和實體辨識工作)。 深入了解工作類型

支援的演算法

在自動化和微調程序進行期間,自動化機器學習會嘗試使用不同的模型和演算法。 身為使用者,您不需要指定演算法。

工作方法會決定要套用的演算法/模型清單。 使用 set_training() setter 函式中的 allowed_algorithmsblocked_algorithms 參數,進一步使用可用的模型修改反覆項目,以便納入或排除。

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

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

主要計量

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

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

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

分類多類別案例的計量

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

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

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

您也可以在此參考頁面的 ClassificationPrimaryMetrics 列舉中,查看要在 Python 中使用的「列舉」

分類多標籤案例的計量

  • 若為文字分類多標籤,則「精確度」為目前唯一支援的主要計量。

  • 若為影像分類多標籤,則支援的主要計量會於 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 預測誤差視為相同,前提是用於迴歸的這兩個資料點屬於相同資料集,或屬於時間序列識別碼所指定的相同時間序列。 然而事實上,$20M 的薪水只預測了 $20k 的誤差是很接近的值 (很小的 0.1% 相對差異),但 $30k 卻誤差 $20k 就不是接近的值了 (很大的 67% 相對差異)。 為了解決相對差異的問題,您可以使用可用的主要計量來為模型定型,然後選取有最佳 mean_absolute_percentage_errorroot_mean_squared_log_error 的模型。

計量 使用案例範例
spearman_correlation
normalized_root_mean_squared_error 價格預測 (房屋/產品/小費)、評論分數預測
r2_score 飛機延誤、薪水預估、錯誤解決時間
normalized_mean_absolute_error

您也可以在此參考頁面的 RegressionPrimaryMetrics 列舉中,查看要在 Python 中使用的「列舉」

時間序列預測案例的計量

建議與迴歸案例所提到的類似。

計量 使用案例範例
normalized_root_mean_squared_error 價格預測 (預測)、庫存最佳化、需求預測
r2_score 價格預測 (預測)、庫存最佳化、需求預測
normalized_mean_absolute_error

您也可以在此參考頁面的 ForecastingPrimaryMetrics 列舉中,查看要在 Python 中使用的「列舉」

影像物件偵測案例的計量

  • 若為影像物件偵測,支援的主要計量會於 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 每個試驗 (子項目作業) 在終止前可執行的時間上限 (單位:分鐘)。 如果未指定,則會使用 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 工作室來進行一鍵式部署。 請了解如何從工作室部署已註冊的模型

後續步驟