概览
在本教程中,您将学习如何以本地方式在 Amazon SageMaker Studio 笔记本中构建与训练机器学习(ML)模型。
Amazon SageMaker Studio 是 ML 的一个集成开发环境(IDE),它提供了一个完全托管的 Jupyter Notebook 界面,您可以在其中执行端到端 ML 生命周期任务。使用 SageMaker Studio,您可以创建和探索数据集;准备训练数据,构建与训练模型,并部署经过训练的模型以用于推理 – 所有这些都可以在一个地方进行。
在使用完整的数据集进行训练前探索数据集示例并对多个模型和参数配置进行迭代,这是 ML 开发时的一种常见做法。在这个探索阶段,Amazon SageMaker 会提供本地模式,允许您在运行全规模训练作业前测试您的训练逻辑,尝试不同的建模方法,并衡量模型的性能。
针对此教程,您要使用合成的汽车保险索赔数据集。输入是训练和测试数据集,每个数据集都包含关于索赔和客户的详细信息和提取的特征,以及一个 fraud(欺诈)列,表明索赔是欺诈性的还是其他的。您将使用开源 XGBoost 框架在这个合成数据集上构建一个二进制分类模型原型,以预测索赔被欺诈的可能性。
您将学到的内容
在本指南中,您将:
- 从 Amazon S3 将训练数据提取到 Amazon SageMaker
- 在本地构建与训练 XGBoost 模型
- 将经过训练的模型和构件保存到 Amazon S3
先决条件
在开始学习本指南之前,您需要:
- 一个 AWS 账户:如果您还没有账户,请遵循设置 AWS 环境入门指南中的说明获取快速概览。
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 控制台中,确认美国东部(弗吉尼亚州北部) 是右上角显示的区域。 堆栈名称应为 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)(Python 3(数据科学))。
复制并粘贴以下代码片段到笔记本的单元格,按 Shift+Enter 运行当前单元格以便更新 aiobotocore 库,它是与很多 AWS 服务进行交互,并且会安装 XGBoost 库的 API。忽略任何警告以重新启动内核或任何依赖项冲突错误。
%pip install --upgrade -q aiobotocore
%pip install -q xgboost==1.3.1
您还需要实例化 S3 客户端对象,以及默认 S3 桶中上传指标和模型构件等内容的位置。要这样做,请复制并粘贴以下代码块并运行单元格。 请注意,写入桶名称由 SageMaker 会话对象派生而来。您的默认桶具有名称 sagemaker-<your-Region>-<your-account-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-<your-Region>-<your-account-id>,然后选择 fraud-detect-demo 旁的复选框。然后选择 Delete(删除)。
- 在 Delete objects(删除对象)对话框中,确认您是否已选中要删除的正确对象,并在 Permanently delete objects(永久删除对象)确认框中输入 permanently delete。
- 当此操作完成且桶为空时,您可以通过再次遵循相同程序来删除 sagemaker-<your-Region>-<your-account-id> 桶。
本教程中用于运行笔记本图像的数据科学内核将不断累积费用,直到您停止内核或执行以下步骤删除应用程序。 有关更多信息,请参阅 Amazon SageMaker 开发人员指南中的关闭资源。
要删除 SageMaker Studio 应用程序,请执行以下操作:在 SageMaker Studio 控制台中,选择 studio-user,然后通过选择 Delete app(删除应用程序)来删除 Apps(应用程序)下列出的所有应用程序。等待片刻直到状态更改为 Deleted(已删除)。
如果您在第 1 步中使用了一个现有的 SageMaker Studio 域,则跳过第 4 步的其余部分,直接进入结论部分。
如果您在第 1 步运行 CloudFormation 模板来创建新的 SageMaker Studio 域,请继续执行以下步骤以删除由 CloudFormation 模板创建的域、用户和资源。
要打开 CloudFormation 控制台,请在 AWS 管理控制台搜索栏中输入 CloudFormation,然后从搜索结果中选择 CloudFormation。
在 CloudFormation 窗格上,选择 Stacks(堆栈)。从 Status(状态)下拉列表中,选择 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 继续数据科学家之旅。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/302179.html