訓練機器學習模型

教學

概觀

在此教學中,您將了解如何使用 Amazon SageMaker Studio 和 Amazon SageMaker Clarify 訓練、調整和評估機器學習 (ML) 模型。

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

在此教學中,您將使用綜合產生的汽車保險索賠資料集。輸入是訓練、驗證和測試資料集,每個資料集都包含關於索賠與客戶的詳細資訊和擷取的特徵,以及一個 fraud (詐騙) 欄,表明索賠是否為詐騙。您將透過開放原始碼 XGBoost 架構,使用這個綜合資料集建置一個二進制分類模型,以預測索賠為詐騙的可能性。 您還將透過執行偏差和特徵重要性報告評估經過訓練的模型,部署模型進行測試,並執行樣本推論來評估模型效能以及解釋預測。

要完成的內容

在本指南中,您將:

  • 使用指令碼模式建置、訓練和調整模型
  • 偵測 ML 模型中的偏差及了解模型預測
  • 將經過訓練的模型部署到即時推論端點進行測試
  • 透過產生樣本預測和理解特徵影響來評估模型

先決條件

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

 AWS 經驗

初階

 完成時間

2 小時

 完成成本

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

 要求

您必須登入 AWS 帳戶。

 使用的服務

Amazon SageMaker Studio、Amazon SageMaker Clarify

 上次更新日期

2022 年 5 月 3 日

實作

步驟 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 (資料科學))。

若要安裝開放原始碼 XGBoost 和 Pandas 程式庫的特定版本,請複製並貼上以下程式碼片段到筆記本的儲存格中,然後按 Shift+Enter 以執行當前儲存格。忽略任何警告以重新啟動核心或任何相依性衝突錯誤。

%pip install -q  xgboost==1.3.1 pandas==1.0.5

您還需要具現化 S3 用戶端物件,以及預設 S3 儲存貯體中指標和模型成品等內容上傳到的位置。為此,複製並貼上以下程式碼範例到筆記本的儲存格中並執行。 

import pandas as pd
import boto3
import sagemaker
import json
import joblib
from sagemaker.xgboost.estimator import XGBoost
from sagemaker.tuner import (
    IntegerParameter,
    ContinuousParameter,
    HyperparameterTuner
)
from sagemaker.inputs import TrainingInput
from sagemaker.image_uris import retrieve
from sagemaker.serializers import CSVSerializer
from sagemaker.deserializers import CSVDeserializer

# Setting SageMaker variables
sess = sagemaker.Session()
write_bucket = sess.default_bucket()
write_prefix = "fraud-detect-demo"

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

sagemaker_role = sagemaker.get_execution_role()
sagemaker_client = boto3.client("sagemaker")
read_bucket = "sagemaker-sample-files"
read_prefix = "datasets/tabular/synthetic_automobile_claims" 


# Setting S3 location for read and write operations
train_data_key = f"{read_prefix}/train.csv"
test_data_key = f"{read_prefix}/test.csv"
validation_data_key = f"{read_prefix}/validation.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}"
validation_data_uri = f"s3://{read_bucket}/{validation_data_key}"
model_uri = f"s3://{write_bucket}/{model_key}"
output_uri = f"s3://{write_bucket}/{output_key}"
estimator_output_uri = f"s3://{write_bucket}/{write_prefix}/training_jobs"
bias_report_output_uri = f"s3://{write_bucket}/{write_prefix}/clarify-output/bias"
explainability_report_output_uri = f"s3://{write_bucket}/{write_prefix}/clarify-output/explainability"

請注意,寫入儲存貯體名稱由 SageMaker 工作階段物件派生而來。您的預設儲存貯體名稱為 sagemaker-<您的區域>-<您的帳戶 ID>。此儲存貯體是所有訓練成品上傳到的位置。用於訓練的資料集存在於一個名為 sagemaker-sample-files 的公有 S3 儲存貯體中,該儲存貯體被指定為讀取儲存貯體。 請注意,正在匯入的 SageMaker XGBoost 架構不是您在上一步中安裝的開放原始碼架構。它是一個內建架構,帶有一個 Docker 容器映像,可以用來縱向擴展模型訓練。

複製並貼上以下程式碼區塊,以設定模型名稱以及訓練和推論執行個體組態和計數。這些設定使您能夠透過使用適當的執行個體類型和數量,來管理訓練和推論過程。

tuning_job_name_prefix = "xgbtune" 
training_job_name_prefix = "xgbtrain"

xgb_model_name = "fraud-detect-xgb-model"
endpoint_name_prefix = "xgb-fraud-model-dev"
train_instance_count = 1
train_instance_type = "ml.m4.xlarge"
predictor_instance_count = 1
predictor_instance_type = "ml.m4.xlarge"
clarify_instance_count = 1
clarify_instance_type = "ml.m4.xlarge"

步驟 3:在指令碼模式下啟動超參數調整任務

藉助 SageMaker Studio,您可以在 Python 指令碼內引入您自己的邏輯,以用於訓練。透過將訓練邏輯封裝在指令碼中,您可以結合自訂訓練慣例和模型組態,同時仍然使用由 AWS 維護的通用 ML 架構容器。在本教學中,您將準備一個訓練指令碼,該指令碼使用 AWS 提供的 XGBoost 容器支援的開放原始碼 XGBoost 架構,並大規模啟動超參數調整任務。若要訓練此模型,您可以將 fraud (詐騙) 一欄用作目標欄。

指令碼模式的第一級是能夠在一個獨立的自訂 Python 指令碼中定義自己的訓練程序,並在定義 SageMaker 估算器時使用該指令碼作為進入點。複製並貼上以下程式碼區塊,以編寫封裝模型訓練邏輯的 Python 指令碼。

%%writefile xgboost_train.py

import argparse
import os
import joblib
import json
import pandas as pd
import xgboost as xgb
from sklearn.metrics import roc_auc_score

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    # Hyperparameters and algorithm parameters are described here
    parser.add_argument("--num_round", type=int, default=100)
    parser.add_argument("--max_depth", type=int, default=3)
    parser.add_argument("--eta", type=float, default=0.2)
    parser.add_argument("--subsample", type=float, default=0.9)
    parser.add_argument("--colsample_bytree", type=float, default=0.8)
    parser.add_argument("--objective", type=str, default="binary:logistic")
    parser.add_argument("--eval_metric", type=str, default="auc")
    parser.add_argument("--nfold", type=int, default=3)
    parser.add_argument("--early_stopping_rounds", type=int, default=3)
    

    # SageMaker specific arguments. Defaults are set in the environment variables
    # Location of input training data
    parser.add_argument("--train_data_dir", type=str, default=os.environ.get("SM_CHANNEL_TRAIN"))
    # Location of input validation data
    parser.add_argument("--validation_data_dir", type=str, default=os.environ.get("SM_CHANNEL_VALIDATION"))
    # Location where trained model will be stored. Default set by SageMaker, /opt/ml/model
    parser.add_argument("--model_dir", type=str, default=os.environ.get("SM_MODEL_DIR"))
    # Location where model artifacts will be stored. Default set by SageMaker, /opt/ml/output/data
    parser.add_argument("--output_data_dir", type=str, default=os.environ.get("SM_OUTPUT_DATA_DIR"))
    
    args = parser.parse_args()

    data_train = pd.read_csv(f"{args.train_data_dir}/train.csv")
    train = data_train.drop("fraud", axis=1)
    label_train = pd.DataFrame(data_train["fraud"])
    dtrain = xgb.DMatrix(train, label=label_train)
    
    
    data_validation = pd.read_csv(f"{args.validation_data_dir}/validation.csv")
    validation = data_validation.drop("fraud", axis=1)
    label_validation = pd.DataFrame(data_validation["fraud"])
    dvalidation = xgb.DMatrix(validation, label=label_validation)

    params = {"max_depth": args.max_depth,
              "eta": args.eta,
              "objective": args.objective,
              "subsample" : args.subsample,
              "colsample_bytree":args.colsample_bytree
             }
    
    num_boost_round = args.num_round
    nfold = args.nfold
    early_stopping_rounds = args.early_stopping_rounds
    
    cv_results = xgb.cv(
        params=params,
        dtrain=dtrain,
        num_boost_round=num_boost_round,
        nfold=nfold,
        early_stopping_rounds=early_stopping_rounds,
        metrics=["auc"],
        seed=42,
    )
    
    model = xgb.train(params=params, dtrain=dtrain, num_boost_round=len(cv_results))
    
    train_pred = model.predict(dtrain)
    validation_pred = model.predict(dvalidation)
    
    train_auc = roc_auc_score(label_train, train_pred)
    validation_auc = roc_auc_score(label_validation, validation_pred)
    
    print(f"[0]#011train-auc:{train_auc:.2f}")
    print(f"[0]#011validation-auc:{validation_auc:.2f}")

    metrics_data = {"hyperparameters" : params,
                    "binary_classification_metrics": {"validation:auc": {"value": validation_auc},
                                                      "train:auc": {"value": train_auc}
                                                     }
                   }
              
    # Save the evaluation metrics to the location specified by output_data_dir
    metrics_location = args.output_data_dir + "/metrics.json"
    
    # Save the model to the location specified by model_dir
    model_location = args.model_dir + "/xgboost-model"

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

    with open(model_location, "wb") as f:
        joblib.dump(model, f)

注意指令碼匯入您之前安裝的開放原始碼 XGBoost 程式庫的方式。

SageMaker 執行進入點指令碼並提供所有輸入參數,如模型組態詳細資訊和作為命令列引數的輸入輸出路徑。該指令碼使用 Python 程式庫 "argparse" 取得提供的參數。

您的訓練指令碼在 Docker 容器中執行,SageMaker 會自動將訓練和驗證資料集從 Amazon S3 下載到容器內的本機路徑。這些位置可以透過環境變數來存取。如需 SageMaker 環境變數的詳盡清單,請參閱環境變數

當您準備好訓練指令碼後,您可以具現化 SageMaker 估算器。您可以使用 AWS 管理的 XGBoost 估算器,因為它管理可以執行自訂指令碼的 XGBoost 容器。若要具現化 XGBoost 估算器,複製並貼上以下程式碼。

# SageMaker estimator

# Set static hyperparameters that will not be tuned
static_hyperparams = {  
                        "eval_metric" : "auc",
                        "objective": "binary:logistic",
                        "num_round": "5"
                      }

xgb_estimator = XGBoost(
                        entry_point="xgboost_train.py",
                        output_path=estimator_output_uri,
                        code_location=estimator_output_uri,
                        hyperparameters=static_hyperparams,
                        role=sagemaker_role,
                        instance_count=train_instance_count,
                        instance_type=train_instance_type,
                        framework_version="1.3-1",
                        base_job_name=training_job_name_prefix
                    )

您可以在指定估算器時指定靜態組態參數。在本教學中,您可以使用接收者操作特徵曲線下面積 (ROC-AUC) 作為評估指標。為了控制執行所需的時間,輪數已設定為 5 輪。

自訂指令碼和訓練執行個體組態已作為參數傳遞給估算器物件。選擇的 XGBoost 版本匹配您之前安裝的版本。

 

在本教學中,您將調整四個 XGBoost 超參數:

  • eta:在更新中使用步長收縮來防止過度擬合。每次提升步驟後,您可以直接取得新特徵的權重。eta 參數實際上縮小了特徵權重,使提升過程更加保守。
  • subsample:訓練執行個體的次取樣比率。將它設定為 0.5 意味著 XGBoost 會在產生樹之前對訓練資料的一半進行隨機取樣。在每次提升迭代中使用不同的子集有助於防止過度擬合。
  • colsample_bytree:用於產生提升過程中的每棵樹的部分特徵。使用特徵子集來建立每棵樹能夠在建模過程中引入更多的隨機性,從而提高類推性。
  • max_depth:樹的最大深度。增加這個值會使模型更加複雜,並可能過度擬合。

複製並貼上以下程式碼區塊,以設定要從中搜尋的上述超參數的範圍。

# Setting ranges of hyperparameters to be tuned
hyperparameter_ranges = {
    "eta": ContinuousParameter(0, 1),
    "subsample": ContinuousParameter(0.7, 0.95),
    "colsample_bytree": ContinuousParameter(0.7, 0.95),
    "max_depth": IntegerParameter(1, 5)
}

複製並貼上以下程式碼區塊,以設定超參數調整器。SageMaker 執行貝氏最佳化常式作為搜尋程序的預設設定。在本教學中,您可以使用隨機搜尋方法來減少執行時間。參數根據使用驗證資料集時模型的 AUC 效能進行調整。

objective_metric_name = "validation:auc"

# Setting up tuner object
tuner_config_dict = {
                     "estimator" : xgb_estimator,
                     "max_jobs" : 5,
                     "max_parallel_jobs" : 2,
                     "objective_metric_name" : objective_metric_name,
                     "hyperparameter_ranges" : hyperparameter_ranges,
                     "base_tuning_job_name" : tuning_job_name_prefix,
                     "strategy" : "Random"
                    }
tuner = HyperparameterTuner(**tuner_config_dict)

您可以在調整器物件上呼叫 fit () 方法以啟動超參數調整任務。為了擬合調整器,您可以指定不同的輸入管道。此教學提供訓練和驗證管道。複製並貼上以下程式碼區塊,以啟動超參數調整任務。完成此操作大約需要 13 分鐘。

# Setting the input channels for tuning job
s3_input_train = TrainingInput(s3_data="s3://{}/{}".format(read_bucket, train_data_key), content_type="csv", s3_data_type="S3Prefix")
s3_input_validation = (TrainingInput(s3_data="s3://{}/{}".format(read_bucket, validation_data_key), 
                                    content_type="csv", s3_data_type="S3Prefix")
                      )

tuner.fit(inputs={"train": s3_input_train, "validation": s3_input_validation}, include_cls_metadata=False)
tuner.wait()

啟動的調整任務可在 SageMaker 主控台的 Hyperparameter tuning jobs (超參數調整任務) 下查看。請注意,由於時間戳記不同,附加的影像中顯示的調整任務名稱與您看到的名稱並不相同。

 

 

調整完成後,您即可存取結果摘要。複製並貼上以下程式碼區塊,以在依遞減順序排序的 pandas DataFrame 中擷取調整任務結果。

# Summary of tuning results ordered in descending order of performance
df_tuner = sagemaker.HyperparameterTuningJobAnalytics(tuner.latest_tuning_job.job_name).dataframe()
df_tuner = df_tuner[df_tuner["FinalObjectiveValue"]>-float('inf')].sort_values("FinalObjectiveValue", ascending=False)
df_tuner

您可以檢查效能最佳的超參數組合。

 

 

步驟 4:使用 SageMaker Clarify 檢查模型偏差並解釋模型預測

在得到經過訓練的模型後,您需要了解模型或資料中是否存在任何固有偏差,然後才能部署模型。模型預測可能是偏差的來源 (例如,如果它們做出的預測對一個群體產生負面結果比另一個群體更頻繁)。SageMaker Clarify 使用特徵歸因方法協助解釋經過訓練的模型的預測。本教學的重點是訓練後偏差指標和可解釋性的模型 SHAP 值。具體來說,包含以下常見任務:

  • 資料和模型偏差偵測
  • 使用特徵重要性值的模型可解釋性
  • 特徵影響和對單個資料樣本的局部解釋

在 SageMaker Clarify 能夠執行模型偏差偵測之前,它需要一個 SageMaker 模型,該模型由 SageMaker Clarify 部署到一個臨時端點,作為分析的一部分。然後,當 SageMaker Clarify 分析完成後,該端點將被刪除。複製並貼上以下程式碼區塊,以根據從調整任務中確定的最佳訓練任務建立 SageMaker 模型。

tuner_job_info = sagemaker_client.describe_hyper_parameter_tuning_job(HyperParameterTuningJobName=tuner.latest_tuning_job.job_name)

model_matches = sagemaker_client.list_models(NameContains=xgb_model_name)["Models"]

if not model_matches:
    _ = sess.create_model_from_job(
            name=xgb_model_name,
            training_job_name=tuner_job_info['BestTrainingJob']["TrainingJobName"],
            role=sagemaker_role,
            image_uri=tuner_job_info['TrainingJobDefinition']["AlgorithmSpecification"]["TrainingImage"]
            )
else:

    print(f"Model {xgb_model_name} already exists.")

若要執行偏差偵測,您需要為 SageMaker Clarify 設定多個元件組態。您可以在 Amazon SageMaker Clarify 中找到更多詳細資訊。對於此教學,除了標準組態之外,您還需要設定 SageMaker Clarify,以透過檢查目標是否偏向於以客戶性別為基礎的值,來偵測資料在統計學上是否對女性有偏差。複製並貼上以下程式碼,以設定 SageMaker Clarify 組態。

train_df = pd.read_csv(train_data_uri)
train_df_cols = train_df.columns.to_list()

clarify_processor = sagemaker.clarify.SageMakerClarifyProcessor(
    role=sagemaker_role,
    instance_count=clarify_instance_count,
    instance_type=clarify_instance_type,
    sagemaker_session=sess,
)

# Data config
bias_data_config = sagemaker.clarify.DataConfig(
    s3_data_input_path=train_data_uri,
    s3_output_path=bias_report_output_uri,
    label="fraud",
    headers=train_df_cols,
    dataset_type="text/csv",
)

# Model config
model_config = sagemaker.clarify.ModelConfig(
    model_name=xgb_model_name,
    instance_type=train_instance_type,
    instance_count=1,
    accept_type="text/csv",
)

# Model predictions config to get binary labels from probabilities
predictions_config = sagemaker.clarify.ModelPredictedLabelConfig(probability_threshold=0.5)

# Bias config
bias_config = sagemaker.clarify.BiasConfig(
    label_values_or_threshold=[0],
    facet_name="customer_gender_female",
    facet_values_or_threshold=[1],
)

# Run Clarify job
clarify_processor.run_bias(
    data_config=bias_data_config,
    bias_config=bias_config,
    model_config=model_config,
    model_predicted_label_config=predictions_config,
    pre_training_methods=["CI"],
    post_training_methods=["DPPL"])

clarify_bias_job_name = clarify_processor.latest_job.name

在 SageMaker Clarify 內,訓練前指標顯示資料中預先存在偏差,而訓練後指標顯示模型預測存在偏差。藉助 SageMaker 開發套件,您可以指定想要檢查哪些群組的偏差,以及要考慮哪些偏差指標。出於本教學的目的,您將分別使用 Class Imbalance (CI) (類不平衡 (CI)) 和 Difference in Positive Proportions in Predicted Labels (DPPL) (預測標籤中正比例的差異 (DPPL)) 作為訓練前和訓練後偏差統計的範例。如需其他偏差指標的詳細資訊,請參閱衡量訓練前偏差訓練後資料和模型偏差。複製並貼上以下程式碼區塊,以執行 SageMaker Clarify 並產生偏差報告。所選的偏差指標將作為參數傳遞到 run_bias 方法中。執行此程式碼大約需要 12 分鐘。

clarify_processor.run_bias(
    data_config=bias_data_config,
    bias_config=bias_config,
    model_config=model_config,
    model_predicted_label_config=predictions_config,
    pre_training_methods=["CI"],
    post_training_methods=["DPPL"]
    )

clarify_bias_job_name = clarify_processor.latest_job.name

SageMaker Clarify 的輸出會儲存到您的預設 S3 儲存貯體。複製並貼上以下程式碼,以將 PDF 格式的 SageMaker Clarify 報告從 Amazon S3 下載到 SageMaker Studio 中的本機目錄。

# Copy bias report and view locally
!aws s3 cp s3://{write_bucket}/{write_prefix}/clarify-output/bias/report.pdf ./clarify_bias_output.pdf

在該 PDF 報告中,訓練前和訓練後偏差指標顯示,該資料集似乎在客戶性別特徵方面存在類不平衡性。這種不平衡性可以透過套用 SMOTE 等技術重新建立訓練資料集來糾正。您還可以使用 SageMaker Data Wrangler 並指定服務中可用的 SMOTE 等多個選項之一,以平衡訓練資料集。如需詳細資訊,請參閱 Data Wrangler 平衡資料。為簡單起見,本教學中不包含此步驟。

除了資料偏差之外,SageMaker Clarify 還可以分析經過訓練的模型,並根據特徵重要性建立模型可解釋性報告。SageMaker Clarify 會使用 SHAP 值來解釋每個輸入特徵對最終預測的貢獻。複製並貼上以下程式碼區塊,以設定並執行模型可解釋性分析。執行此程式碼區塊大約需要 14 分鐘。

explainability_data_config = sagemaker.clarify.DataConfig(
    s3_data_input_path=train_data_uri,
    s3_output_path=explainability_report_output_uri,
    label="fraud",
    headers=train_df_cols,
    dataset_type="text/csv",
)

# Use mean of train dataset as baseline data point
shap_baseline = [list(train_df.drop(["fraud"], axis=1).mean())]

shap_config = sagemaker.clarify.SHAPConfig(
    baseline=shap_baseline,
    num_samples=500,
    agg_method="mean_abs",
    save_local_shap_values=True,
)

clarify_processor.run_explainability(
    data_config=explainability_data_config,
    model_config=model_config,
    explainability_config=shap_config
)

複製並貼上以下程式碼,以將 PDF 格式的 SageMaker Clarify 可解釋性報告從 Amazon S3 下載到 SageMaker Studio 中的本機目錄。

# Copy explainability report and view
!aws s3 cp s3://{write_bucket}/{write_prefix}/clarify-output/explainability/report.pdf ./clarify_explainability_output.pdf

該報告包含特徵重要性圖表,展示輸入特徵對模型預測的貢獻度。對於本教學中訓練的模型,產生預測最重要的特徵似乎是 num-injuries,緊隨其後的特徵是 customer_gender_male。這種特徵排名提供對預測機制的重要洞見,並透過合理且可解釋的 ML 使用驅動模型的微調和開發。

 

 

偏差和可解釋性分析結果可以在 SageMaker Studio 中的 SageMaker Resources (SageMaker 資源) 下和下拉式清單中的 Experiments and trials (實驗和試驗) 選項下檢視。選擇 Unassigned trial components (未指派的試驗元件)。

 

 

選取名為 clarify-explainability-<時間戳記> 的可解釋性報告。

 

 

Explainability (可解釋性) 標籤上,您可以看到特徵重要性圖表。您還可以透過選擇 Export PDF report (輸出 PDF 報告) 下載報告。

 

 

SageMaker Clarify 產生的可解釋性報告還提供一個稱為 out.csv 的檔案,其中包含各個樣本的本機 SHAP 值。複製並貼上下面的程式碼區塊,以使用該檔案來視覺化任何單個範例的解釋 (每個特徵對模型預測的影響)。

import matplotlib.pyplot as plt
import matplotlib
%matplotlib inline
local_explanations_out = pd.read_csv(explainability_report_output_uri + "/explanations_shap/out.csv")
feature_names = [str.replace(c, "_label0", "") for c in 
local_explanations_out.columns.to_series()]
local_explanations_out.columns = feature_names

selected_example = 100
print("Example number:", selected_example)

local_explanations_out.iloc[selected_example].plot(
    kind="bar", title="Local explanation for the example number " + str(selected_example), rot=60, figsize=(20, 8)
);

對於選擇的範例 (測試集中的第一個樣本),索賠總額、性別和傷害次數對預測影響最大。

 

 

步驟 5:將模型部署到即時推論端點

在此步驟中,您將部署從超參數調整任務中取得的最佳模型部署到一個即時推論端點,然後使用該端點產生預測。有多種方法可以部署一個訓練好的模型,例如使用 SageMaker 開發套件、AWS 開發套件 - Boto3 和 SageMaker 主控台。如需詳細資訊,請參閱 Amazon SageMaker 文件中的部署用於推論的模型。在此範例中,您將使用 SageMaker 開發套件將模型部署到即時端點。

 

複製並貼上以下程式碼區塊,以部署最佳模型。

best_train_job_name = tuner.best_training_job()

model_path = estimator_output_uri + '/' + best_train_job_name + '/output/model.tar.gz'
training_image = retrieve(framework="xgboost", region=region, version="1.3-1")
create_model_config = {"model_data":model_path,
                       "role":sagemaker_role,
                       "image_uri":training_image,
                       "name":endpoint_name_prefix,
                       "predictor_cls":sagemaker.predictor.Predictor
                       }
# Create a SageMaker model
model = sagemaker.model.Model(**create_model_config)

# Deploy the best model and get access to a SageMaker Predictor
predictor = model.deploy(initial_instance_count=predictor_instance_count, 
                         instance_type=predictor_instance_type,
                         serializer=CSVSerializer(),
                         deserializer=CSVDeserializer())
print(f"\nModel deployed at endpoint : {model.endpoint_name}")

該程式碼使用最佳訓練任務名稱從 Amazon S3 擷取模型。XGBoost 可以接受 text/libsvm 或 text/csv 格式的輸入資料。本教學中使用的輸入資料集採 CSV 格式,因此部署組態包括一個 CSVSerializer (將 CSV 輸入轉換為位元組串流) 以及一個 CSVDeserializer (將位元組串流中的原生模型輸出轉換回 CSV 格式供我們使用)。該程式碼區塊執行完畢後,將返回模型部署到的端點的名稱。該部署還會返回一個 SageMaker Predictor,它可以用來叫用端點來執行預測,如下一部分所示。

 

您可以透過按一下 SageMaker Resources (SageMaker 資源) 圖示並從下拉式清單中選取 Endpoints (端點),來從 SageMaker Studio 介面查看部署的端點。

您還可以透過 SageMaker 主控台下的 Inference (推論)、Endpoints (端點) 檢查端點。

現在,模型已部署到端點,您可以透過直接叫用 REST API (本教學中未描述)、透過 AWS 開發套件、SageMaker Studio 中的圖形介面或使用 SageMaker Python 開發套件來叫用。在本教學中,您將使用透過部署步驟提供的 SageMaker Predictor 來取得對一個或多個測試樣本的即時模型預測。複製並貼上下面的程式碼區塊,以叫用端點併傳送單個測試資料樣本。

# Sample test data
test_df = pd.read_csv(test_data_uri)
payload = test_df.drop(["fraud"], axis=1).iloc[0].to_list()
print(f"Model predicted score : {float(predictor.predict(payload)[0][0]):.3f}, True label : {test_df['fraud'].iloc[0]}")

該儲存格的輸出顯示模型端點發回的真實標籤和預測分數。由於預測的機率很低,測試樣本被模型正確地標記為非詐騙。

步驟 6:清除資源

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

若要刪除模型和端點,請將以下程式碼複製並貼到筆記本中。

# Delete model
try:
 sess.delete_model(xgb_model_name)
except:
 pass
sess.delete_model(model.name)

# Delete inference endpoint config
sess.delete_endpoint_config(endpoint_config_name=predictor._get_endpoint_config_name())

# Delete inference endpoint
sess.delete_endpoint(endpoint_name=model.endpoint_name)

若要刪除 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 網域,請略過步驟 6 的其餘部分並直接進入「結論」部分。 

如果您在步驟 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 程式庫與 AWS 管理的 XGBoost 容器,透過 SageMaker 超參數調整任務訓練和調整模型。您還使用 SageMaker Clarify 分析了偏差和模型的可解釋性,並使用報告評估了特徵對個別預測的影響。最後,您使用 SageMaker 開發套件將模型部署到了即時推論端點,並使用樣本承載對其進行了測試。

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

本頁對您是否有幫助?

自動建立 ML 模型

了解如何使用 AutoML 在不編寫程式碼的情況下開發 ML 模型。
下一步 »

部署經過訓練的模型

了解如何部署經過訓練的 ML 模型以進行推論。
下一步 »

尋找更多實作教學

探索其他機器學習教學以深入探究。
下一步 »