教學課程:在 Azure 機器學習 中定型模型
適用於:Python SDK azure-ai-ml v2 (目前)
了解數據科學家如何使用 Azure 機器學習 來定型模型。 在此範例中,我們使用相關聯的信用卡數據集來示範如何使用 Azure 機器學習 來分類問題。 目標是預測客戶是否很有可能在信用卡付款上預設。
定型腳本會處理數據準備,然後定型並註冊模型。 本教學課程會引導您完成提交雲端式訓練作業(命令作業)的步驟。 如果您想要深入瞭解如何將您的數據載入 Azure,請參閱教學課程:上傳、存取和探索 Azure 機器學習 中的數據。 步驟是:
- 取得 Azure 機器學習 工作區的句柄
- 建立計算資源和作業環境
- 建立定型腳本
- 建立並執行命令作業,以在計算資源上執行定型腳本,並設定適當的作業環境和數據源
- 檢視定型腳本的輸出
- 將新定型的模型部署為端點
- 呼叫 Azure 機器學習 端點以進行推斷
這段影片示範如何開始 Azure Machine Learning 工作室,以便遵循教學課程中的步驟。 影片示範如何建立筆記本、建立計算實例,以及複製筆記本。 下列各節也會說明這些步驟。
必要條件
-
若要使用 Azure 機器學習,您必須先有工作區。 如果您沒有資源,請完成 建立資源,才能開始 建立工作區,並深入瞭解如何使用它。
-
登入 Studio,如果工作區尚未開啟,請選取您的工作區。
-
在您的工作區開啟或建立筆記本:
- 如果您想要將程式代碼複製/貼到儲存格中,請建立新的筆記本。
- 或者,從 Studio 的 Samples 區段開啟 tutorials/get-started-notebooks/train-model.ipynb。 然後選取 [ 複製 ] 以將筆記本新增至您的 檔案。 (請參閱尋找範例的位置。
設定核心
在開啟筆記本上方的頂端列上,如果您還沒有計算實例,請建立計算實例。
如果計算實例已停止,請選取 [ 啟動計算 ],並等候其執行。
請確定位於右上方的核心是
Python 3.10 - SDK v2
。 如果沒有,請使用下拉式清單來選取此核心。如果您看到橫幅指出您需要進行驗證,請選取 [ 驗證]。
重要
本教學課程的其餘部分包含教學課程筆記本的單元格。 將其複製/貼到新的筆記本中,或如果您複製筆記本,請立即切換至筆記本。
使用命令作業在 Azure 機器學習 中定型模型
若要定型模型,您必須提交 作業。 您將在本教學課程中提交的作業類型是 命令作業。 Azure 機器學習 提供數種不同類型的作業來定型模型。 用戶可以根據模型、數據大小和定型速度需求的複雜度來選取其定型方法。 在本教學課程中,您將瞭解如何提交 命令作業 以執行 定型腳本。
命令作業是一個函式,可讓您提交自定義定型腳本來定型模型。 這也可以定義為自定義定型作業。 Azure 機器學習 中的命令作業是在指定的環境中執行腳本或命令的作業類型。 您可以使用命令作業來定型模型、處理數據,或您想要在雲端中執行的任何其他自定義程序代碼。
在本教學課程中,我們將著重於使用命令作業來建立自定義定型作業,我們將用來定型模型。 針對任何自定義定型作業,需要下列專案:
- 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 機器學習 作業,您需要環境。 環境會列出您要在定型的計算上安裝的軟體運行時間和連結庫。 這類似於本機電腦上的 Python 環境。
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 機器學習 命令作業,以定型模型以進行信用預設預測。 命令作業會在指定的計算資源上,於指定的環境中執行 定型腳本 。 您已建立環境和計算叢集。 接下來,您將建立定型腳本。 在我們的特定案例中,我們會訓練數據集,以使用 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 上檢視模型的計量。
%%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 機器學習 服務互動。 ml_client
可讓您使用 Python 提交作業。
ml_client.create_or_update(job)
檢視作業輸出並等候作業完成
選取上一個單元格輸出中的連結,以檢視 Azure Machine Learning 工作室 中的作業。 此作業的輸出在 Azure Machine Learning 工作室 看起來會像這樣。 探索索引標籤以取得各種詳細數據,例如計量、輸出等。完成後,作業將會在工作區中註冊模型,因為定型。
重要
等到作業的狀態完成,再返回此筆記本繼續。 作業需要 2 到 3 分鐘才能執行。 如果計算叢集已縮減為零節點,且自定義環境仍在建置,則可能需要較長的時間(最多 10 分鐘)。
當您執行數據格時,筆記本輸出會顯示 Azure Studio 上作業詳細數據頁面的連結。 或者,您也可以選取左側導覽功能表上的 [作業]。 作業聚集了指定指令碼或一段程式碼的多次執行。 回合的資訊會儲存在該作業底下。 詳細數據頁面提供作業的概觀、執行所花費的時間、建立時間等等。此頁面也有索引標籤,以取得作業的其他資訊,例如計量、輸出 + 記錄和程式代碼。 以下是作業詳細資料頁面中可用的索引標籤:
- 概觀:概觀區段提供作業的基本資訊,包括其狀態、開始和結束時間,以及執行的工作類型
- 輸入:輸入區段會列出做為作業輸入的數據和程序代碼。 本節可包含數據集、腳本、環境設定,以及定型期間使用的其他資源。
- 輸出 + 記錄:[輸出 + 記錄] 索引標籤包含作業執行時產生的記錄。 此索引標籤可協助您針對定型腳本或模型建立發生問題進行疑難解答。
- 計量:[計量] 索引卷標會展示來自模型的重要效能計量,例如訓練分數、f1 分數和精確度分數。
清除資源
如果您打算立即繼續進行其他教學課程,請跳至 後續步驟。
停止計算實例
如果您現在不會使用它,請停止計算實例:
- 在 Studio 的左側導覽區域中,選取 [ 計算]。
- 在頂端索引標籤中,選取 [ 計算實例]
- 選取清單中的計算實例。
- 在頂端工具列上,選取 [ 停止]。
刪除所有資源
重要
您所建立的資源可用來作為其他 Azure Machine Learning 教學課程和操作說明文章的先決條件。
如果不打算使用您建立的任何資源,請刪除以免產生任何費用:
在 Azure 入口網站中,選取最左邊的 [資源群組]。
從清單中,選取您所建立的資源群組。
選取 [刪除資源群組]。
輸入資源群組名稱。 接著選取刪除。
後續步驟
瞭解如何部署模型
部署模型。
本教學課程使用在線數據檔。 若要深入瞭解其他存取數據的方式,請參閱教學課程:上傳、存取和探索 Azure 機器學習 中的數據。
如果您想要深入瞭解在 Azure 機器學習 中定型模型的不同方式,請參閱什麼是自動化機器學習 (AutoML)?。 自動化 ML 是一種補充工具,可減少數據科學家尋找最適合其數據的模型所花費的時間量。
如果您想要更多類似本教學課程的範例,請參閱 Studio 的範例 一節。 我們的 GitHub 範例頁面提供 這些相同的範例。 這些範例包括您可以執行程式碼並瞭解如何定型模型的完整 Python Notebook。 您可以從範例修改和執行現有的腳本,其中包含分類、自然語言處理和異常偵測等案例。