在本機建置和訓練機器學習模型

教學

概觀

在本教學中,您將了解如何在 Amazon SageMaker Studio 筆記本中本機建置和訓練機器學習 (ML) 模型。

Amazon SageMaker Studio 是用於 ML 的整合開發環境 (IDE),它提供全受管的 Jupyter 筆記本介面,您可以在其中執行端對端 ML 生命週期任務。您可以使用 SageMaker Studio 建立和探索資料集;準備訓練資料;建置和訓練模型;並部署經過訓練的模型進行推論 – 所有這些都可以在一個地方進行。

在使用完整的資料集進行訓練前探索資料集樣本並對多個模型和參數組態進行迭代,這是開發 ML 時的一種常見做法。在這個探索階段,Amazon SageMaker 會提供本機模式,允許您在執行完整規模的訓練任務前測試訓練邏輯、嘗試不同的建模方法以及衡量模型的效能。

在此教學中,您將使用綜合產生的汽車保險索賠資料集。輸入是訓練和測試資料集,每個資料集都包含關於索賠與客戶的詳細資訊和擷取的特徵,以及一個 fraud (詐騙) 欄,表明索賠是否為詐騙。您將透過開放原始碼 XGBoost 架構,使用這個綜合資料集建置一個二進制分類模型原型,以預測索賠為詐騙的可能性。

要完成的內容

在本指南中,您將:

  • 將訓練資料從 Amazon S3 擷取到 Amazon SageMaker
  • 在本機建置和訓練 XGBoost 模型
  • 將經過訓練的模型和成品儲存到 Amazon S3

先決條件

在開始本指南之前,您需要具備:

 AWS 經驗

初階

 完成時間

15 分鐘

 完成成本

請參閱 SageMaker 定價以估算本教學的成本。

 要求

您必須登入 AWS 帳戶。

 使用的服務

Amazon SageMaker Studio

 上次更新日期

2022 年 7 月 7 日

實作

步驟 1:設定 Amazon SageMaker Studio 網域

藉助 Amazon SageMaker,您可以使用主控台視覺化地部署模型,也可以使用 SageMaker Studio 或 SageMaker 筆記本以程式設計方式部署模型。在本教學中,您將使用 SageMaker Studio 筆記本以程式設計的方式部署模型,而該筆記本需要一個 SageMaker Studio 網域。

每個 AWS 帳戶在每個區域只能擁有一個 SageMaker Studio 網域。如果您在美國東部 (維吉尼亞北部) 區域已有 SageMaker Studio 網域,請按照 SageMaker Studio 設定指南將所需的 AWS IAM 政策連接到您的 SageMaker Studio 帳戶,然後略過步驟 1,並直接進行步驟 2。 

如果您沒有現有的 SageMaker Studio 網域,請繼續進行步驟 1 以執行 AWS CloudFormation 範本,該範本將建立 SageMaker Studio 網域,並新增本教學其餘部分所需的許可。

選擇 AWS CloudFormation 堆疊連結。此連結將開啟 AWS CloudFormation 主控台,並建立您的 SageMaker Studio 網域和名為 studio-user 的使用者。它還會向您的 SageMaker Studio 帳戶新增所需的許可。在 CloudFormation 主控台中,確認右上角顯示的 Region (區域) 是 US East (N. Virginia) (美國東部 (維吉尼亞北部))。 Stack name (堆疊名稱) 應為 CFN-SM-IM-Lambda-catalog,且不應變更。 此堆疊大約需要 10 分鐘來建立所有資源。

此堆疊假定您已經在您的帳戶中設定了公有 VPC。如果您沒有公有 VPC,請參閱具有單一公有子網路的 VPC,了解如何建立公有 VPC。 

選取 I acknowledge that AWS CloudFormation might create IAM resources (我認知 AWS CloudFormation 可能會建立 IAM 資源),然後選擇 Create stack (建立堆疊)。

CloudFormation 窗格中,選擇 Stacks (堆疊)。建立此堆疊約需要 10 分鐘。建立該堆疊後,堆疊狀態從 CREATE_IN_PROGRESS 變更為 CREATE_COMPLETE。 

步驟 2:設定 SageMaker Studio 筆記本

在此步驟中,您將啟動一個新的 SageMaker Studio 筆記本,安裝必要的開放原始碼程式庫,並設定與其他服務 (包括 Amazon Simple Storage Service (Amazon S3)) 互動所需的 SageMaker 變數。

在管理主控台搜尋列中輸入 SageMaker Studio,然後選擇 SageMaker Studio

從 SageMaker 主控台右上角的 Region (區域) 下拉式清單中選擇 US East (N. Virginia) (美國東部 (維吉尼亞北部))。對於 Launch app (啟動應用程式),選取 Studio 以開啟 SageMaker Studio 並使用 studio-user 設定檔。

開啟 SageMaker Studio 介面。在導覽列上,選擇 File (檔案)、New (新增)、Notebook (筆記本)。 

Set up notebook environment (設定筆記本環境) 對話方塊中的 Image (映像) 下,選取 Data Science (資料科學)。將自動選取 Python 3 核心。選擇 Select (選取)。

筆記本右上角上的核心現在應顯示 Python 3 (Data Science) (Python 3 (資料科學))。

複製以下程式碼片段並貼到筆記本的儲存格,按 Shift+Enter 執行當前儲存格以更新 aiobotocore 程式庫 (與許多 AWS 服務互動的 API) 並安裝 XGBoost 程式庫。忽略任何警告以重新啟動核心或任何相依性衝突錯誤。

%pip install --upgrade -q aiobotocore
%pip install -q  xgboost==1.3.1

您還需要具現化 S3 用戶端物件,以及預設 S3 儲存貯體中指標和模型成品等內容上傳到的位置。為此,複製並貼上以下程式碼區塊,然後執行儲存格。 請注意,寫入儲存貯體名稱由 SageMaker 工作階段物件派生而來。您的預設儲存貯體名稱為 sagemaker-<您的區域>-<您的帳戶 ID>。此儲存貯體是所有訓練成品上傳到的位置。用於訓練的資料集存在於一個名為 sagemaker-sample-files 的公有 S3 儲存貯體中,該儲存貯體被指定為讀取儲存貯體。儲存貯體中的位置透過讀取字首指定。

import pandas as pd
import boto3
import sagemaker
import json
import joblib
import xgboost as xgb
from sklearn.metrics import roc_auc_score

# Set SageMaker and S3 client variables
sess = sagemaker.Session()

region = sess.boto_region_name
s3_client = boto3.client("s3", region_name=region)

sagemaker_role = sagemaker.get_execution_role()

# Set read and write S3 buckets and locations
write_bucket = sess.default_bucket()
write_prefix = "fraud-detect-demo"

read_bucket = "sagemaker-sample-files"
read_prefix = "datasets/tabular/synthetic_automobile_claims" 

train_data_key = f"{read_prefix}/train.csv"
test_data_key = f"{read_prefix}/test.csv"
model_key = f"{write_prefix}/model"
output_key = f"{write_prefix}/output"

train_data_uri = f"s3://{read_bucket}/{train_data_key}"
test_data_uri = f"s3://{read_bucket}/{test_data_key}"

步驟 3:訓練 XGBoost 模型

在此步驟中,您將使用綜合的汽車保險索賠資料集設定和訓練 XGBoost 二進制分類模型,並評估模型的效能。您將使用 fraud(詐騙) 欄作為目標欄。目標是訓練可區分詐騙索賠與合法索賠的 XGBoost 二進制分類器,並衡量基準模型效能。


開放原始碼 XGBoost 架構公開多項可被用於控制模型效能的超參數。在本教學中,將設定一些重要的超參數,而接收者操作特徵曲線下面積 (ROC-AUC) 則會被選作評估指標。複製以下程式碼區塊並貼到儲存格中,然後執行該儲存格,以便對 XGBoost 進行交叉驗證和訓練。 

hyperparams = {
                "max_depth": 3,
                "eta": 0.2,
                "objective": "binary:logistic",
                "subsample" : 0.8,
                "colsample_bytree" : 0.8,
                "min_child_weight" : 3
              }

num_boost_round = 100
nfold = 3
early_stopping_rounds = 10



# Set up data input
label_col = "fraud"
data = pd.read_csv(train_data_uri)

# Read training data and target
train_features = data.drop(label_col, axis=1)
train_label = pd.DataFrame(data[label_col])
dtrain = xgb.DMatrix(train_features, label=train_label)

# Cross-validate on training data
cv_results = xgb.cv(
    params=hyperparams,
    dtrain=dtrain,
    num_boost_round=num_boost_round,
    nfold=nfold,
    early_stopping_rounds=early_stopping_rounds,
    metrics=["auc"],
    seed=10,
)


metrics_data = {
    "binary_classification_metrics": {
        "validation:auc": {
            "value": cv_results.iloc[-1]["test-auc-mean"],
            "standard_deviation": cv_results.iloc[-1]["test-auc-std"]
        },
        "train:auc": {
            "value": cv_results.iloc[-1]["train-auc-mean"],
            "standard_deviation": cv_results.iloc[-1]["train-auc-std"]
        },
    }
}


print(f"Cross-validated train-auc:{cv_results.iloc[-1]['train-auc-mean']:.2f}")
print(f"Cross-validated validation-auc:{cv_results.iloc[-1]['test-auc-mean']:.2f}")

執行儲存格後會顯示交叉驗證訓練和驗證 AUC 分數。由於建模程序存在隨機性,由此您得到的分數可能會有些許差異。但訓練和測試效能之間的差異表明,在使用所選超參數組合的情況下,模型很可能對訓練資料集過度擬合。作為資料科學家,您可以在進行完整規模的訓練之前,運用此洞見來微調模型。

在衡量交叉驗證效能後,您可以使用完整的訓練資料集對模型進行再訓練,同時使用測試集提前停止,而不是將資料集拆分到多個。提前停止有助於控制模型的複雜程度,減少過度擬合。複製並貼上以下程式碼區塊,以便使用訓練和測試資料集進行再訓練與評估。注意,以本機模式進行再訓練意味著從 Amazon S3 將資料集擷取到本機 SageMaker Studio 執行個體環境。SageMaker Studio 執行個體應有充足空間以在本機儲存資料。

data = pd.read_csv(test_data_uri)
test_features = data.drop(label_col, axis=1)
test_label = pd.DataFrame(data[label_col])
dtest = xgb.DMatrix(test_features, label=test_label)

model = (xgb.train(params=hyperparams, dtrain=dtrain, evals = [(dtrain,'train'), (dtest,'eval')], num_boost_round=num_boost_round, 
                  early_stopping_rounds=early_stopping_rounds, verbose_eval = 0)
        )

# Test model performance on train and test sets
test_pred = model.predict(dtest)
train_pred = model.predict(dtrain)

test_auc = roc_auc_score(test_label, test_pred)
train_auc = roc_auc_score(train_label, train_pred)

print(f"Train-auc:{train_auc:.2f}, Test-auc:{test_auc:.2f}")

使用汽車保險索賠資料集對二進制分類模型進行訓練和評估的過程至此結束。複製並貼上以下程式碼區塊,以便將評估指標儲存為 JSON 檔案,並將經過訓練的模型儲存為 Pickle 檔案。這段程式碼會將兩者儲存到 SageMaker Studio 中的本機目錄以及您的預設 S3 儲存貯體。

# Save model and performance metrics locally

with open("./metrics.json", "w") as f:
    json.dump(metrics_data, f)

with open("./xgboost-model", "wb") as f:
    joblib.dump(model, f)    
    
# Upload model and performance metrics to S3

metrics_location = output_key + "/metrics.json"
model_location = model_key + "/xgboost-model"

s3_client.upload_file(Filename="./metrics.json", Bucket=write_bucket, Key=metrics_location)
s3_client.upload_file(Filename="./xgboost-model", Bucket=write_bucket, Key=model_location)

步驟 4:清除資源

最佳實務是刪除不再使用的資源,以免產生意外費用。

若要刪除 S3 儲存貯體,請執行以下操作: 

  • 開啟 Amazon S3 主控台。在導覽列上,選擇 Buckets (儲存貯體)、sagemaker-<您的區域>-<您的帳戶 ID>,然後選取 fraud-detect-demo 旁邊的核取方塊。然後選擇 Delete (刪除)。
  • Delete objects (刪除物件) 對話方塊中,確認您已選取要刪除的物件,然後將 permanently delete (永久刪除) 輸入到 Permanently delete objects (永久刪除物件) 確認方塊。
  • 當此操作完成且儲存貯體為空時,您可以透過再次執行相同程序來刪除儲存貯體 sagemaker-<您的區域>-<您的帳戶 ID>

本教學中用於執行筆記本映像的資料科學核心將不斷產生費用,直到您停止核心或執行以下步驟刪除應用程式。 如需詳細資訊,請參閱《Amazon SageMaker 開發人員指南》中的關閉資源

若要刪除 SageMaker Studio 應用程式,請執行以下操作:在 SageMaker Studio 主控台中,選擇 studio-user,然後透過選擇 Delete app (刪除應用程式程式) 來刪除 Apps (應用程式) 下列出的所有應用程式。等待片刻直到 Status (狀態) 變更為 Deleted (已刪除)。

如果您在步驟 1 中使用了現有的 SageMaker Studio 網域,請略過步驟 4 的其餘部分並直接進入「結論」部分。 

如果您在步驟 1 中執行 CloudFormation 範本來建立新的 SageMaker Studio 網域,請繼續執行下列步驟以刪除由 CloudFormation 範本建立的網域、使用者和資源。  

若要開啟 CloudFormation 主控台,請在 AWS Console 搜尋列中輸入 CloudFormation,然後從搜尋結果中選擇 CloudFormation

CloudFormation 窗格中,選擇 Stacks (堆疊)。從狀態下拉式清單中,選取 Active (作用中)。在 Stack name (堆疊名稱) 下,選擇 CFN-SM-IM-Lambda-Catalog 開啟堆疊詳細資訊頁面。

CFN-SM-IM-Lambda-catalog 堆疊詳細資訊頁面上,選擇 Delete (刪除) 以刪除在步驟 1 中建立的堆疊及資源。

結論

恭喜您! 您已完成在本機建置和訓練機器學習模型教學。 

在本教學中,您使用 Amazon SageMaker Studio 和 XGBoost 開放原始碼程式庫在本機建置了一個二進制分類模型,並將模型成品和輸出儲存到了 Amazon S3。如本教學中所述,藉助 SageMaker Studio 中的快速原型建置,您可以在使用完整的資料集訓練生產模型前評估模型的效能,以及潛在的過度擬合問題。

您可以按照下面的「後續步驟」部分使用 Amazon SageMaker 繼續資料科學家之旅。

本頁對您是否有幫助?

後續步驟