开始
在本教程中,您将学习如何使用 Amazon SageMaker 构建、训练和部署机器学习 (ML) 模型。我们将使用深受欢迎的 XGBoost ML 算法进行练习。Amazon SageMaker 是一项完全托管的模块化机器学习服务,可帮助开发人员和数据科学家大规模地构建、训练和部署机器学习模型。
将机器学习模型从单纯的概念引入生产通常既复杂又耗时。您必须管理大量数据以训练模型,为之选择最佳的训练算法,在训练时管理计算容量,然后将模型部署到生产环境中。使用 Amazon SageMaker,您可以更轻松地构建和部署机器学习模型,从而降低了这种复杂性。从各种可用选项中选择正确的算法和框架后,它将管理所有底层基础设施,以 PB 规模训练您的模型,并将其部署到生产环境中。
在本教程中,您将扮演在银行工作的机器学习开发人员的角色。您接到任务,负责开发机器学习模型,预测客户是否会注册存单 (CD)。您将使用市场营销数据集对该模型进行训练,该数据集包含有关客户人口统计数据、市场营销活动响应情况和外部因素的信息。
为方便起见,数据已贴标,数据集中有一列用于标识客户是否已注册银行提供的产品。此数据集的某个版本可从机器学习存储库公开访问(由加州大学欧文分校管理)。本教程将实施有监督的机器学习模型,因为数据已被标记。(若未标记数据集,则实施无监督学习。)
在本教程中,您将:
创建笔记本实例
准备数据
训练模型以从数据中学习
部署模型
评估您的机器学习模型的性能
本教程中创建和使用的资源符合亚马逊云科技免费套餐条件。请记得完成第 7 步并终止您的资源。如果您的账户已使用这些资源超过两个月,您的账户需支付的费用将低于 0.50 USD。
第 2 步:创建 Amazon SageMaker 笔记本实例
全部打开在此步骤中,您将创建一个 Amazon SageMaker 笔记本实例。
本教程使用 MySageMakerInstance 作为实例名称,如有需要,您可以选择其他名称。
在本教程中,您可以保留默认的笔记本实例类型:ml.t2.medium。
要使笔记本实例能够访问并安全地将数据上传到 Amazon S3,必须指定 IAM 角色。在 IAM 角色字段中,选择创建新角色,让 Amazon SageMaker 创建具有所需权限的角色,并将其分配给您的实例。或者,您也可以在您的账户中选择现有 IAM 角色来达到此目的。
这让您的 Amazon SageMaker 实例可以访问您账户中的所有 S3 存储桶。在本教程的稍后部分,您将创建一个新的 S3 存储桶。但是,如果您有一个想要使用的存储桶,请选择特定 S3 存储桶并指定相应存储桶的名称。
选择创建角色。
在本教程中,我们将为其他字段使用默认值。选择创建笔记本实例。
您的笔记本实例应在两分钟内从待处理转变为服务中状态。
第 3 步:准备数据
全部打开在此步骤中,您将使用 Amazon SageMaker 笔记本预处理训练机器学习模型所需的数据。
当状态转变为服务中后,选择MySageMakerInstance 并使用操作下拉菜单将其打开,或选择服务中状态旁边的打开 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.")

将以下代码复制到笔记本中的下一个代码单元格中,并更改 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)
复制并运行以下代码:
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)
在模型训练循环中,我们将使用训练数据(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 步:根据数据训练模型
全部打开在此步骤中,您将使用训练数据集训练您的机器学习模型。
将以下代码复制到新的代码单元格中,然后选择运行以重新格式化和加载数据:
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')
将以下代码复制到新的代码单元格中,然后选择运行:
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)
几分钟后,您应开始看到正在生成的训练日志。
xgb.fit({'train': s3_input_train})
第 5 步:部署模型
全部打开在此步骤中,您将经过训练的模型部署到终端节点,重新格式化,然后加载 CSV 数据,再运行模型以创建预测。
xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')
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 步:评估模型性能
全部打开在此步骤中,您将评估机器学习模型的性能和准确性。
根据预测,我们可以得出结论,您准确预测了测试数据中 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 相关的资源。
重要说明:终止当前未在使用的资源可降低成本,是最佳实践。不终止资源将产生费用。
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 规模训练模型。
