在本教程中,您将学习如何使用 Amazon SageMaker 构建、训练和部署机器学习 (ML) 模型。我们将使用深受欢迎的 XGBoost ML 算法进行练习。Amazon SageMaker 是一项完全托管的模块化机器学习服务,可帮助开发人员和数据科学家大规模地构建、训练和部署机器学习模型。
将机器学习模型从单纯的概念引入生产通常既复杂又耗时。您必须管理大量数据以训练模型,为之选择最佳的训练算法,在训练时管理计算容量,然后将模型部署到生产环境中。使用 Amazon SageMaker,您可以更轻松地构建和部署机器学习模型,从而降低了这种复杂性。从各种可用选项中选择正确的算法和框架后,它将管理所有底层基础设施,以 PB 规模训练您的模型,并将其部署到生产环境中。
在本教程中,您将扮演在银行工作的机器学习开发人员的角色。您接到任务,负责开发机器学习模型,预测客户是否会注册存单 (CD)。您将使用市场营销数据集对该模型进行训练,该数据集包含有关客户人口统计数据、市场营销活动响应情况和外部因素的信息。
为方便起见,数据已贴标,数据集中有一列用于标识客户是否已注册银行提供的产品。此数据集的某个版本可从机器学习存储库公开访问(由加州大学欧文分校管理)。本教程将实施有监督的机器学习模型,因为数据已被标记。(若未标记数据集,则实施无监督学习。)
在本教程中,您将:
- 创建笔记本实例
- 准备数据
- 训练模型以从数据中学习
- 部署模型
- 评估您的机器学习模型的性能
第 1 步:进入 Amazon SageMaker 控制台
导航到 Amazon SageMaker 控制台。
单击此处之后,亚马逊云科技管理控制台将在新窗口中打开,因此您可以使本分步指南保持打开状态。开始在搜索栏中键入 SageMaker,并选择 Amazon SageMaker 以打开服务控制台。
(单击可放大)
第 2 步:创建 Amazon SageMaker 笔记本实例
在此步骤中,您将创建一个 Amazon SageMaker 笔记本实例。
2a.从 Amazon SageMaker 控制面板中选择笔记本实例。
(单击可放大)
2b.在创建笔记本实例页面上,在笔记本实例名称字段中输入名称。本教程使用 MySageMakerInstance 作为实例名称,如有需要,您可以选择其他名称。
在本教程中,您可以保留默认的笔记本实例类型:ml.t2.medium。
要使笔记本实例能够访问并安全地将数据上传到 Amazon S3,必须指定 IAM 角色。在 IAM 角色字段中,选择创建新角色,让 Amazon SageMaker 创建具有所需权限的角色,并将其分配给您的实例。或者,您也可以在您的账户中选择现有 IAM 角色来达到此目的。
(单击可放大)
2c.在创建 IAM 角色框中,选择任意 S3 存储桶。 这让您的 Amazon SageMaker 实例可以访问您账户中的所有 S3 存储桶。在本教程的稍后部分,您将创建一个新的 S3 存储桶。但是,如果您有一个想要使用的存储桶,请选择特定 S3 存储桶并指定相应存储桶的名称。
选择创建角色。
(单击可放大)
2d.请注意,Amazon SageMaker 为您创建了一个名为 AmazonSageMaker-ExecutionRole-*** 的角色。
在本教程中,我们将为其他字段使用默认值。选择创建笔记本实例。
(单击可放大)
2e.在笔记本实例页面上,您应该会看到新的 MySageMakerInstance 笔记本实例处于待处理状态。
您的笔记本实例应在两分钟内从待处理转变为服务中状态。
(单击可放大)
第 3 步:准备数据
在此步骤中,您将使用 Amazon SageMaker 笔记本预处理训练机器学习模型所需的数据。
3a.在笔记本实例页面上,等待 MySageMakerInstance 从待处理转变为服务中状态。
当状态转变为服务中后,选择MySageMakerInstance 并使用操作下拉菜单将其打开,或选择服务中状态旁边的打开 Jupyter。
(单击可放大)
(单击可放大)
3b.打开 Jupyter 后,从文件选项卡中选择新建,然后选择 conda_python3。
(单击可放大)
3c.要准备数据,训练机器学习模型并进行部署,您需要导入一些库并在 Jupyter 笔记本环境中定义一些环境变量。将以下代码复制到实例中的代码单元格中,然后选择运行。
运行代码时,方括号之间会出现 *,如右图第一个屏幕截图所示。几秒钟后,代码执行完成,* 将替换为数字 1,而且您将看到一条成功消息,如右图第二个屏幕截图所示。
# import libraries
import boto3, re, sys, math, json, os, sagemaker, urllib.request
from sagemaker import get_execution_role
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import Image
from IPython.display import display
from time import gmtime, strftime
from sagemaker.predictor import csv_serializer
# Define IAM role
role = get_execution_role()
prefix = 'sagemaker/DEMO-xgboost-dm'
containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'} # each region has its XGBoost container
my_region = boto3.session.Session().region_name # set the region of the instance
print("Success - the MySageMakerInstance is in the " + my_region + " region. You will use the " + containers[my_region] + " container for your SageMaker endpoint.")
(单击可放大)
(单击可放大)
3d.在此步骤中,您将创建一个 S3 存储桶,用于存储本教程的数据。
将以下代码复制到笔记本中的下一个代码单元格中,并更改 S3 存储桶的名称,使之具有唯一性。S3 存储桶名称必须是全局唯一的,并且具有其他一些限制。
选择运行。如果未收到成功消息,请更改存储桶名称并重试。
bucket_name = 'your-s3-bucket-name' # <--- CHANGE THIS VARIABLE TO A UNIQUE NAME FOR YOUR BUCKET
s3 = boto3.resource('s3')
try:
if my_region == 'us-east-1':
s3.create_bucket(Bucket=bucket_name)
else:
s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region })
print('S3 bucket created successfully')
except Exception as e:
print('S3 error: ',e)
(单击可放大)
3e.接下来,您需要将数据下载到您的 Amazon SageMaker 实例并将其加载到 dataframe 中。复制并运行以下代码:
try:
urllib.request.urlretrieve ("https://d1.awsstatic.com/tmt/build-train-deploy-machine-learning-model-sagemaker/bank_clean.27f01fbbdf43271788427f3682996ae29ceca05d.csv", "bank_clean.csv")
print('Success: downloaded bank_clean.csv.')
except Exception as e:
print('Data load error: ',e)
try:
model_data = pd.read_csv('./bank_clean.csv',index_col=0)
print('Success: Data loaded into dataframe.')
except Exception as e:
print('Data load error: ',e)
(单击可放大)
3f.现在,我们将打乱数据,并将其分为训练数据和测试数据。
在模型训练循环中,我们将使用训练数据(70% 的客户)。我们将使用基于梯度的优化来迭代细化模型参数。基于梯度的优化是一种使用模型损失函数的梯度查找模型参数值以最大程度减少模型错误的方法。
测试数据(剩余 30% 的客户)将用于评估模型的性能,并衡量经过训练的模型对不可见数据的概括程度。
将以下代码复制到新的代码单元格中,然后选择运行以打乱和划分数据:
train_data, test_data = np.split(model_data.sample(frac=1, random_state=1729), [int(0.7 * len(model_data))])
print(train_data.shape, test_data.shape)
(单击可放大)
第 4 步:根据数据训练模型
在此步骤中,您将使用训练数据集训练您的机器学习模型。
4a.要使用 Amazon SageMaker 预构建的 XGBoost 模型,您需要重新格式化训练数据的标题和第一列,并从 S3 存储桶加载数据。
将以下代码复制到新的代码单元格中,然后选择运行以重新格式化和加载数据:
pd.concat([train_data['y_yes'], train_data.drop(['y_no', 'y_yes'], axis=1)], axis=1).to_csv('train.csv', index=False, header=False)
boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')
4b.接下来,您需要设置 Amazon SageMaker 会话,创建 XGBoost 模型(估算器)的实例,并定义模型的超参数。将以下代码复制到新的代码单元格中,然后选择运行:
sess = sagemaker.Session()
xgb = sagemaker.estimator.Estimator(containers[my_region],role, train_instance_count=1, train_instance_type='ml.m4.xlarge',output_path='s3://{}/{}/output'.format(bucket_name, prefix),sagemaker_session=sess)
xgb.set_hyperparameters(max_depth=5,eta=0.2,gamma=4,min_child_weight=6,subsample=0.8,silent=0,objective='binary:logistic',num_round=100)
4c.加载数据并设置 XGBoost 估算器后,将以下代码复制到下一个代码单元格并选择运行,以在 ml.m4.xlarge 实例上使用梯度优化对模型进行训练。
几分钟后,您应开始看到正在生成的训练日志。
xgb.fit({'train': s3_input_train})
(单击可放大)
第 5 步:部署模型
在此步骤中,您将经过训练的模型部署到终端节点,重新格式化,然后加载 CSV 数据,再运行模型以创建预测。
5a.要在服务器上部署模型并创建可访问的终端节点,请将以下代码复制到下一个代码单元格中,然后选择运行:
xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')
(单击可放大)
5b.要预测测试数据中的客户是否已注册银行产品,请将以下代码复制到下一个代码单元格中,然后选择运行:
test_data_array = test_data.drop(['y_no', 'y_yes'], axis=1).values #load the data into an array
xgb_predictor.content_type = 'text/csv' # set the data type for an inference
xgb_predictor.serializer = csv_serializer # set the serializer type
predictions = xgb_predictor.predict(test_data_array).decode('utf-8') # predict!
predictions_array = np.fromstring(predictions[1:], sep=',') # and turn the prediction into an array
print(predictions_array.shape)
(单击可放大)
第 6 步:评估模型性能
在此步骤中,您将评估机器学习模型的性能和准确性。
6a.复制并粘贴以下代码,然后选择运行以比较名为 混淆矩阵的表中的实际值与预测值。
根据预测,我们可以得出结论,您准确预测了测试数据中 90% 的客户将注册存单,对于已注册客户,预测准确度为 65% (278/429),对于未注册客户,预测准确度为 90% (10785/11928)。
cm = pd.crosstab(index=test_data['y_yes'], columns=np.round(predictions_array), rownames=['Observed'], colnames=['Predicted'])
tn = cm.iloc[0,0]; fn = cm.iloc[1,0]; tp = cm.iloc[1,1]; fp = cm.iloc[0,1]; p = (tp+tn)/(tp+tn+fp+fn)*100
print("\n{0:<20}{1:<4.1f}%\n".format("Overall Classification Rate: ", p))
print("{0:<15}{1:<15}{2:>8}".format("Predicted", "No Purchase", "Purchase"))
print("Observed")
print("{0:<15}{1:<2.0f}% ({2:<}){3:>6.0f}% ({4:<})".format("No Purchase", tn/(tn+fn)*100,tn, fp/(tp+fp)*100, fp))
print("{0:<16}{1:<1.0f}% ({2:<}){3:>7.0f}% ({4:<}) \n".format("Purchase", fn/(tn+fn)*100,fn, tp/(tp+fp)*100, tp))
(单击可放大)
第 7 步:终止资源
在此步骤中,您将终止与 Amazon SageMaker 相关的资源。
重要说明:终止当前未在使用的资源可降低成本,是最佳实践。不终止资源将产生费用。
7a.要删除 Amazon SageMaker 终端节点和 S3 存储桶中的对象,请复制、粘贴并运行以下代码:
sagemaker.Session().delete_endpoint(xgb_predictor.endpoint)
bucket_to_delete = boto3.resource('s3').Bucket(bucket_name)
bucket_to_delete.objects.all().delete()
(单击可放大)
恭喜!
您已了解如何使用 Amazon SageMaker 准备、训练、部署和评估机器学习模型。Amazon SageMaker 提供了快速连接到您的训练数据所需的所有内容,助您轻松构建机器学习模型,并且还可助您为应用程序选择最佳算法和框架,同时管理所有底层基础设施,以便您以 PB 规模训练模型。
建议的后续步骤:
本教程对您是否有帮助?
免责声明:前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。