首页  »  AWS 教程

在本地构建和训练机器学习模型

Amazon SageMaker Studio
ML
Olawale Olaleye
亚马逊云科技使用经验
初级
完成所需时间
15 分钟
前提条件

注册 / 登录 亚马逊云科技账户

所需费用

请根据 SageMaker 定价预估本实验所需资源费用。

上次更新时间
2022 年 7 月 7 日

概述

在本教程中,您将学习如何使用 Amazon SageMaker Studio 笔记本 (notebook) 在本地机器上构建和训练机器学习 (ML) 模型

Amazon SageMaker Studio 是一个适用于机器学习场景的集成开发环境 (IDE),提供全托管的 Jupyter 笔记本界面,您可以使用它执行端到端的机器学习生命周期任务。使用 SageMaker Studio,您可以在同一环境中创建和探索数据集、准备训练数据、构建和训练模型,以及部署已训练模型用于推理。

ML 开发中的一种常见做法是在使用完整数据集进行训练之前,进行数据集样本探索,测试和迭代多个模型和参数配置。Amazon SageMaker 为探索阶段提供了本地模式,让您能在运行全面训练作业之前测试训练逻辑、测试不同的建模方法,以及评估模型性能。

在本教程实验中,我们使用一份综合生成的汽车保险理赔数据集。输入数据是用于训练和测试的数据集,每个数据集都包含有关理赔和客户的详细信息和已提取的特征,其中包含一个表示理赔是否具有欺诈性的 fraud 列。我们将使用开源 XGBoost 框架,基于这个合成数据集,构建二元分类模型的原型,用于预测理赔具有欺诈性的可能性。

学习目标

在本指南中,您将:

  • 将训练数据从 Amazon S3 提取至 Amazon SageMaker
  • 在本地构建和训练 XGBoost 模型
  • 将已训练模型和构件保存至 Amazon S3

前提条件

开始本指南之前,您需要先满足以下条件:

  • 拥有 AWS 账户:如果您还没有 AWS 账户,请先创建和配置账户。更多信息,请参阅设置 AWS 环境

操作步骤

步骤 1:设置 Amazon SageMaker Studio 域

您可以使用 Amazon SageMaker 控制台以可视化方式部署一个模型,也可以使用 SageMaker Studio 或 SageMaker 笔记本通过编程方式部署模型。在本教程实验中,我们将使用 SageMaker Studio 笔记本以编程方式部署模型。使用这种方式,首先需要一个 SageMaker Studio 域。

Amazon SageMaker 允许每个账户在单个 AWS 区域中创建多个 Amazon SageMaker 域。如果您已经拥有一个在美国东部(弗吉尼亚州北部)区域的 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,选择使用 studio-user 用户打开 SageMaker Studio。

打开 SageMaker Studio 用户界面。在导航栏中,依次选择 File(文件) > New(新建) > Notebook(笔记本)。

Set up notebook environment(设置笔记本环境)对话框中,从 Image(镜像)下拉列表中选择 Data Science。系统自动选择了 Python 3 内核。点击 Select(选择)。 

笔记本右上角的内核现在应显示为 Python 3 (Data Science)

将以下代码片段复制并粘贴到笔记本的一个单元格中,按 Shift+Enter 运行当前单元格,更新用于与 AWS 服务进行交互的 API 库 aiobotocore。然后,安装 XGBoost 库。请忽略重新启动内核或依赖冲突错误的警告。

注意:  如果您遇到任何与 botocore 相关的问题,请降低笔记本中的 boto3 版本。

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

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

您还需要实例化 S3 客户端对象,并给出默认 S3 存储桶中指标和模型构件等内容的上传位置。将以下代码块复制并粘贴到笔记本中的一个单元格中,然后运行这个代码。请注意,写入存储桶名称源自 SageMaker 会话对象。您的默认存储桶的名称为 sagemaker-<区域>-<您的账户 ID>。所有训练构件都会上传至此存储桶。用于训练的数据集存储在名为 sagemaker-sample-files 的公共 S3 存储桶中,此存储桶已被指定为读取存储桶。存储桶内的位置通过 read 前缀指定。

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 objects(永久删除对象)确认框中输入 permanently delete(永久删除)。 
  • 完成该操作后存储桶将为空,此时您可以按照相同的步骤删除 sagemaker-<区域>-<您的账户 ID> 存储桶。

若您不停止内核或执行以下步骤来删除应用程序,本实验中用于运行笔记本镜像的 Data Science 内核将继续产生费用。有关更多信息,请参阅 Amazon SageMaker 开发者指南中的关闭资源

执行以下操作删除 SageMaker Studio 应用程序:在 SageMaker Studio 控制台上,选择 studio-user,然后选择 Delete app(删除应用程序),删除 Apps(应用程序)下的所有应用程序。请耐心等待,直到 Status(状态)变为 Deleted(已删除)为止。

如果您在步骤 1 中使用已有的 SageMaker Studio 域,请跳过以下步骤。 

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

在 AWS 控制台搜索栏中输入 CloudFormation,然后从搜索结果中选择 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 数据专家之旅。

推荐的后续步骤

自动创建机器学习模型

学习如何使用 AutoML,在不写代码的前提下开发机器学习(ML)模型。

部署已训练的模型

学习如何部署已训练好的机器学习模型,并用于推理。

查找更多实践教程

了解并深入探索其他机器学习入门教程。