教學課程:在 Azure Machine Learning 中定型模型
適用於:Python SDK azure-ai-ml v2 (目前)
了解資料科學家如何使用 Azure Machine Learning 來定型模型。 在此範例中,我們會使用相關聯的信用卡資料集來示範如何使用 Azure Machine Learning 解決分類問題。 目標是預測客戶信用卡卡費逾期未繳的可能性是否很高。
定型指令碼會處理資料準備,然後定型並註冊模型。 本教學課程會引導您完成提交雲端式定型作業 (命令作業) 的步驟。 如果您想要深入了解如何將資料載入到 Azure,請參閱教學課程:在 Azure Machine Learning 中上傳、存取和探索資料。 步驟是:
- 取得 Azure Machine Learning 工作區的控制代碼
- 建立計算資源和作業環境
- 建立您的定型指令碼
- 建立並執行命令作業,以在設定了適當作業環境和資料來源的計算資源上執行定型指令碼
- 檢視訓練指令碼的輸出
- 將新定型的模型部署為端點
- 呼叫 Azure Machine Learning 端點以進行推斷
下面這段影片會示範如何開始使用 Azure Machine Learning 工作室,以便您可以遵循教學課程中的步驟。 此影片會示範如何建立筆記本、建立計算執行個體,以及複製筆記本。 下列各節也會說明這些步驟。
必要條件
-
若要使用 Azure Machine Learning,您必須先有工作區。 如果您沒有工作區,請完成建立要開始使用所需要的資源以建立工作區,並深入了解其使用方式。
-
登入工作室,並選取您的工作區 (如果其尚未開啟的話)。
-
在工作區開啟或建立筆記本:
- 如果您想要將程式碼複製/貼到資料格中,請建立新筆記本。
- 或者,從工作室的 [範例] 區段開啟 tutorials/get-started-notebooks/train-model.ipynb。 然後選取 [複製] 以將筆記本新增至您的 [檔案]。 (查看可在哪裡找到範例。)
設定您的核心並在 Visual Studio Code (VS Code) 中開啟
在開啟的筆記本上方的頂端列上,如果您還沒有計算執行個體,請建立計算執行個體。
如果計算執行個體已停止,請選取 [啟動計算],並等到其執行為止。
確定位於右上方的核心是
Python 3.10 - SDK v2
。 如果不是,則使用下拉式清單選取此核心。如果您看到橫幅指出您需要進行驗證,請選取 [驗證]。
您可以在此執行筆記本,或在 VS Code 中予以開啟,以取得包含 Azure Machine Learning 資源強大功能的完全整合式開發環境 (IDE)。 選取 [在 VS Code 中開啟],然後選取 Web 或桌面選項。 以這種方式啟動時,VS Code 會附加至您的計算執行個體、核心和工作區檔案系統。
重要
本教學課程的其餘部分包含教學課程筆記本的儲存格。 將其複製/貼入您的新筆記本中,或立即切換至您複製的筆記本。
使用命令作業在 Azure Machine Learning 中定型模型
若要定型模型,您必須提交作業。 您會在本教學課程中提交的作業類型是命令作業。 Azure Machine Learning 提供數種不同類型的作業來定型模型。 使用者可以根據模型複雜度、資料大小和定型速度需求來選取其定型方法。 在本教學課程中,您會了解如何提交命令作業以執行定型指令碼。
命令作業是可讓您提交自訂定型指令碼以定型模型的函式。 命令作業也可以定義為自訂定型作業。 Azure Machine Learning 中的命令作業是會在指定環境中執行指令碼或命令的作業類型。 您可以使用命令作業來定型模型、處理資料,或想在雲端中執行的任何其他自訂程式碼。
本教學課程將重點放在使用命令作業來建立將用來定型模型的自訂定型作業。 任何自訂定型作業都需要下列項目:
- environment
- 資料
- 命令作業
- 定型指令碼
在本教學課程中,我們會提供所有這些項目供我們的範例使用:建立分類器來預測信用卡卡費逾期未繳可能性很高的客戶。
建立工作區的控制代碼
在深入探討程式碼之前,您需要可參考工作區的方法。 您會建立 ml_client
以獲得工作區的控制代碼。 接著,您會使用 ml_client
來管理資源和作業。
在下一個資料格中,輸入您的訂用帳戶識別碼、資源群組名稱和工作區名稱。 若要尋找這些值:
- 在右上方的 Azure Machine Learning 工作室工具列中,選取您的工作區名稱。
- 將工作區、資源群組和訂閱識別碼的值複製到程式碼。
- 您必須複製一個值、關閉區域並貼上,然後返回處理下一個值。
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
# authenticate
credential = DefaultAzureCredential()
SUBSCRIPTION="<SUBSCRIPTION_ID>"
RESOURCE_GROUP="<RESOURCE_GROUP>"
WS_NAME="<AML_WORKSPACE_NAME>"
# Get a handle to the workspace
ml_client = MLClient(
credential=credential,
subscription_id=SUBSCRIPTION,
resource_group_name=RESOURCE_GROUP,
workspace_name=WS_NAME,
)
注意
建立 MLClient 時不會連線至工作區。 用戶端初始化具有延遲性,會等到第一次需要進行呼叫時才開始 (這會在下一個程式碼資料格發生)。
# Verify that the handle works correctly.
# If you ge an error here, modify your SUBSCRIPTION, RESOURCE_GROUP, and WS_NAME in the previous cell.
ws = ml_client.workspaces.get(WS_NAME)
print(ws.location,":", ws.resource_group)
建立作業環境
若要在計算資源上執行 Azure Machine Learning 作業,您需要環境。 環境會列出您要安裝在要定型之計算上的軟體執行階段和程式庫。 這類似於本機電腦上的 Python 環境。
Azure Machine Learning 提供許多策劃好或現成的環境,適用於常見的定型和推斷案例。
在本範例中,您將使用 conda yaml 檔案為作業建立自訂的 conda 環境。
首先,建立一個用來儲存檔案的目錄。
import os
dependencies_dir = "./dependencies"
os.makedirs(dependencies_dir, exist_ok=True)
下列資料格會使用 IPython magic 將 conda 檔案寫入您剛才建立的目錄中。
%%writefile {dependencies_dir}/conda.yaml
name: model-env
channels:
- conda-forge
dependencies:
- python=3.8
- numpy=1.21.2
- pip=21.2.4
- scikit-learn=1.0.2
- scipy=1.7.1
- pandas>=1.1,<1.2
- pip:
- inference-schema[numpy-support]==1.3.0
- mlflow==2.8.0
- mlflow-skinny==2.8.0
- azureml-mlflow==1.51.0
- psutil>=5.8,<5.9
- tqdm>=4.59,<4.60
- ipykernel~=6.0
- matplotlib
規格包含一些會在作業 (numpy、pip) 中使用的一般套件。
請參考此 yaml 檔案,在您的工作區中建立及註冊此自訂環境:
from azure.ai.ml.entities import Environment
custom_env_name = "aml-scikit-learn"
custom_job_env = Environment(
name=custom_env_name,
description="Custom environment for Credit Card Defaults job",
tags={"scikit-learn": "1.0.2"},
conda_file=os.path.join(dependencies_dir, "conda.yaml"),
image="mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest",
)
custom_job_env = ml_client.environments.create_or_update(custom_job_env)
print(
f"Environment with name {custom_job_env.name} is registered to workspace, the environment version is {custom_job_env.version}"
)
使用命令函式設定定型作業
您會建立 Azure Machine Learning「命令作業」,以定型用於預測信用違約的模型。 命令作業會在指定計算資源上的指定環境中執行「定型指令碼」。 您已經建立環境和計算叢集。 接下來,您將建立訓練指令碼。 在我們的特定案例中,我們會定型資料集,以使用 GradientBoostingClassifier
模型產生分類器。
「訓練指令碼」會處理資料準備、訓練和訓練模型的註冊。 train_test_split
方法會處理將資料集分割成測試資料和定型資料的工作。 在本教學課程中,您將建立 Python 訓練指令碼。
您可以從 CLI、Python SDK 或 Studio 介面執行命令作業。 在本教學課程中,您會使用 Azure Machine Learning Python SDK v2 來建立與執行命令作業。
建立訓練指令碼
讓我們從建立訓練指令碼開始 - main.py python 檔案。
首先,建立指令碼的來源資料夾:
import os
train_src_dir = "./src"
os.makedirs(train_src_dir, exist_ok=True)
此指令碼會處理資料的前置處理,並將其分割成測試和訓練資料。 然後,取用此資料來訓練樹狀模型,並傳回輸出模型。
在作業期間,會使用 MLFlow 來記錄參數和計量。 MLFlow 套件可讓您針對 Azure 所定型的每個模型追蹤其計量和結果。 我們會先使用 MLFlow 取得資料的最佳模型,再於 Azure 工作室上檢視模型的計量。
%%writefile {train_src_dir}/main.py
import os
import argparse
import pandas as pd
import mlflow
import mlflow.sklearn
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
def main():
"""Main function of the script."""
# input and output arguments
parser = argparse.ArgumentParser()
parser.add_argument("--data", type=str, help="path to input data")
parser.add_argument("--test_train_ratio", type=float, required=False, default=0.25)
parser.add_argument("--n_estimators", required=False, default=100, type=int)
parser.add_argument("--learning_rate", required=False, default=0.1, type=float)
parser.add_argument("--registered_model_name", type=str, help="model name")
args = parser.parse_args()
# Start Logging
mlflow.start_run()
# enable autologging
mlflow.sklearn.autolog()
###################
#<prepare the data>
###################
print(" ".join(f"{k}={v}" for k, v in vars(args).items()))
print("input data:", args.data)
credit_df = pd.read_csv(args.data, header=1, index_col=0)
mlflow.log_metric("num_samples", credit_df.shape[0])
mlflow.log_metric("num_features", credit_df.shape[1] - 1)
#Split train and test datasets
train_df, test_df = train_test_split(
credit_df,
test_size=args.test_train_ratio,
)
####################
#</prepare the data>
####################
##################
#<train the model>
##################
# Extracting the label column
y_train = train_df.pop("default payment next month")
# convert the dataframe values to array
X_train = train_df.values
# Extracting the label column
y_test = test_df.pop("default payment next month")
# convert the dataframe values to array
X_test = test_df.values
print(f"Training with data of shape {X_train.shape}")
clf = GradientBoostingClassifier(
n_estimators=args.n_estimators, learning_rate=args.learning_rate
)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
###################
#</train the model>
###################
##########################
#<save and register model>
##########################
# Registering the model to the workspace
print("Registering the model via MLFlow")
mlflow.sklearn.log_model(
sk_model=clf,
registered_model_name=args.registered_model_name,
artifact_path=args.registered_model_name,
)
# Saving the model to a file
mlflow.sklearn.save_model(
sk_model=clf,
path=os.path.join(args.registered_model_name, "trained_model"),
)
###########################
#</save and register model>
###########################
# Stop Logging
mlflow.end_run()
if __name__ == "__main__":
main()
在此指令碼中,模型一旦完成定型,就會將模型檔案儲存並註冊到工作區。 註冊模型可讓您在 Azure 雲端中您自己的工作區內儲存模型,以及設定模型的版本。 在註冊模型後,您可以在 Azure 工作室中,一處名為模型登錄的地方找到所有其他已註冊的模型。 模型登錄可協助您組織和追蹤已定型模型。
設定命令
有了可執行分類工作的指令碼後,您即可使用可執行命令列動作的一般用途命令。 此命令列動作可直接呼叫系統命令或透過執行指令碼呼叫。
在此,請建立輸入變數以指定輸入資料、分割比例、學習速率和已註冊的模型名稱。 命令指令碼將會:
- 使用稍早建立的環境 - 您可以使用
@latest
標記法,在執行命令時指出環境的最新版本。 - 設定命令列動作本身 - 本例中為
python main.py
。 您可透過${{ ... }}
標記法在命令中存取輸入/輸出。 - 由於未指定計算資源,指令碼會在自動建立的無伺服器計算叢集上執行。
from azure.ai.ml import command
from azure.ai.ml import Input
registered_model_name = "credit_defaults_model"
job = command(
inputs=dict(
data=Input(
type="uri_file",
path="https://azuremlexamples.blob.core.windows.net/datasets/credit_card/default_of_credit_card_clients.csv",
),
test_train_ratio=0.2,
learning_rate=0.25,
registered_model_name=registered_model_name,
),
code="./src/", # location of source code
command="python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}",
environment="aml-scikit-learn@latest",
display_name="credit_default_prediction",
)
提交作業
接著即可提交作業,以在 Azure Machine Learning 工作室中執行。 這次,您會對 ml_client
使用 create_or_update
。 ml_client
是一種用戶端類別,可讓您使用 Python 連線到 Azure 訂用帳戶,並與 Azure Machine Learning 服務互動。 ml_client
可讓您使用 Python 提交作業。
ml_client.create_or_update(job)
檢視作業輸出並等候作業完成
選取上一個資料格輸出中的連結,以檢視 Azure Machine Learning 工作室中的作業。 此作業的輸出在 Azure Machine Learning 工作室中看起來會像這樣。 探索索引標籤以取得各種詳細資料,例如計量、輸出等。完成後,作業會在您的工作區中註冊模型,作為定型的結果。
重要
請等到作業狀態完成後,再返回此筆記本繼續作業。 作業執行時間約需 2 到 3 分鐘。 如果計算叢集已縮小至零個節點,且自訂環境仍在建置中,所需時間可能更長 (最多 10 分鐘)。
當您執行資料格時,筆記本輸出會顯示 Azure 工作室上作業詳細資料頁面的連結。 或者,您也可以選取左側導覽功能表上的 [作業]。 作業聚集了指定指令碼或一段程式碼的多次執行。 回合的資訊會儲存在該作業底下。 詳細資料頁面會概述作業、其執行所花費的時間、其建立時間等等。此頁面也有關於作業其他資訊的索引標籤,例如 [計量]、[輸出 + 記錄] 和 [程式碼]。 下面列出的是作業詳細資料頁面中可用的索引標籤:
- 概觀:概觀區段會提供關於作業的基本資訊,包括其狀態、開始和結束時間,以及所執行的作業類型
- 輸入:輸入區段會列出作為作業輸入的資料和程式碼。 此區段可能包含資料集、指令碼、環境設定,以及定型期間使用的其他資源。
- 輸出 + 記錄:[輸出 + 記錄] 索引標籤包含作業執行時所產生的記錄。 此索引標籤有助於針對定型指令碼或模型建立所發生的問題進行疑難排解。
- 計量:[計量] 索引標籤會展示模型的重要效能計量,例如定型分數、f1 分數和精確度分數。
清除資源
如果您打算立即繼續進行其他教學課程,請跳至後續步驟。
停止計算執行個體
如果現在不打算使用,請停止計算執行個體:
- 在工作室的左側導覽區域中,選取 [計算]。
- 在頂端索引標籤中,選取 [計算執行個體]
- 選取清單中的計算執行個體。
- 在頂端工具列中,選取 [停止]。
刪除所有資源
重要
您所建立的資源可用來作為其他 Azure Machine Learning 教學課程和操作說明文章的先決條件。
如果不打算使用您建立的任何資源,請刪除以免產生任何費用:
在 Azure 入口網站中,選取最左邊的 [資源群組]。
從清單中,選取您所建立的資源群組。
選取 [刪除資源群組]。
輸入資源群組名稱。 接著選取刪除。
後續步驟
了解如何部署模型
部署模型。
本教學課程使用了線上資料檔案。 若要深入了解可存取資料的其他方式,請參閱教學課程:在 Azure Machine Learning 中上傳、存取和探索資料。
如果您想要深入了解在 Azure Machine Learning 中定型模型的不同方式,請參閱什麼是自動化機器學習 (AutoML)?。 自動化 ML 是一種補充工具,可減少資料科學家為了尋找最適合其資料的模型所花費的時間量。
如果您想要更多類似本教學課程的範例,請參閱工作室的範例區段。 我們的 GitHub 範例頁面有提供這些相同範例。這些範例包括您可以執行程式碼並了解如何定型模型的完整 Python 筆記本。 您可以修改和執行範例中的現有指令碼,其中包含分類、自然語言處理和異常偵測等案例。