教學課程:在 Azure Machine Learning 中定型模型
適用於:Python SDK azure-ai-ml v2 (目前)
了解資料科學家如何使用 Azure Machine Learning 來定型模型。 在此範例中,您會使用信用卡數據集來瞭解如何使用 Azure 機器學習 進行分類問題。 目標是預測客戶信用卡卡費逾期未繳的可能性是否很高。 定型腳本會處理數據準備。 然後腳本會定型並註冊模型。
本教學課程會引導您完成提交雲端式定型作業 (命令作業) 的步驟。
- 取得 Azure Machine Learning 工作區的控制代碼
- 建立計算資源和作業環境
- 建立您的定型指令碼
- 建立並執行命令作業,以在計算資源上執行定型腳本
- 檢視訓練指令碼的輸出
- 將新定型的模型部署為端點
- 呼叫 Azure Machine Learning 端點以進行推斷
如果您想要深入瞭解如何將您的數據載入 Azure,請參閱教學課程:上傳、存取及探索 Azure 機器學習 中的數據。
下面這段影片會示範如何開始使用 Azure Machine Learning 工作室,以便您可以遵循教學課程中的步驟。 此影片會示範如何建立筆記本、建立計算執行個體,以及複製筆記本。 下列各節也會說明這些步驟。
必要條件
-
若要使用 Azure 機器學習,您需要工作區。 如果您沒有工作區,請完成建立要開始使用所需要的資源以建立工作區,並深入了解其使用方式。
-
登入工作室,並選取您的工作區 (如果其尚未開啟的話)。
-
在工作區開啟或建立筆記本:
設定您的核心並在 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 機器學習 環境?
Azure 機器學習 提供許多策劃或現成的環境,這些環境適用於常見的定型和推斷案例。
在此範例中,您會使用 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 機器學習 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 Studio 上檢視模型的計量。 如需詳細資訊,請參閱 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 Studio 中,找到所有其他已註冊的模型。 模型登錄可協助您組織和追蹤已定型模型。
設定命令
有了可執行分類工作的指令碼後,您即可使用可執行命令列動作的一般用途命令。 此命令列動作可直接呼叫系統命令或透過執行指令碼呼叫。
建立輸入變數,以指定輸入數據、分割比例、學習速率和已註冊的模型名稱。 命令文稿:
- 使用稍早建立的環境。
@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 工作室 中執行。 這次,請在 create_or_update
上使用 ml_client
。 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 分鐘。
當您執行數據格時,筆記本輸出會顯示 機器學習 Studio 上作業詳細數據頁面的連結。 或者,您也可以選取左側導覽功能表上的 [作業]。
作業聚集了指定指令碼或一段程式碼的多次執行。 回合的資訊會儲存在該作業底下。 詳細數據頁面提供作業的概觀、執行時間、建立時間及其他資訊。 此頁面也有索引標籤,以取得作業的其他資訊,例如計量、輸出 + 記錄和程式代碼。 以下是作業詳細資料頁面中可用的索引標籤:
- 概觀:作業的基本資訊,包括其狀態、開始和結束時間,以及執行的工作類型
- 輸入:做為作業輸入的數據和程序代碼。 此區段可能包含資料集、指令碼、環境設定,以及定型期間使用的其他資源。
- 輸出 + 記錄:作業執行時產生的記錄。 此索引標籤可協助您針對定型腳本或模型建立發生問題進行疑難解答。
- 計量:模型的主要效能計量,例如定型分數、f1 分數和精確度分數。
清除資源
如果您打算立即繼續進行其他教學課程,請跳至 相關內容。
停止計算執行個體
如果現在不打算使用,請停止計算執行個體:
- 在工作室的左側導覽區域中,選取 [計算]。
- 在頂端索引標籤中,選取 [ 計算實例]。
- 選取清單中的計算執行個體。
- 在頂端工具列中,選取 [停止]。
刪除所有資源
重要
您所建立的資源可用來作為其他 Azure Machine Learning 教學課程和操作說明文章的先決條件。
如果不打算使用您建立的任何資源,請刪除以免產生任何費用:
在 [Azure 入口網站] 的搜尋方塊中,輸入 [資源群組],然後從結果中選取它。
從清單中,選取您所建立的資源群組。
在 [概觀] 頁面上,選取 [刪除資源群組]。
輸入資源群組名稱。 接著選取刪除。
相關內容
瞭解如何部署模型:
部署模型。
本教學課程使用了線上資料檔案。 若要深入瞭解其他存取數據的方式,請參閱教學課程:上傳、存取及探索 Azure 機器學習 中的數據。
自動化 ML 是一種補充工具,可減少資料科學家為了尋找最適合其資料的模型所花費的時間量。 如需詳細資訊,請參閱 什麼是自動化機器學習。
如果您想要更多類似本教學課程的範例,請參閱從範例筆記本學習。 這些範例可在 GitHub 範例頁面取得。 這些範例包括您可以執行程式碼並瞭解如何定型模型的完整 Python Notebook。 您可以修改和執行範例中的現有指令碼,其中包含分類、自然語言處理和異常偵測等案例。