使用 Azure Machine Learning CLI 和 Python SDK 設定表格式資料的 AutoML 定型
適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)
在本文中,瞭解如何使用 Azure 機器學習 Python SDK v2 設定自動化機器學習 (AutoML) 定型作業。 自動化 ML 會為您挑選演算法和超參數,並產生馬上可進行部署的模型。 本文提供可用來設定自動化機器學習實驗的各種選項詳細數據。
如果您偏好無程式代碼體驗,您也可以 使用 Studio UI 設定表格式數據的無程式代碼自動化 ML 定型。
必要條件
- Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。 試用免費或付費版本的 Azure Machine Learning。
- Azure Machine Learning 工作區。 如果您沒有資源,請參閱 建立資源以開始使用。
如若要使用 SDK 資訊,請安裝適用於 Python SDK v2 的 Azure Machine Learning。
若要安裝 SDK,您可以:
- 建立計算實例,此實例已經有最新的 Azure 機器學習 Python SDK,並已針對 ML 工作流程進行設定。 如需詳細資訊,請參閱建立 Azure Machine Learning 計算執行個體。
- 在本機電腦上安裝SDK。
設定您的工作區
若要連線到工作區,您必須提供訂用帳戶、資源群組和工作區。
這些工作區詳細資料會為 azure.ai.ml
中的 MLClient
所用,以掌握必要的 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 的需求:
- 資料必須是表格形式。
- 要預測的值, 目標數據行必須位於數據中。
必須可從遠端計算存取定型資料。 自動化 ML 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 機器學習 中使用數據表。
定型、驗證和測試資料
您可以指定個別 的定型資料和驗證資料集。 訓練數據必須提供給 training_data
自動化機器學習作業 Factory 函式中的 參數。
如果您未明確指定 validation_data
或 n_cross_validation
參數,自動化 ML 會套用預設技術來判斷驗證的執行方式。 會做出什麼決定取決於資料集內指派給 training_data
參數的資料列數目。
定型資料大小 | 驗證技術 |
---|---|
大於 20,000 個資料列 | 已套用定型和驗證數據分割。 預設值是以 10% 的初始定型資料集做為驗證集。 接著,該驗證集會用於計量計算。 |
小於或等於 20000 個資料列 | 套用交叉驗證方法。 預設的摺疊數目取決於資料列數目。 如果數據集少於 1,000 個數據列,則會使用十個折疊。 如果數據列等於或介於 1,000 到 20,000 之間,則會使用三個折疊。 |
計算要執行的實驗
目前只有 Azure 機器學習 遠端計算叢集或計算實例支援 Python SDK v2 的自動化機器學習作業(或 CLI v2)。 如需使用 Python SDKv2 或 CLIv2 建立計算的詳細資訊,請參閱使用 Azure 機器學習 CLI、SDK 和 REST API 將模型定型。
設定您的實驗設定
有數個選項可用來設定自動化機器學習實驗。 這些設定參數會在您的工作方法中設定。 您也可以使用 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
)
選取您的機器學習工作類型
在提交自動化 ML 作業之前,請先判斷您想要解決的機器學習問題種類。 此問題會決定您的作業所使用的函式,以及其所套用的模型演算法。
自動化 ML 支援不同的工作型態:
表格式數據型工作
- 分類
- 迴歸
- 預測
計算機視覺工作,包括
- 影像分類
- 物件偵測
自然語言處理工作,包括
- 文字分類
- 實體辨識
如需詳細資訊,請參閱 工作類型。 如需設定預測作業的詳細資訊,請參閱 設定 AutoML 以定型時間序列預測模型。
支援的演算法
在自動化和微調程序進行期間,自動化機器學習會嘗試使用不同的模型和演算法。 身為使用者,您不需要指定演算法。
工作方法會決定要套用的演算法或模型清單。 若要使用可用的模型進一步修改反覆專案以包含或排除,請在allowed_training_algorithms
作業的組態中使用 training
或 blocked_training_algorithms
參數。
在下表中,探索每個機器學習工作支持的演算法。
分類 | 迴歸 | 時間序列預測 |
---|---|---|
羅吉斯迴歸* | 彈性網路* | AutoARIMA |
Light GBM* | Light GBM* | Prophet |
漸層停駐提升* | 漸層停駐提升* | 彈性網路 |
決策樹* | 決策樹* | Light GBM |
K 最近鄰演算法* | K 最近鄰演算法* | K 最近鄰演算法 |
線性 SVC* | LARS Lasso* | 決策樹 |
支援向量分類 (SVC)* | 隨機梯度下降 (SGD)* | Arimax |
隨機樹系* | 隨機樹系 | LARS Lasso |
極度隨機樹狀結構* | 極度隨機樹狀結構* | 極度隨機樹狀結構* |
Xgboost* | Xgboost* | 隨機樹系 |
貝氏機率分類* | Xgboost | TCNForecaster |
隨機梯度下降 (SGD)* | 隨機梯度下降 (SGD) | 漸層停駐提升 |
ExponentialSmoothing | ||
SeasonalNaive | ||
平均 | ||
樸素 | ||
SeasonalAverage |
使用其他演演算法:
如需每個工作類型的筆記本範例,請參閱 automl-standalone-jobs。
主要計量
primary_metric
參數會決定在模型定型期間要用於最佳化的計量。 您選擇的工作類型會決定您可以選取的計量。
選擇自動化機器學習的主要計量以優化取決於許多因素。 建議您優先考慮選擇最能代表您商務需求的計量。 然後考慮計量是否適合您的數據集配置檔,包括數據大小、範圍和類別散發。 下列各節會摘要說明根據工作類型和商務案例所建議的主要計量。
若要了解這些計量的特定定義,請參閱 評估自動化機器學習實驗結果。
分類多類別案例的計量
這些計量適用於所有分類案例,包括表格式數據、影像或計算機視覺,以及自然語言處理文字(NLP-Text)。
臨界值相依的計量,例如 accuracy
、 recall_score_weighted
、 norm_macro_recall
、 和 precision_score_weighted
,可能無法針對小型數據集進行優化、具有大型類別扭曲(類別不平衡),或當預期的計量值非常接近0.0或1.0時。 在這些情況下,AUC_weighted
會是比較好的主要計量選擇。 自動化機器學習完成之後,您可以根據最適合您業務需求的計量來選擇獲勝模型。
計量 | 範例使用案例 |
---|---|
accuracy |
影像分類、情感分析、客戶流失預測 |
AUC_weighted |
詐騙偵測、影像分類、異常偵測/垃圾郵件偵測 |
average_precision_score_weighted |
情感分析 |
norm_macro_recall |
流失預測 |
precision_score_weighted |
分類多標籤案例的計量
對於文字分類多標籤,目前「精確度」是唯一支援的主要計量。
針對影像分類多標籤,支援的主要計量定義於列舉中 ClassificationMultilabelPrimaryMetrics
。
NLP 文字具名實體辨識案例的計量
對於 NLP 文字具名實體辨識(NER),目前「精確度」是唯一支援的主要計量。
迴歸案例的計量
r2_score
、 normalized_mean_absolute_error
和 normalized_root_mean_squared_error
都嘗試將預測錯誤降到最低。 r2_score
和 normalized_root_mean_squared_error
都會將均方誤差降至最低,normalized_mean_absolute_error
則會將誤差的平均絕對值降至最低。 絕對值會處理所有大小的錯誤,而平方誤差對於具有較大絕對值的錯誤會有更大的懲罰。 根據較大的錯誤是否應該受到更多懲罰,您可以選擇優化平方誤差或絕對錯誤。
r2_score
和 normalized_root_mean_squared_error
的主要差異在於其正規化方式與其意義。 normalized_root_mean_squared_error
是依範圍正規化的均方根誤差,可解讀為預測的平均誤差量級。 r2_score
是由資料變異數的估計值加以正規化的平均平方誤差。 這是模型可以擷取的變化比例。
注意
r2_score
和 normalized_root_mean_squared_error
的行為模式和主要計量類似。 如果套用固定驗證集,這兩個計量會優化相同的目標、平均平方誤差,並由同一個模型優化。 如果只有定型集可供使用且套用了交叉驗證,則這兩個計量會稍有不同,因為 normalized_root_mean_squared_error
的正規化程式會固定為定型集的範圍,但是 r2_score
的正規化程式會隨每個摺疊而異,因為其為每個摺疊的變異數。
如果排名,而不是確切的值,是感興趣的, spearman_correlation
可能是更好的選擇。 它會測量實際值與預測之間的排名相互關聯。
自動化 ML 目前不支援測量 預測與觀察之間相對 差異的任何主要計量。 計量 r2_score
、normalized_mean_absolute_error
和 normalized_root_mean_squared_error
都是絕對差異的量值。 例如,如果預測與觀察相差 10 個單位,則如果觀察值為 20 單位或 20,000 單位,則這些計量會計算出相同的值。 相反地,百分比差異是相對量值,分別提供50%和0.05%的錯誤。 若要針對相對差異進行優化,您可以使用支援的主要計量執行自動化 ML,然後選取具有最佳 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
。
影像執行個體分割案例的計量
針對映像實例分割案例,支援的主要計量定義於列舉中 InstanceSegmentationPrimaryMetrics
。
資料特徵化
在每個自動化機器學習實驗中,您的數據會自動轉換成數位和向量。 數據也會調整和正規化,以協助區分不同縮放比例特徵的演算法。 這些資料轉換稱為特徵化。
注意
自動化機器學習特徵化步驟,例如功能正規化、處理遺漏的數據,以及將文字轉換成數值,會成為基礎模型的一部分。 當您使用模型進行預測時,定型期間套用的相同特徵化步驟會自動套用至您的輸入數據。
當您設定自動化機器學習作業時,您可以啟用或停用設定 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 |
定義實驗要持續執行的時間 (以分鐘為單位)。 如果未指定,默認作業的總逾時為六天(8,640 分鐘)。 若要指定逾時少於或等於 1 小時 (60 分鐘),請確定資料集的大小不超過 10,000,000 (資料列乘以資料行),或確定結果正確無誤。 此逾時包括設定、特徵化和定型執行,但不包含在程序結束時執行的合奏和模型可解釋性執行,因為這些動作必須在完成所有試驗(子作業)之後發生。 |
trial_timeout_minutes |
每個試驗 (子項目作業) 在終止前可執行的時間上限 (單位:分鐘)。 如果未指定,則會使用1個月或43200分鐘的值。 |
enable_early_termination |
如果分數在短期內沒有改善,是否要結束工作。 |
max_trials |
每次試驗/執行次數上限時,每個試驗都有不同的演算法和超參數組合,以在作業期間嘗試。 如果未指定,則預設值為1,000個試用版。 如果您使用 enable_early_termination ,使用的試用版數目可能會較小。 |
max_concurrent_trials |
表示要平行執行的試驗 (子項目作業) 數目上限。 最好將此數位與叢集的節點數目相符。 |
執行實驗
提交實驗以執行與產生模型。
注意
如果您多次執行具有相同組態設定和主要計量的實驗,您可能會在每個實驗最終計量分數和產生的模型中看到變化。 自動化機器學習採用的演算法具有固有的隨機性,可能會導致實驗輸出的模型和建議模型的最終計量分數稍有變化,例如精確度。 您也可以看到具有相同模型名稱的結果,但使用不同的超參數。
警告
如果您已透過工作區在防火牆或網路安全組中設定規則,請確認已依照設定輸入和輸出網路流量中所 定義的輸入和輸出網路流量來授與必要的許可權。
以必要條件建立 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,這個事實表示子系執行。 如果所有節點都處於忙碌狀態,系統會將新實驗排入佇列。 如果有免費節點,新的實驗會在可用的節點或虛擬機中平行執行子執行。
為了協助管理子執行,以及其執行時機,建議您為每個實驗建立專用叢集,並將實驗數目與叢集中的節點數目 max_concurrent_iterations
相符。 如此一來,您就可以同時使用叢集的所有節點,以及您想要的並行子執行和反覆項目數目。
在 limits
在組態中設定 max_concurrent_iterations
。 如果未設定,則每個實驗預設只允許一個並行子執行/反覆專案。 針對計算實例, max_concurrent_trials
可以設定為與計算實例虛擬機上的核心數目相同。
探索模型和計量
自動化 ML 提供了一些選項供您監視及評估定型結果。
如需針對每次執行提供的效能圖表與計量定義和範例,請參閱評估自動化機器學習實驗結果。
若要取得特徵化摘要,以及了解已新增至特定模型的特徵,請參閱特徵化透明度。
從模型頁面的 Azure 機器學習 UI,您也可以檢視在定型特定模型時所使用的超參數,也可以檢視和自定義使用的內部模型定型程式代碼。
註冊和部署模型
測試模型並確認要在生產環境中使用之後,便可註冊該模型以供稍後使用。
在管線中使用 AutoML
若要在機器學習作業工作流程中使用自動化 ML,您可以將 AutoML 作業步驟新增至 Azure 機器學習 Pipelines。 這種方法可讓您將數據準備腳本連結至自動化 ML,將整個工作流程自動化。 然後註冊並驗證產生的最佳模型。
此程式代碼是具有 自動化 ML 分類元件的範例管線 ,以及顯示結果輸出的命令元件。 程式代碼會參考不同步驟中的輸入(定型和驗證數據)和輸出(最佳模型)。
# 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
如需如何在管線中包含自動化 ML 的更多範例,請參閱範例存放 庫。
大規模使用 AutoML:分散式定型
針對大型數據案例,自動化 ML 支援一組有限的模型分散式定型:
分散式演算法 | 支援的工作 | 資料大小限制 (大約) |
---|---|---|
LightGBM | 分類、迴歸 | 1 TB |
TCNForecaster | 預測 | 200 GB |
分散式定型演算法會自動分割資料,並將資料分散到多個計算節點以進行模型定型。
注意
分散式定型模式目前不支援交叉驗證、集成模型、ONNX 支援和程式碼產生。 此外,自動 ML 也可以做出選擇,例如限制用於驗證、說明性和模型評估的可用特徵化程式和子取樣數據。
分類和回歸的分散式定型
若要使用分散式定型進行分類或回歸,請設定 training_mode
作業物件的 和 max_nodes
屬性。
屬性 | 說明 |
---|---|
training_mode | 表示訓練模式: distributed 或 non_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_mode
、enable_dnn_training
、 max_nodes
及選擇性地設定作業物件的 max_concurrent_trials
屬性。
屬性 | 說明 |
---|---|
training_mode | 表示定型模式 distributed 或 non_distributed 。 預設為 non_distributed 。 |
enable_dnn_training | 設定此旗標以啟用深度類神經網路模型。 |
max_concurrent_trials | 此值是平行定型的試用模型數目上限。 預設值為 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
)
如需完整組態程式代碼的範例,請參閱先前的 組態 和 作業提交小節。
相關內容
- 深入了解模型部署的方式和位置。
- 深入了解如何設定 AutoML 來定型時間序列預測模型。