机器学习工做流是一个迭代过程,须要作出许多决策,例如是否须要训练数据、要捕获哪些属性、要使用哪些算法和在何处部署通过训练的模型。全部这些决策都将影响学习系统的结果。html
在明确上述问题后,咱们还必须从下列四种不一样类型的学习系统中选择所需的学习系统:算法
其中有些学习系统彻底依赖训练数据,而另外一些则根本不须要训练数据,而是须要一个明肯定义的环境和行动空间。当算法依赖于训练数据时,最终模型的质量和灵敏度在很大程度上取决于训练集的特征。正因如此,许多人进入了一个繁琐的循环:试图找到合理的功能平衡,从而得到一个均衡且准确的模型。
得益于诸如 Amazon SageMaker 和 AWS Data Exchange 等云服务,如今实施机器学习(ML)比以往更容易。本文将介绍如何使用 AWS Data Exchange 和 Amazon SageMaker 构建模型,以预测纽约市餐厅的餐厅等级。咱们将使用 AWS Data Exchange 中的数据集(包含23372个餐厅检查等级和分数)和 Amazon SageMaker 中的线性学习器算法训练和部署模型。json
数据是机器学习的基础,最终模型的质量取决于用于训练的数据的质量。在咱们的工做流中,一半步骤与数据收集和准备有关。这一主题在大多数ML项目中均可以看到,一般是最具挑战性的部分。另外还必须考虑数据的特征,以防止模型过于敏感或者不够敏感。此外,并不是全部数据都是内部数据。咱们可能必须使用免费或付费的第三方数据来扩充内部数据集并提升模型的质量,但多年来,查找、受权和使用此类第三方数据一直是一个难题。幸运的是,咱们如今可使用 AWS Data Exchange。安全
AWS Data Exchange 让咱们能在云中轻松查找、订阅和使用第三方数据,从而简化数据收集过程。咱们能够在 AWS Marketplace 中浏览来自90多家合格数据提供商的1500多种数据产品。之前,须要访问更多数据以推进分析、训练 ML 模型并作出数据驱动型决策;但如今借助 AWS Data Exchange,咱们能够一站式完成全部这些操做。有关更多信息,请参见AWS Data Exchange – 查找、订阅和使用数据产品。网络
借助 AWS Data Exchange,咱们能够轻松开始实施 ML。例如可使用数百个可用数据集中的一个或多个的组合来快速启动项目,还可使用外部第三方数据来扩充内部数据。全部数据集都可使用一个云原生 API 来获取,该 API 可将咱们的数据直接传送到 Amazon S3,后面的工做流中将介绍这一点。借此能够节省宝贵的时间和资源,而将这些时间和资源可用于进行更有价值的活动。经过这种组合,咱们能够从 AWS Data Exchange 获取数据,并将其提供给 Amazon SageMaker 以训练和部署模型。架构
Amazon SageMaker 是一项彻底托管的服务,使咱们可以快速轻松地构建、训练和部署 ML 模型。咱们能够从 AWS Data Exchange 获取纽约市餐厅数据,并使用 Amazon SageMaker 来训练和部署模型。为此可使用运行 Jupyter 笔记本的彻底托管实例来浏览和预处理训练数据。这些笔记本预先加载了经常使用深度学习平台须要的 CUDA 和 cuDNN 驱动程序、Anaconda 软件包以及 TensorFlow、Apache MXNet 和 PyTorch 的库。dom
咱们还将使用线性学习器算法等监督学习算法来训练模型。最后,该模型将部署到 Amazon SageMaker 终端节点,以开始服务请求并预测餐厅等级。经过将 AWS Data Exchange 的强大功能与 Amazon SageMaker 相结合,就得到了一套强大的工具来着手解决最具挑战性的 ML 问题,如今能够开始着手构建多分类器了。机器学习
本文的解决方案产生了一个多分类器,能够根据行政区和食品类别预测纽约市的餐厅等级。下图显示了完整架构。编辑器
首先,从 AWS Data Exchange 获取数据,而后将其放入 S3 存储桶中。将一个 AWS Glue 爬网程序指向它,以建立数据的数据目录。在数据目录就绪的状况下,使用 Amazon Athena 查询、清理和格式化数据,以准备进行训练。数据转换后,将训练集加载回 S3。最后,在 Amazon SageMaker 中建立 Jupyter 笔记本以训练、部署和调用预测程序。工具
在 ML 项目中,获取训练数据一般是一个很是耗时且具备挑战性的部分。在本例中,咱们须要确保能够找到一个足够大的数据集,该数据集包含纽约市餐厅的检查信息,而且包含正确的属性。幸运的是,借助 AWS Data Exchange,咱们能够开始在产品目录中搜索数据。本例关注的是纽约市餐厅的质量,所以在搜索栏中输入 New York Restaurant Data 并筛选出免费数据集。Intellect Design Arena, Inc.提供了一个免费产品,标题为 NY City Restaurant Data with inspection grade & score (Trial)(包含检查等级和分数的纽约市餐厅数据 [试用版])。
订阅数据集后,须要找到一种将数据公开给其余 AWS 服务的方法。要达到此目的,请选择订阅、数据集、修订、导出到 S3,以将数据导出。当数据位于 S3 中时,能够下载文件并查看数据,以了解所捕获的特征。如下屏幕截图显示了修订页面,咱们可使用“导出到 Amazon S3”按钮导出数据。
随后就能够下载文件并查看内容,以了解有多少数据以及捕获了哪些属性。在本例中只须要关注三个属性:行政区(标记为 BORO)、美食描述和等级。系统会建立一个新文件(仅包含与此用例相关的数据),并将其加载回 S3。使用位于 S3 中的数据,其余 AWS 服务能够快速安全地访问数据。如下屏幕截图展现了加载文件夹和数据后 S3 存储桶的样子。
当前的数据并不知足针对 Amazon SageMaker 训练数据的要求,所以须要创建提取、转换、加载(ETL)管道,以将此数据集转换为正确的格式。稍后在管道中,将使用 Athena 查询此数据并生成格式化的训练集,但目前数据只是存储桶中的 CSV 文件,咱们须要一种方法与数据进行交互。为此可使用 AWS Glue 爬网程序扫描数据并生成数据目录,从而使 Athena 可以查询 S3 内的数据。有关详细信息,请参见定义爬网程序。
运行 AWS Glue 爬网程序后,咱们得到了一个数据目录,Athena 可使用该目录查询数据。数据的详细信息将被捕获,咱们可经过单击新建立的数据目录来查看这些信息。如下屏幕截图显示了数据目录界面,其中包含与咱们的数据相关的全部信息。
至此咱们已将数据集放入 S3,并经过 AWS Glue 爬网程序得到了数据目录,随后可使用 Athena 开始查询和格式化数据。咱们可使用集成的查询编辑器来生成 SQL 查询,以便浏览和转换数据。在本例中,咱们建立了 SQL 查询以生成如下训练集。这是为了简化训练流程,由于咱们正从基于文本的属性转移到基于数字的属性。当使用线性学习器算法进行多分类训练时,类标签必须为 0 到 N-1 之间的数值,其中 N 是可能的类数。在 Athena 中运行查询后,能够下载结果并将新数据集放入 S3 中。如今,咱们能够开始在 Amazon SageMaker 中训练模型。请参阅如下代码:
SELECT boro_data.id AS "boro_label", category_data.id AS "cat_label", class_label FROM data LEFT JOIN boro_data ON data.boro = boro_data.boro LEFT JOIN category_data ON data.cuisine_description = category_data.cuisine_description
SQL 查询建立了属性和类标签的数字表示形式,以下表所示。
至此咱们已得到了干净的数据,随后可使用 Amazon SageMaker 构建、训练和部署模型。首先,在 Amazon SageMaker 中建立 Jupyter 笔记本,以开始编写和执行代码。而后将数据从 S3 导入到 Jupyter 笔记本环境中,并继续训练模型。要训练模型,请使用Amazon SageMaker中包含的线性学习器算法。线性学习器算法为分类和回归问题提供了解决方案,但在本文中,咱们将重点关注分类。
如下 Python 代码显示了加载、格式化和训练模型的步骤:
import numpy as np import pandas as pd import boto3 from sklearn.model_selection import train_test_split import sagemaker #declare bucket name and file name bucket = 'qs-demo-bgf' prefix = 'transformed-data-no-header/' fileName = 'transformed_data_no_header.csv' #load data s3 = boto3.resource('s3') KEY = prefix+fileName print(KEY) #load data into jupyter environment s3.Bucket(bucket).download_file(KEY,'transformed_data_no_header.csv') data = pd.read_csv('transformed_data_no_header.csv',dtype='float32').values data_features, data_labels = data[:, :2], data[:, 2] np.random.seed(0) train_features, test_features, train_labels, test_labels = train_test_split( data_features, data_labels, test_size=0.2) # further split the test set into validation and test sets val_features, test_features, val_labels, test_labels = train_test_split( test_features, test_labels, test_size=0.5) # instantiate the LinearLearner estimator object multiclass_estimator = sagemaker.LinearLearner(role=sagemaker.get_execution_role(), train_instance_count=1, train_instance_type='ml.m4.xlarge', predictor_type='multiclass_classifier', num_classes=3) # wrap data in RecordSet objects train_records = multiclass_estimator.record_set(train_features, train_labels, channel='train') val_records = multiclass_estimator.record_set(val_features, val_labels, channel='validation') test_records = multiclass_estimator.record_set(test_features, test_labels, channel='test') # start a training job multiclass_estimator.fit([train_records, val_records, test_records])
训练做业完成后,能够将模型部署到实例上。这为咱们提供了一个用于监听预测请求的终端节点。请参阅如下 Python 代码:
# deploy a model hosting endpoint multiclass_predictor = multiclass_estimator.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')
至此咱们已部署了通过训练的模型,能够开始调用终端节点以获取预测。终端节点为每一个类的类型提供一个分数,并根据最高分数提供一个预测标签。咱们如今得到了一个可集成到应用程序中的终端节点。
如下 Python 代码是在 Amazon SageMaker 笔记本中调用终端节点的示例:
import json import boto3 client = boto3.client('runtime.sagemaker') #define a dictionary to map text to numerical values area = { "Queens":1.0, "Staten Island":2.0, "Brooklyn":3.0, "Bronx":4.0, "Manhattan":5.0 } cat = { "Hotdogs/Pretzels":1.0, "Donuts":2.0, "Bangladeshi":3.0, "Caribbean":4.0, "Chicken":5.0 } #assign features to pass to endpoint location = area["Manhattan"] category = cat["Hotdogs/Pretzels"] values = str(location)+','+str(category) #get response from endpoint response = client.invoke_endpoint(EndpointName='linear-learner-2019-11-04-01-57-20-572', ContentType='text/csv', Body=values) #parse the results result = json.loads(response['Body'].read().decode()) predict = result['predictions'][0] print(predict) grade = predict['predicted_label'] if(grade==0.0): letter = "A" elif(grade==1.0): letter = "B" else: letter = "C" #get readable prediction print("\Restaurant Grade: "+letter)
在调用终端节点后,系统将提供响应并将其格式化为可读的预测结果。请参阅如下代码:
{'score': [0.9355735182762146, 0.0486408956348896, 0.01578556001186371], 'predicted_label': 0.0} Restaurant Grade: A
为防止出现任何持续计费的状况,咱们应清理资源。先从 AWS Data Exchange 开始,若是订阅了本示例中使用的数据集,请将订阅设置为在一个月试用期结束时终止。删除存储本示例中所用数据的全部 S3 存储桶。删除因 AWS Glue 爬网程序而建立的 AWS Glue 数据目录。此外,还要删除 Amazon SageMaker 笔记本实例和您在部署模型时建立的终端节点。
本文提供了一个示例工做流,该工做流使用 AWS Data Exchange 和 Amazon SageMaker 构建、训练和部署多分类器。咱们能够借助 AWS Data Exchange 使用第三方数据快速启动 ML 项目,并使用 Amazon SageMake r的内置工具和算法为 ML 任务建立解决方案。若是处于 ML 项目的早期阶段,或者正设法改进现有数据集,请查看 AWS Data Exchange,借此能够节省数小时的数据整理时间。
Géron Aurélien。Hands-on Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems(Scikit-Learn、Keras 和 TensorFlow 机器学习动手实践:智能系统构建概念、工具和技术)。OReilly,2019 年。
Tan、Pan-Ning 等人。Introduction to Data Mining(数据挖掘简介)。Pearson,2006 年。