训练机器学习模型

教程

概览

在此教程中,您将学习如何使用 Amazon SageMaker Studio 和 Amazon SageMaker Clarify 训练、调优和评估机器学习(ML)模型。
 
Amazon SageMaker Studio 是 ML 的一个集成式开发环境(IDE),它提供了一个完全托管的 Jupyter Notebook 界面,您可以在其中执行端到端 ML 生命周期任务。使用 SageMaker Studio,您可以创建和探索数据集;准备训练数据;构建、训练和调优模型;并部署经过训练的推理模型——所有这些都可以在一个地方进行。使用 Amazon SageMaker Clarify,您可以更清楚地了解您的训练数据和模型,以便您可以识别和限制偏差,并解释预测。
 
针对此教程,您将使用合成的汽车保险索赔数据集。输入是训练、验证和测试数据集,每个数据集都包含关于索赔和客户的详细信息和提取的特征,以及一个欺诈列,表明索赔是欺诈性的还是其他的。您将使用开源 XGBoost 框架在这个合成数据集上构建一个二进制分类模型,以预测索赔被欺诈的可能性。您还将通过运行偏差和功能重要性报告来评估经过训练的模型,部署模型进行测试,并运行样本推理来评估模型性能和解释预测。

您将学到的内容

在本指南中,您将:

  • 使用脚本模式构建、训练和调优模型
  • 检测 ML 模型中的偏差并了解模型预测
  • 将经过训练的模型部署到实时推理端点进行测试
  • 通过生成样本预测和理解功能影响来评估模型

先决条件

在开始学习本指南之前,您需要:

  • 一个 AWS 账户:如果您还没有账户,请遵循设置 AWS 环境入门指南中的说明获取快速概览。

 AWS 使用经验

新手

 最短完成时间

2 小时

 所需费用

请参阅 SageMaker 定价估算此教程的费用。

 需要

您必须登录 AWS 账户。

 使用的服务

Amazon SageMaker Studio、Amazon SageMaker Clarify

 上次更新日期

2023 年 3 月 27 日

实施

第 1 步:设置 Amazon SageMaker Studio 域

使用 Amazon SageMaker,您可以使用控制台可视化地部署模型,也可以使用 SageMaker Studio 或 SageMaker 笔记本以编程方式部署模型。在本教程中,您将使用 SageMaker Studio 笔记本以编程的方式部署模型,该笔记本需要一个 SageMaker Studio 域。

如果您在美国东部(弗吉尼亚州北部)区域已经有一个 SageMaker Studio 域,请遵照 SageMaker Studio 设置指南将所需的 AWS IAM 策略附加到您的 SageMaker Studio 账户,然后跳过第 1 步,并直接继续第 2 步操作。 

如果您没有现有的 SageMaker Studio 域,第 1 步以运行 AWS CloudFormation 模板,从而创建 SageMaker Studio 域并添加本教程剩余部分所需的权限。

1.1 选择 AWS CloudFormation 堆栈链接。此链接将打开 AWS CloudFormation 控制台并创建您的 SageMaker Studio 域和名为 studio-user 的用户。它还将添加所需权限到您的 SageMaker Studio 账户。在 CloudFormation 控制台中,确认 美国东部(弗吉尼亚州北部)是右上角显示的区域。 堆栈名称应为 CFN-SM-IM-Lambda-Catalog,且不应更改。选择 I acknowledge that AWS CloudFormation might create IAM resources with custom names(我确认,AWS CloudFormation 可能使用自定义名称创建 IAM 资源),然后选择 Create stack(创建堆栈)。此堆栈需要花费 10 分钟左右才能创建所有资源。

此堆栈假设您已经在账户中设置了一个默认公有 VPC。如果您没有公有 VPC,请参阅具有单个公有子网的 VPC以了解如何创建公有 VPC。

选择 I acknowledge that AWS CloudFormation might create IAM resources(我确认,AWS CloudFormation 可能创建 IAM 资源),然后选择 Create stack(创建堆栈)。

第 2 步:设置 SageMaker Studio 笔记本

在此步骤中,您将启动一个新的 SageMaker Studio 笔记本,安装必要的开源库,并设置与其他服务(包括 Amazon Simple Storage Service(Amazon S3))交互所需的 SageMaker 变量。

2.1 在管理控制台搜索栏中输入 SageMaker Studio,然后选择 SageMaker Studio

2.2 从 SageMaker 控制台右上角的 Region(区域)下拉列表中选择 US East (N. Virginia)(美国东部(弗吉尼亚州北部))。要启动应用程序,请从左侧导航窗格中选择 Studio。 选择 studio-user 作为用户个人资料,然后选择Open Studio(打开 Studio)按钮。

2.3 此时将显示在 SageMaker Studio 中创建应用程序的屏幕。该应用程序需要几分钟才能加载完毕。

2.4 打开 SageMaker Studio 界面。在导航栏上,选择 File(文件)、New(新建)、Notebook(笔记本)

2.5 在 Set up notebook environment(设置笔记本环境)对话框中的 Image(图像)下,选择 Data Science 3(数据科学 3)。此时将自动选择 Python 3 内核。对于实例类型,选择 ml.t3.medium。选择 Select(选择)。

2.6 笔记本右上角上的内核现在应显示 Python 3 (Data Science)(Python 3(数据科学))。

2.7 在 Jupyter notebook 的新代码单元格中,复制并粘贴以下代码,然后运行该单元格。这将确保您使用的是最新版本的 SageMaker。

%pip install sagemaker --upgrade --quiet 

2.8 要安装开源 XGBoost 和 Pandas 库的特定版本,请复制并粘贴以下代码片段到笔记本的单元格中,然后按 Shift+Enter 以运行当前单元格。忽略任何警告以重新启动内核或任何依赖项冲突错误。

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

2.9 您还需要实例化 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"

2.10 请注意,写入桶名称由 SageMaker 会话对象派生而来。您的默认桶具有名称 sagemaker-<your-Region>-<your-account-id>。 此桶是上传所有训练构件所在的位置。用于训练的数据集存在于一个名为 sagemaker-sample-files 的公有 S3 桶桶中,该桶被指定为读取桶。请注意,正在导入的 SageMaker XGBoost 框架不是您在上一步中安装的开源框架。它是一个内置框架,带有一个 Docker 容器映像,可以用来纵向扩展模型训练。

2.11 复制并粘贴以下代码块,以设置模型名称以及训练和推理实例配置和计数。这些设置使您能够通过使用适当的实例类型和计数来管理训练和推理过程。

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 用作目标列。

3.1 脚本模式的第一级是能够在一个自包含的、定制的 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 运行入口点脚本并提供所有输入参数,如模型配置详细信息和输入输出路径作为命令行参数。该脚本使用“argparse”Python 库获取提供的参数。

您的训练脚本在 Docker 容器中运行,SageMaker 会自动将训练和验证数据集从 Amazon S3 下载到容器内的本地路径。这些位置可以通过环境变量来访问。关于 SageMaker 环境变量的详尽列表,请参阅环境变量

3.2 当您准备好训练脚本后,您可以实例化 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
                    )

3.3 您可以在指定估算器时指定静态配置参数。在本教程中,您可以使用受试者工作特征曲线下面积(ROC-AUC)作为评估指标。为了控制运行所需的时间,轮数已设置为 5 轮。

自定义脚本和训练实例配置已传递给估算器对象作为参数。选择了 XGBoost 版本匹配您之前安装的版本。

 

3.4 在本教程中,您将调优四个 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)
}

3.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)

3.6 您可以在调优器对象上调用 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()

3.7 启动的调优任务可在 SageMaker 控制台的 Hyperparameter tuning jobs(超参数调优任务)下查看(请注意,由于时间戳不同,附加图像中显示的调优任务名称与您看到的名称不匹配)。

 

 

3.8 当调优完成后,您即可访问结果摘要。复制并粘贴以下代码块,以在按性能降序排列的 pandas 数据框中检索调优任务结果。

# 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

3.9 您可以检查性能最好的超参数组合。

 

 

第 4 步:检查模型偏差并使用 SageMaker Clarify 解释模型预测

当您具有训练模型后,在部署之前,了解模型或数据中是否存在任何固有偏差很重要。模型预测可能是偏差的来源(例如,如果它们做出的预测对一个群体产生的负面结果比另一个群体更频繁)。SageMaker Clarify 帮助解释训练模型如何使用特征归因方法进行预测。本教程的重点是训练后偏差指标和模型可解释性的 SHAP 值。具体来说,包含以下常见任务:

  • 数据和模型偏差检测
  • 使用功能重要性值的模型可解释性
  • 功能影响和对单个数据样本的局部解释

4.1 在 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.")

4.2 要运行偏差检测,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],
)

4.3 在 SageMaker Clarify 内,训练前指标显示数据中预先存在偏差,而训练后指标显示模型预测存在偏差。使用 SageMaker 开发工具包,您可以指定您想要检查哪些组的偏差,以及要考虑哪些偏差指标。出于本教程的目的,您分别使用类不平衡(CI)预测标签中正比例的差异(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

4.4 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

4.5 在 PDF 报告中,基于训练前和训练后的偏差指标,数据集似乎在客户性别特征方面存在类不平衡性。这种不平衡性可以通过应用 SMOTE 等技术重新创建训练数据集来纠正。您还可以使用 SageMaker Data Wrangler 并指定多个选项之一,包括服务中可用的 SMOTE,以平衡训练数据集。有关更多详细信息,请参阅 Data Wrangler 平衡数据。为简单起见,本教程中不包含此步骤。

4.6 除了数据偏差之外,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
)

4.7 复制并粘贴以下代码,以将 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

4.8.该报告包含功能重要性图表,以展示输入功能对模型预测的贡献度。对于本教程中训练的模型,num-injuries 功能似乎起到了最重要的作用,随后是生成预测的 customer_gender_male 功能。这种功能排名为预测机制提供了重要的见解,并通过公平且可解释的使用 ML 驱动模型的细化和开发。

4.9 偏差和可解释性分析结果也可以在 SageMaker Studio 的 SageMaker 主页Experiments(实验)部分下查看。

4.10 选择 Unassigned runs(未分配运行)。  选择名为 clarify-explainability-<datetimestamp> 的可解释性报告。

4.11 在 Explainability(可解释性)选项卡上,您可以可视化功能重要性图表。您还可以通过选择 Export PDF report(导出 PDF 报告)下载报告。

4.12 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)
);

4.13 对于所选示例(测试集中的第一个示例),车辆索赔金额、性别、每日事故和受伤人数对预测的贡献最大。

第 5 步:将模型部署到实时推理端点

在此步骤中,您将从超参数调优任务中获得的最佳模型部署到一个实时推理端点,然后使用该端点生成预测。有多种方法可以部署一个训练好的模型,例如 SageMaker 开发工具包、AWS 开发工具包 - Boto3 和 SageMaker 控制台。有关更多信息,请参阅 Amazon SageMaker 文档中的部署用于推理的模型。在此示例中,您使用 SageMaker 开发工具包将模型部署到实时端点中。

 

5.1 复制并粘贴以下代码块,以部署最佳模型。

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}")

5.2 该代码使用最佳训练任务名称从 Amazon S3 检索模型。XGBoost 可以以 text/libsvm 或 text/csv 格式接受输入数据。本教程中使用的输入数据集采用 CSV 格式,因此部署配置包括一个 CSVSerializer,它将 CSV 输入转换为字节流,以及一个 CSVDeserializer,它将字节流中的本地模型输出转换回 CSV 格式供我们使用。完成后,代码块返回模型部署到的端点的名称。部署还返回一个 SageMaker Predictor,它可以用来调用端点来运行预测,如下一部分所示。

 

5.3 您可以从 SageMaker Studio 界面查看已部署的端点,方法是选择 SageMaker 主页图标并选择 Deployments(部署),然后选择 Endpoints(端点)。

5.4 您还可以通过 SageMaker 控制台下的 Inference(推理)、Endpoints(端点)检查端点。

5.5 现在,模型已部署到端点,您可以通过直接调用 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]}")

5.6 单元格的输出显示了模型端点发回的真实标签和预测分数。由于预测的概率很低,测试样本被模型正确地标记为非欺诈。

第 6 步:清理资源

最佳实践是删除您不再使用的资源,以免产生意外费用。

6.1 要删除模型和端点,请将以下代码复制并粘贴到笔记本中。

# 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)

6.2 要删除 S3 桶,请执行以下操作: 

  • 打开 Amazon S3 控制台。在导航栏上,选择 Buckets(桶)、sagemaker-<your-Region>-<your-account-id>,然后选择 fraud-detect-demo 旁的复选框。然后选择 Delete(删除)。
  • Delete objects(删除对象)对话框中,确认您是否已选中要删除的正确对象,并在 Permanently delete objects(永久删除对象)确认框中输入 permanently delete
  • 当此操作完成且桶为空时,您可以通过再次遵循相同程序来删除 sagemaker-<your-Region>-<your-account-id> 桶。
6.3 本教程中用于运行笔记本图像的数据科学内核将不断累积费用,直到您停止内核或执行以下步骤删除应用程序。有关更多信息,请参阅《Amazon SageMaker 开发人员指南》中的 关闭资源

要删除 SageMaker Studio 应用程序,请执行以下操作:在 SageMaker 控制台上,选择 Domains(域),然后选择 StudioDomain。从 User profiles(用户配置文件)列表中,选择 studio-user,然后通过选择 Delete app(删除应用程序)来删除 Apps(应用程序)下列出的所有应用程序。要删除 JupyterServer,请选择 Action(操作),然后选择 Delete(删除)。等待片刻直到 Status (状态)更改为 Deleted(已删除)。

6.4 如果您在第 1 步中使用了一个现有的 SageMaker Studio 域,则跳过第 6 步的其余部分,直接进入结论部分。 

如果您在第 1 步运行 CloudFormation 模板来创建新的 SageMaker Studio 域,请继续执行以下步骤以删除由 CloudFormation 模板创建的域、用户和资源。  

6.5 要打开 CloudFormation 控制台,请在 AWS 管理控制台搜索栏中输入 CloudFormation,然后从搜索结果中选择 CloudFormation

6.6 打开 CloudFormation 控制台。在 CloudFormation 窗格上,选择 Stacks(堆栈)。从 Status(状态)下拉列表中,选择 Active(活动)。在 Stack name(堆栈名称)下方,选择 CFN-SM-IM-Lambda-catalog 以打开堆栈详细信息页面。

6.7 在 CFN-SM-IM-Lambda-catalog 堆栈详细信息页面上,选择 Delete(删除)以删除堆栈以及在第 1 步中创建的资源。

结论

恭喜! 您已完成 训练机器学习模型教程。
 
在本教程中,您使用了 Amazon SageMaker Studio 在脚本模式下训练二进制分类模型。您结合使用了开源 XGBoost 库与 AWS 托管 XGBoost 容器使用 SageMaker 超参数调优任务训练和调优模型。您还使用 SageMaker Clarify 分析了偏差和模型的可解释性,并使用了报告来评估功能对个体预测的影响最后,您使用 SageMaker 开发工具包将模型部署到实时推理端点,并使用示例有效负载对其进行测试。
 
您可以按照下面的步骤使用 Amazon SageMaker 继续数据科学家之旅。


此页内容对您是否有帮助?

自动创建 ML 模型

了解如何使用 AutoML 在不编写代码的情况下开发 ML 模型。
下一步 »

部署经过训练的模型

了解如何部署经过训练的 ML 模型以进行推理。
下一步 »

查找更多操作教程

探索其他机器学习教程以进行深入了解。
下一步 »