AWS-认证机器学习专项-MLS001-认证指南-全-

AWS 认证机器学习专项 MLS001 认证指南(全)

原文:annas-archive.org/md5/94141408700b7dc2a64f2827465b2daf

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

AWS 机器学习专业认证考试测试你在 AWS 基础设施上执行 机器 学习ML) 的能力。本书深入探讨了整个考试大纲,使用实际案例帮助你处理 AWS 上的真实机器学习项目。

从 AWS 机器学习的介绍开始,你将学习机器学习的基础知识,并探索重要的 AWS 人工智能(AI)服务。然后,你将了解如何为机器学习准备数据,并发现针对不同类型变量的数据操作和转换的不同技术。本书还涵盖了处理缺失数据和异常值,并带你通过各种机器学习任务,如分类、回归、聚类、预测、异常检测、文本挖掘和图像处理,以及你应该了解以通过考试的具体 ML 算法。最后,你将探索模型评估、优化和部署,并掌握在生产环境中部署模型和监控它们的方法。

到本书结束时,你将了解机器学习的所有关键领域,AWS 为每个领域发布的解决方案,以及 AWS 机器学习每个领域常用的工具、方法和技术。

本书面向对象

本书面向希望参加并通过 AWS 机器学习专业考试或希望深入了解机器学习(特别关注 AWS)的专业人士和学生。熟悉机器学习和 AWS 服务的基础知识是必要的。

本书涵盖内容

第一章机器学习基础,涵盖了某些机器学习定义、不同的建模方法类型以及构建机器学习产品所需的所有步骤,即建模流程。

第二章AWS 人工智能/机器学习应用服务,涵盖了 AWS 提供的各种人工智能/机器学习应用的详细信息,这些信息对于通过考试是必须了解的。

第三章数据准备和转换,处理分类和数值特征,应用不同的技术来转换你的数据,例如独热编码、二进制编码、序数编码、分箱和文本转换。你还将学习如何处理数据中的缺失值和异常值,这两个是构建良好机器学习模型的重要主题。

第四章理解和可视化数据,教你如何根据不同的变量类型和业务需求选择最合适的数据可视化技术。你还将了解可用于数据可视化的 AWS 服务。

第五章, AWS 数据存储服务,向您介绍用于存储机器学习数据的 AWS 服务。您将了解许多不同的 S3 存储类别以及何时使用它们。您还将学习如何处理数据加密以及如何确保数据在静态存储和传输过程中的安全性。最后,我们将介绍其他类型的数据存储服务,这些服务对于考试来说仍然值得了解。

第六章, AWS 数据处理服务,向您介绍用于处理机器学习数据的 AWS 服务。您将学习如何处理批处理和实时处理,如何直接在 Amazon S3 上查询数据,以及如何在 EMR 上创建大数据应用程序。

第七章, 应用机器学习算法,涵盖了不同类型的机器学习任务,如分类、回归、聚类、预测、异常检测、文本挖掘和图像处理。每个任务都有特定的算法,您应该了解这些算法以通过考试。您还将了解集成模型的工作原理以及如何处理维度诅咒。

第八章, 评估和优化模型,教您如何选择模型指标来评估模型结果。您还将学习如何通过调整超参数来优化您的模型。

第九章, Amazon SageMaker 建模,教您如何启动笔记本进行探索性数据分析以及如何在 Amazon SageMaker 上训练模型。您将学习训练数据应存储在哪里以及如何通过 SageMaker 访问,以及您可以使用的数据格式。

为了充分利用这本书

您需要一个网络连接良好的系统和 AWS 账户。

如果您正在使用这本书的数字版,我们建议您亲自输入代码或通过 GitHub 仓库(下一节中提供链接)访问代码。这样做将帮助您避免与代码复制粘贴相关的任何潜在错误。

下载示例代码文件

您可以从 GitHub(github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide)下载这本书的示例代码文件。如果代码有更新,它将在现有的 GitHub 仓库中更新。

我们还有来自我们丰富的书籍和视频目录的其他代码包,可在github.com/PacktPublishing/找到。查看它们吧!

下载彩色图像

我们还提供了一份包含本书中使用的截图/图表彩色图像的 PDF 文件。您可以从这里下载:static.packt-cdn.com/downloads/9781800569003_ColorImages.pdf

使用的约定

本书使用了多种文本约定。

文本中的代码:表示文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 昵称。以下是一个示例:为了检查每个版本以及它们的最新版本,我们使用 aws s3api list-object-versions --bucket version-demo-mlpractice,S3 提供了 list-object-versions API,如下所示。

代码块应如下设置:

 "Versions": [
{
"ETag":
"\"b6690f56ca22c410a2782512d24cdc97\"",
"Size": 10,
"StorageClass": "STANDARD",
"Key": "version-doc.txt",
"VersionId":
"70wbLG6BMBEQhCXmwsriDgQoXafFmgGi",
"IsLatest": true,
"LastModified": "2020-11-07T15:57:05+00:00",
"Owner": {
"DisplayName": "baba",
"ID": "XXXXXXXXXXXX"
}
} ]

当我们希望您注意代码块中的特定部分时,相关的行或项目将以粗体显示:

[default]
exten => s,1,Dial(Zap/1|30)
exten => s,2,Voicemail(u100)
exten => s,102,Voicemail(b100)
exten => i,1,Voicemail(s0)

任何命令行输入或输出都应如下编写:

$  aws s3 ls s3://version-demo-mlpractice/
$  echo "Version-2">version-doc.txt

粗体:表示新术语、重要单词或您在屏幕上看到的单词。例如,菜单或对话框中的单词在文本中显示如下。以下是一个示例:“从管理面板中选择系统信息。”

提示或重要注意事项

看起来像这样。

联系我们

我们始终欢迎读者的反馈。

一般反馈:如果您对本书的任何方面有疑问,请在邮件主题中提及书名,并给我们发送邮件至 customercare@packtpub.com。

勘误:尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果您在这本书中发现了错误,我们将非常感激您能向我们报告。请访问www.packtpub.com/support/errata,选择您的书籍,点击勘误提交表单链接,并输入详细信息。

盗版:如果您在互联网上以任何形式发现我们作品的非法副本,我们将非常感激您能提供位置地址或网站名称。请通过 copyright@packt.com 与我们联系,并提供材料的链接。

如果您有兴趣成为作者:如果您在某个领域有专业知识,并且您有兴趣撰写或为书籍做出贡献,请访问authors.packtpub.com

评论

请留下评论。一旦您阅读并使用过这本书,为何不在您购买它的网站上留下评论呢?潜在读者可以查看并使用您的客观意见来做出购买决定,Packt 公司可以了解您对我们产品的看法,我们的作者也可以看到他们对书籍的反馈。谢谢!

如需了解 Packt 的更多信息,请访问packt.com

第一部分:机器学习简介

本节提供了关于 AWS 机器学习专业考试的详细信息。它还介绍了机器学习基础知识,并涵盖了人工智能最重要的 AWS 应用服务。

本节包含以下章节:

  • 第一章**,机器学习基础知识

  • 第二章**,AWS 人工智能/机器学习应用服务

第一章:机器学习基础

几十年来,研究人员一直在通过被称为人工智能(简称 AI)的领域尝试模拟人类大脑活动。1956 年,一群人在达特茅斯夏季人工智能研究项目上会面,这一事件被广泛认为是关于今天我们所知的 AI 的第一次集体讨论。研究人员试图证明学习过程的许多方面可以被精确描述,因此可以被机器自动化和复制。今天,我们知道他们是正确的!

该领域还出现了许多其他术语,如机器学习(简称 ML)和深度学习(简称 DL)。这些人工智能的子领域也已经发展了几十年(当然,这里没有什么是对科学来说是新的)。然而,随着信息社会的自然进步,以及最近大数据平台的兴起,人工智能应用以更强大的力量和适用性重新焕发生机。力量在于我们现在有更多的计算资源来模拟和实现它们;适用性在于现在信息无处不在。

更近一些,云服务提供商已经将 AI 引入云端。这正在帮助各种规模的公司降低运营成本,甚至让它们能够尝试 AI 应用(考虑到对于一家小公司来说,维护自己的数据中心可能成本过高)。

这就带我们来到了本章的目标:能够描述 AI、ML 和 DL 的含义,以及理解 ML 管道的所有细微差别。避免对这些术语的混淆,并确切了解 ML 管道是什么,将使您能够正确选择服务、开发应用程序并掌握 AWS 机器学习专业考试。

本章的主要内容包括:

  • 比较人工智能、机器学习和深度学习

  • 分类监督学习、无监督学习和强化学习

  • CRISP-DM 建模生命周期

  • 数据拆分

  • 建模期望

  • 介绍 ML 框架

  • 云端机器学习

比较人工智能、机器学习和深度学习

人工智能是一个广泛的领域,研究不同的方法来创建系统和机器,通过模拟人类智能来解决各种问题。创建这些程序和机器的复杂程度不同,从简单的基于规则的引擎到复杂的自我学习系统。人工智能涵盖了但不限于以下子领域:

  • 机器人技术

  • 自然语言处理

  • 基于规则的系统

  • 机器学习(ML)

我们现在特别感兴趣的区域是机器学习。

检验机器学习

ML 是人工智能的一个子领域,旨在创建能够从经验中学习,而不需要明确编程的系统。正如其名称所暗示的,系统能够观察其运行环境,学习,并在没有人为干预的情况下适应自己。ML 系统背后的算法通常从它们可用的数据中提取和改进知识,以及条件(如超参数),并在尝试不同的方法来解决特定问题后进行反馈:

![Figure 1.1 – 人工智能、机器学习、深度学习的层次结构

![img/B16735_01_001.jpg]

图 1.1 – 人工智能、机器学习、深度学习的层次结构

有不同类型的 ML 算法;例如,我们可以列出基于决策树、基于概率和神经网络。每个类别可能都有数十种特定的算法。大多数算法将在本书的后续章节中介绍。

正如你在图 1.1中可能已经注意到的,我们可以更加具体,将机器学习领域细分为机器学习专业考试中另一个非常重要的主题:深度学习。

检查深度学习

DL(深度学习)是 ML(机器学习)的一个子集,旨在提出将多个层次连接起来以解决特定问题的算法。知识随后通过一层层传递,直到找到最佳解决方案。最常见类型的 DL 算法是深度神经网络。

在撰写本书时,DL 是机器学习领域的一个非常热门的话题。目前大多数最先进的机器翻译、图像标题和计算机视觉算法都是在过去几年提出的,并且是深度学习的一部分。

现在我们对人工智能的类型有了概述,让我们来看看我们可以如何对机器学习进行分类。

对监督学习、无监督学习和强化学习进行分类

ML 是一个非常广泛的研究领域;这就是为什么对其子领域有一个清晰的定义非常重要。从非常广泛的角度来看,我们可以将 ML 算法分为两大类:监督学习无监督学习

介绍监督学习

监督算法使用一个类别或标签(来自输入数据)作为支持来找到和验证最佳解决方案。在图 1.2中,有一个旨在从银行中分类欺诈交易的数据库:

![Figure 1.2 – 监督学习样本数据集

![img/B16735_01_002.jpg]

图 1.2 – 监督学习样本数据集

前四列被称为特征独立变量,它们可以被监督算法用来找到欺诈模式。例如,通过结合这四个特征(星期几、EST 小时、交易金额和商家类型)以及六个观察值(每一行实际上是观察值之一),你可以推断出价值超过 5,000 美元且在夜间处理的电子商务交易可能是欺诈案例。

重要提示

在实际场景中,我们应该有更多的观察值,以便为这种类型的推断提供统计支持。

关键点在于,我们能够推断出一个潜在的欺诈模式,仅仅因为我们事先知道什么是欺诈,什么不是欺诈。这种信息存在于图 1.2的最后列,通常被称为目标变量、标签、响应变量或因变量。如果输入数据集有一个目标变量,你应该能够应用监督学习。

在监督学习中,目标变量可能存储不同类型的数据。例如,它可能是一个二元列(是或否),一个多类列(A 类、B 类或 C 类),甚至是一个数值列(任何实数,例如交易金额)。根据目标变量的数据类型,你可以找到你的问题属于哪种类型的监督学习。图 1.3展示了如何将监督学习分为两大类:分类回归算法:

图 1.3 – 根据目标变量选择合适的监督学习类型

图 1.3 – 根据目标变量选择合适的监督学习类型

而分类算法预测一个类别(要么是二元的,要么是多类的),回归算法预测一个实数(要么是连续的,要么是离散的)。

理解数据类型对于在机器学习项目中做出正确的决策非常重要。我们可以将数据类型分为两大类:数值数据和分类数据。数值数据可以进一步分为连续或离散子类,而分类数据可能指的是有序或名义数据:

  • 数值/离散数据指的是单个和可数的项目(例如,教室里的学生数量或在线购物车中的商品数量)。

  • 数值/连续数据指的是无限多的可能测量值,它们通常带有小数点(例如,温度)。

  • 分类/名义数据指的是没有定量值的标记变量(例如,姓名或性别)。

  • 分类/有序数据为标记变量增加了顺序感(例如,教育水平或员工职称等级)。

换句话说,在选择项目算法时,你应该问自己:我有一个目标变量吗?它存储的是分类数据还是数值数据?回答这些问题将使你处于更好的位置来选择一个可能解决问题的潜在算法。

然而,如果你没有目标变量怎么办?在这种情况下,我们面临的是无监督学习。无监督问题不提供标记数据;相反,它们提供所有独立的变量(或特征),这将允许无监督算法在数据中找到模式。最常见的一种无监督学习是聚类,其目的是将数据集的观测值分组到不同的簇中,纯粹基于它们的特征。来自同一簇的观测值预计将彼此相似,但与其他簇的观测值非常不同。聚类将在本书的后续章节中更详细地介绍。

半监督学习在机器学习文献中也有所提及。这类算法能够从部分标记的数据(一些观测值包含标签,而另一些则没有)中学习。

最后,另一种被另一类机器学习算法采用的学习方法是强化学习。这种方法根据系统自主做出的良好决策进行奖励;换句话说,系统通过经验学习。

我们一直在非常广泛地讨论学习方法和算法类别。然而,现在是时候具体化并引入模型这个术语了。

CRISP-DM 建模生命周期

建模是机器学习中一个非常常见的术语,当我们想要指定解决特定问题的步骤时使用。例如,我们可以创建一个二元分类模型来预测图 1.2中的交易是否为欺诈。

在这个背景下,一个模型代表创建解决方案的所有步骤,作为一个整体,包括(但不限于)算法。跨行业数据挖掘标准流程,更常被称为CRISP-DM,是提供指导我们应遵循的常见步骤以创建模型的方法之一。这种方法在市场上被广泛使用,并在 AWS 机器学习专业考试中有所涉及:

![图 1.4 – CRISP-DM 方法论图片 B16735_01_004.jpg

图 1.4 – CRISP-DM 方法论

一切始于业务理解,这将产生业务目标(包括成功标准),情况评估,数据挖掘目标,以及项目计划(包括对工具和技术的初步评估)。在情况评估期间,我们还应该考虑资源清单、需求、假设和约束、风险、术语、成本和收益。当我们建模时,每一个假设和成功标准都很重要。

然后我们进入数据理解阶段,在这个阶段我们将收集原始数据,描述它,探索它,并检查其质量。这是对将要用于创建模型的数据的初步评估。再次强调,数据科学家必须保持怀疑态度。你必须确保你理解数据的所有细微差别及其来源。

数据准备阶段实际上是建模过程中通常耗时最多的一个阶段。在这个阶段,我们需要选择和过滤数据,根据需要执行的任务对其进行清理,提出新的属性,将数据与其他数据源集成,并按照将要应用的算法的预期格式化。这些任务通常被称为特征工程

一旦数据准备就绪,我们就可以最终开始建模阶段。这是算法发挥作用的地方。我们应该首先确保选择正确的技术。记住:根据是否存在目标变量(及其数据类型),我们将有不同的算法可供选择。每种建模技术可能都包含一些隐含的假设,我们必须意识到。例如,如果你选择多重线性回归算法来预测房价,你应该意识到这种类型的模型期望你的数据变量之间存在线性关系。

现在有许多算法,每个算法可能都有自己的假设。在选择你想要在项目中测试的算法之后,你应该花一些时间检查它们的细节。本书的后续章节中,我们将介绍其中的一些。

重要提示

一些算法在其逻辑中包含了我们所说的特征选择。这是一个选择最重要的特征以构建最佳模型的过程。决策树是自动执行特征选择的算法的例子。我们将在稍后更详细地介绍特征选择,因为有不同的方法来选择最适合你模型的变量。

在建模阶段,你还应该为模型设计一个测试方法,定义将使用哪些评估指标以及数据如何分割。有了这些,你就可以通过设置算法的超参数并给模型提供数据来最终构建模型。这个过程被称为训练过程。用于给模型提供数据的数据被称为训练数据。有不同方式来组织训练和测试数据,我们将在本章中介绍。

重要提示

机器学习算法是由参数和超参数构建的。这些是从数据中学习得到的。例如,基于决策树的算法可能从训练数据中学习到,某个特征应该根据信息增益评估来组成其根级别。另一方面,超参数用于控制学习过程。以相同的决策树示例,我们可以通过指定任何决策树算法(无论其底层训练数据如何)的预定义超参数来指定树的最大允许深度。超参数调整是考试中的一个非常重要的话题,我们将在稍后详细讨论。

一旦模型训练完成,我们可以评估和审查结果,以便提出下一步的行动计划。如果结果不符合我们的业务成功标准,我们应该回到早期步骤,检查还能做些什么来改善模型结果。这可能包括对算法的超参数进行微调,增加新的数据处理步骤,甚至重新定义业务驱动因素。另一方面,如果模型质量可以接受,我们可以进入部署阶段。

在 CRISP-DM 方法的最后一个阶段,我们必须考虑模型的部署计划、监控和维护。我们通常从两个角度来考虑这一步:训练和推理。训练流程包括训练模型所需的步骤,这包括数据准备、超参数定义、数据拆分和模型训练本身。我们必须在某处存储所有模型工件,因为它们将被下一个需要开发的流程使用:推理流程

推理流程仅使用模型工件来对全新的观测(在训练阶段从未被模型见过的数据)执行模型。例如,如果模型被训练来识别欺诈交易,那么这就是新交易将通过模型进行分类的时候。

通常,模型只通过训练流程进行一次训练,并通过推理流程多次执行。然而,经过一段时间后,预期会出现一些模型退化,也称为模型漂移。这种现象发生是因为模型通常在静态的训练集上训练,旨在代表某一时间点的业务场景;然而,业务是不断发展的,可能需要使用更近期的数据重新训练模型以捕捉新的业务方面。这就是为什么在模型部署后,跟踪模型性能同样重要的原因。

CRISP-DM 方法对于 AWS 机器学习专业考试的内容至关重要,如果你查看 AWS 涵盖的四个领域,你会意识到它们是从 CRISP-DM 阶段概括出来的:数据工程、探索性数据分析、建模和机器学习实施与运营。

我们现在已经理解了建模流程的所有关键阶段,并且我们知道算法本身只是广泛过程的一部分!接下来,让我们看看我们如何拆分数据以创建和验证机器学习模型。

数据拆分

训练和评估机器学习模型是建模流程中的关键任务。机器学习算法需要数据来发现特征之间的关系,以便进行推断,但这些推断在移至生产环境之前需要得到验证。

用于训练机器学习模型的集合通常被称为训练集。这些训练数据必须能够代表模型将使用的真实环境;如果不符合这一要求,将毫无用处。

回到我们在图 1.2中提出的欺诈示例,根据训练数据,我们发现价值超过 5,000 美元且在夜间处理的电子商务交易可能是欺诈案例。考虑到这一点,在将模型应用于生产环境后,模型应该标记出在训练过程中学习到的类似案例。

因此,如果这些情况仅存在于训练集中,模型将在生产环境中标记假阳性案例。相反的情况也是有效的:如果生产数据中存在某个未反映在训练数据中的欺诈案例,模型将标记大量的假阴性案例。假阳性和假阴性比率只是我们可以用于模型验证的许多质量指标中的两个。这些指标将在稍后的内容中详细讨论。

到目前为止,您应该已经清楚地理解了拥有一个好的训练集的重要性。现在,假设我们确实有一个有效的训练集,我们如何能够有一定程度的信心认为这个模型将在生产环境中表现良好?答案是:使用测试集和验证集:

![图 1.5 – 数据拆分]

![图片 B16735_01_005.jpg]

图 1.5 – 数据拆分

图 1.5展示了在训练和推理管道中我们可以有的不同数据拆分方式。训练数据是用于创建模型的数据,而测试数据是用于提取最终模型质量指标的数据。出于任何原因,除了提取模型指标之外,测试数据都不能在训练过程中使用。

避免在训练过程中使用测试数据的原因很简单:我们不能让模型在用于验证的数据之上进行学习。这种保留一部分数据用于测试的技术通常被称为保留法验证

图 1.5右侧的框代表生产数据。生产数据通常连续不断地到来,我们必须执行推理管道以从中提取模型结果。在生产数据上不进行任何训练,也不进行任何其他类型的重新计算;我们只需将其作为它本身通过推理管道即可。

从技术角度来看,大多数机器学习库使用.fit方法实现训练步骤,而推理步骤则通过.transform.predict方法实现。再次强调,这只是一个大多数机器学习库使用的常见模式,但请注意,您可能会在不同的机器学习库中找到不同的命名约定。

仍然查看图 1.5,还有一个靠近训练数据的框,称为验证数据。这是训练集的一个子集,通常用于在进入测试阶段之前支持最佳模型创建。我们将更详细地讨论这个框,但首先,让我们解释为什么我们需要它们。

过拟合和欠拟合

机器学习模型可能会遭受两种类型的拟合问题:过拟合欠拟合。过拟合意味着你的模型在训练数据上表现非常好,但不能推广到其他数据集,如测试数据,甚至更糟糕的是,生产数据。换句话说,如果你有一个过拟合的模型,它只能在你的训练数据上工作。

当我们在构建机器学习模型时,我们希望创建能够推广他们所学的知识,并在遵循相同数据分布的其他数据集上推断决策的解决方案。一个仅在训练数据上工作的模型是无用的。过拟合通常是由于特征数量过多或算法超参数配置不当造成的。

另一方面,欠拟合模型在训练阶段无法拟合数据。结果,它们过于通用,无法在训练、测试或生产数据上表现良好。欠拟合通常是由于缺乏良好的特征/观测值或由于缺乏训练模型的时间(某些算法需要更多的迭代来正确拟合模型)。

需要避免过拟合和欠拟合。有许多建模技术可以解决这个问题。例如,让我们关注常用的交叉验证技术及其与图 1.5中显示的验证框的关系。

应用交叉验证和测量过拟合

交叉验证是一种技术,我们将训练集分成训练集和验证集。然后,模型在训练集上训练并在验证集上测试。最常用的交叉验证策略被称为k 折交叉验证,其中k是训练集分割的数量。

使用 k 折交叉验证并假设k的值为 10,我们将训练集分成 10 个部分。模型将被训练和测试 10 次。在每个迭代中,它使用九个部分进行训练,留下一个部分进行测试。经过 10 次执行后,从每个迭代中提取的评估指标将被平均,并将代表训练阶段最终的模型性能,如图图 1.6所示:

![Figure 1.6 – 交叉验证的实际应用

![img/B16735_01_006.jpg]

图 1.6 – 交叉验证的实际应用

另一种常见的交叉验证技术被称为留一法交叉验证LOOCV)。在这种方法中,模型被多次执行,并且每次迭代中,一个观测值被分离出来用于测试,其余的用于训练。

在训练过程中使用交叉验证有许多优点:

  • 我们在训练数据中减轻过拟合,因为模型总是训练在特定数据块上,并在另一个未用于训练的数据块上进行测试。

  • 我们避免在测试数据中过拟合,因为不需要继续使用测试数据来优化模型。

  • 我们揭示了过拟合或欠拟合的存在。如果模型在训练/验证数据中的性能与在测试数据中观察到的性能非常不同,那么就有问题。

让我们更详细地阐述列表上的第三项,因为这是 AWS 机器学习专业考试中涵盖的内容。假设我们正在创建一个二元分类模型,在训练期间使用交叉验证,并使用测试集来提取最终指标(保留验证)。如果我们得到交叉验证结果的 80%准确率和测试集的 50%准确率,这意味着模型过度拟合了训练集,不能推广到测试集。

另一方面,如果我们训练集的准确率为 50%,而测试集的准确率为 80%,那么数据中存在系统问题。很可能训练集和测试集没有遵循相同的分布。

重要提示

准确率是分类模型中常用的模型评估指标。它衡量模型在推理过程中做出正确决策的频率。我们选择这个指标只是为了举例,但请注意,还有许多其他适用于每种类型模型的评估指标(将在适当的时候介绍)。

Bootstrapping 方法

交叉验证是验证机器学习模型的好策略,你应该尝试将其作为数据科学家日常活动的一部分。然而,你也应该了解其他可用的重采样技术。Bootstrapping就是其中之一。

虽然交叉验证不替换,但 bootstrapping 方法替换。替换意味着,当你从总体数据集中抽取多个随机样本时,相同的观测值可能会在样本中重复。

通常,bootstrapping 不会像我们在传统的交叉验证方法中做的那样用来验证模型。原因很简单:因为它使用替换,用于训练的相同观测值可能会被用于测试。这会导致模型性能指标膨胀,因为估计器在预测训练集中已经看到的观测值时很可能是正确的。

Bootstrapping 通常被机器学习算法以嵌入式方式使用,这需要重采样能力来处理数据。在这种情况下,bootstrapping 不是用来验证模型,而是用来创建模型。将在算法章节中介绍的随机森林就是那些在模型构建内部使用 bootstrapping 的算法之一。

设计一个好的数据分割/采样策略对于模型或算法的成功至关重要。你应该想出不同的方法来分割你的数据,检查模型在每个分割上的表现,并确保这些分割代表了模型将被使用的真实场景。

偏差与方差权衡

任何机器学习模型都应包含错误。我们可以在模型上找到三种类型的错误:偏差错误、方差错误和未解释错误。最后一个,正如预期的那样,无法解释。它通常与问题的上下文和变量之间的关系有关,我们无法控制它。

其他两个错误可以在建模过程中得到控制。我们通常说偏差和方差错误之间存在权衡,因为一个会影响到另一个。在这种情况下,增加偏差会减少方差,反之亦然。

偏差错误与模型为了学习目标函数(我们想要解决的问题)所做出的假设相关。某些类型的算法,如线性算法,通常会在模型训练期间携带这种类型的错误,因为它们在模型训练期间做出了很多假设。例如,线性模型假设数据中存在线性关系。线性回归和逻辑回归是通常包含高偏差的算法类型。另一方面,决策树是那些对数据做出较少假设的算法类型,包含较少的偏差。

方差与模型在不同训练数据上执行的估计差异相关。具有高方差的模型通常会对训练集过度拟合。决策树是具有高方差的算法示例(它们通常非常依赖于训练集的特定情况,无法进行泛化),而线性/逻辑回归是具有低方差的算法示例。这并不意味着决策树是差的估计器;这仅仅意味着我们需要在训练过程中对其进行修剪(优化)。

话虽如此,任何模型的目标都是最小化偏差和方差。然而,如前所述,每个都会以相反的方向影响另一个。为了演示起见,让我们使用决策树来了解这种权衡是如何工作的。

决策树是非线性算法,通常具有低偏差和高方差。为了减少方差,我们可以修剪树并设置max_depth超参数(树的最大允许深度)为 10。这将迫使模型更加通用,从而减少方差。然而,这种变化也将迫使模型做出更多假设(因为它现在更加通用)并增加偏差。

打乱训练集

现在你已经了解了方差和数据分割,让我们更深入地探讨训练数据集的要求。你很可能在考试中遇到关于数据打乱的问题。这个过程包括在开始使用训练数据集来拟合算法之前对其进行随机化。

数据洗牌将帮助算法通过创建更具泛化能力的模型来减少方差。例如,假设你的训练数据代表一个二元分类问题,并且它按目标变量排序(所有属于类别“0”的案例首先出现,然后是所有属于类别“1”的案例)。

当你在排序数据上拟合算法(尤其是依赖于批处理的一些算法)时,它将对其中一个类别的模式做出强烈的假设,因为它很可能无法创建包含两个类别良好代表性的随机批次数据。一旦算法对训练数据建立了强烈的假设,它可能很难改变这些假设。

重要提示

一些算法能够通过将数据分成块(也称为批次)来执行训练过程。这种方法使得模型能够更频繁地学习,因为它会在处理完每一批数据后做出部分假设(而不是在处理完整个数据集后做出决策)。

另一方面,没有必要洗牌测试集,因为它将仅用于推理过程以检查模型性能。

建模期望

到目前为止,我们已经讨论了模型构建、验证和管理。让我们通过在建模时讨论一些其他期望来完成机器学习的基础。

第一个原则是简约性。简约性描述的是提供最简单解释且与其他模型相比拟合最佳结果的模型。以下是一个例子:在创建线性回归模型时,你发现添加 10 个更多特征只能将你的模型性能提高 0.001%。在这种情况下,你应该考虑这种性能提升是否值得简约性的成本(因为你的模型将变得更加复杂)。有时这是值得的,但大多数时候并不值得。你需要保持怀疑态度,并根据你的业务案例进行思考。

简约性直接支持可解释性。你的模型越简单,解释它就越容易。然而,在可解释性和预测性之间存在着一场斗争:如果你专注于预测能力,你很可能会失去一些可解释性。再次强调,要成为一名合格的数据科学家,选择对你用例更好的方案。

介绍机器学习框架

了解一些机器学习框架将使你在通过 AWS 机器学习专业考试时处于更有利的地位。没有必要掌握这些框架,因为这不是针对特定框架的认证;然而,了解一些常见术语和解决方案将有助于你理解问题/问题的背景。

scikit-learn可能是你应该了解的最重要的机器学习框架。这是一个开源的 Python 包,提供了诸如决策树、支持向量机、线性回归等机器学习算法的实现。它还实现了数据预处理类,例如,独热编码、标签编码、主成分分析等。本书后面的章节将涵盖所有这些预处理方法(以及许多其他方法)。

scikit-learn 的缺点是需要对多台机器进行定制以进行扩展。还有一个机器学习库因其能够直接处理多进程而非常受欢迎:Spark 的机器学习库

如其名所示,这是一个在Apache Spark之上运行的机器学习库,Apache Spark 是一个用于在多台机器上处理数据的统一分析多处理框架。AWS 提供了一种特定的服务,允许开发者通过几点击就能创建 Spark 集群,称为EMR

Spark 机器学习库正在不断发展。截至写作时,它支持许多机器学习算法类别,如分类和回归、聚类和协同过滤。它还提供了对基本统计计算的支持,如相关性和一些假设检验,以及许多数据转换,如独热编码、主成分分析、最小-最大缩放等。

另一个非常受欢迎的机器学习框架被称为TensorFlow。这个机器学习框架是由谷歌团队创建的,用于数值计算和大规模机器学习模型开发。TensorFlow 不仅实现了传统的机器学习算法,还实现了深度学习模型。

TensorFlow 被视为模型开发的低级 API,这意味着开发更复杂的模型,如转换器,用于文本挖掘可能会非常复杂。为了便于模型开发,其他机器学习框架被构建在 TensorFlow 之上,使其更容易使用。其中一个是Keras。使用 Keras,开发者只需几行代码就能创建复杂的深度学习模型。最近,Keras 被纳入 TensorFlow,现在可以在 TensorFlow 库中调用。

MXNet是另一个开源的深度学习库。使用 MXNet,我们可以通过在多台机器上运行多个 GPU 来扩展基于神经网络的模型。它还支持不同的编程语言,如 Python、R、Scala 和 Java。

图形处理单元GPU)在深度学习库如 TensorFlow 和 MXNet 中支持尤为重要。这些库允许开发者创建和部署具有多层神经网络的模型。神经网络的训练过程很大程度上依赖于矩阵运算,而这些运算在 GPU 上比在 CPU 上执行得更好。这就是为什么这些深度学习库提供 GPU 支持。AWS 还提供了带有 GPU 功能的 EC2 实例。

这些机器学习框架需要一个特殊的通道来与 GPU 单元通信。NVIDIA,如今最常用的 GPU 供应商,已经创建了一个名为 Compute Unified Device ArchitectureCUDA) 的 API。CUDA 用于配置 NVIDIA 设备上的 GPU 单元,例如,设置缓存内存和训练神经网络模型所需的线程数量。对于 AWS 机器学习专业考试,你不需要掌握 CUDA 或 GPU 架构,但你确实需要了解它们是什么以及深度学习模型如何利用它们。

最后但同样重要的是,你还应该了解一些数据科学社区广泛使用的开发框架,但并不一定用于机器学习。这些框架与机器学习库交互,以促进数据处理和计算。例如,pandas 是一个提供数据处理能力的 Python 库,而 NumPy 是一个提供数值计算的开放源代码 Python 库。

这些术语和库已经如此融入数据科学家的日常工作中,以至于在考试中可能会用到它们来为你解释某些问题领域。了解它们是什么将帮助你快速理解问题的上下文。

云端机器学习

机器学习已经走向云端,开发者现在可以将其作为一项服务来使用。AWS 在不同抽象级别实现了机器学习服务。例如,机器学习应用服务旨在为特定问题领域提供即插即用的解决方案。AWS Lex 是一个机器学习作为服务的清晰示例,人们可以以最小的开发量实现聊天机器人。

AWS Rekognition 是另一个例子,旨在识别图像和视频中的物体、人物、文本、场景和活动。AWS 提供了许多其他机器学习应用服务,这些服务将在本书的下一章中介绍。

除了应用服务之外,AWS 还提供了机器学习开发平台,SageMaker 就是这种情况。与 AWS Lex 和 Rekognition 这样的即插即用服务不同,SageMaker 是一个开发平台,它将允许你以更大的灵活性构建、训练和部署自己的模型。

SageMaker 通过自动处理模型训练和推理管道所需的基础设施来加速开发和部署过程。在幕后,SageMaker 协调其他 AWS 服务(如 EC2 实例、负载均衡器、自动扩展等)以创建可扩展的机器学习项目环境。SageMaker 可能是你在 AWS 机器学习专业考试中应该掌握的最重要服务,它将在单独的部分中详细介绍。现在,你应该专注于理解 AWS 提供的与机器学习相关的服务的不同方法。

AWS 提供的用于部署机器学习模型的第三种选项是最通用和灵活的:你可以通过结合不同的 AWS 服务并单独管理它们来部署机器学习模型。这本质上就是 SageMaker 为你做的事情,从头开始构建你的应用程序。例如,你可以使用 EC2 实例、负载均衡器、自动扩展和 API 网关来创建一个针对特定模型的推理管道。如果你愿意,你也可以使用 AWS 无服务器架构来部署你的解决方案,例如,使用AWS Lambda 函数

摘要

我们现在正走向本章的结尾,我们已经讨论了关于机器学习基础的一些重要主题。我们以关于人工智能、机器学习和深度学习的理论讨论开始本章,并讨论了由于大数据平台和云服务提供商的出现,这个整个领域在过去几年中是如何发展的。

然后,我们转向监督学习、无监督学习和强化学习之间的区别,强调了与每个相关的用例。这可能是 AWS 机器学习专业考试中的一个主题。

我们讨论了机器学习模型是在许多不同的阶段构建的,算法本身只是建模过程的一部分。我们还讨论了良好模型预期的行为。

我们深入探讨了数据拆分,讨论了训练和验证模型的不同方法,并覆盖了方差和偏差之间的神话之战。我们通过讨论机器学习框架和服务来结束本章。

接下来,你将学习 AWS 机器学习应用服务,例如 Amazon Polly、Amazon Rekognition、Amazon Transcribe 以及许多其他与 AI 相关的 AWS 服务。但在那之前,让我们看看一些样题,以给你一个关于考试中可能遇到的内容的印象。

问题

  1. 你被雇佣来自动化一家呼叫中心公司的有声响应单元。每当有新客户的电话进来时,系统必须能够理解当前服务的负载以及电话的目标,并在有声响应单元中推荐正确的路径。公司没有标记数据来监督模型;它必须采取一种通过经验(试错)来学习的方法;每次算法做出良好的路径推荐时,它都会得到奖励。哪种机器学习方法最适合这个项目?

    a) 无监督学习

    b) 强化学习

    c) 监督学习

    d) 深度学习

    答案

    b, 由于没有标记数据,并且智能体需要通过经验来学习,因此强化学习更适合这个用例。问题中的另一个重要事实是智能体因良好的决策而获得奖励。

  2. 你在一个大型公司的市场营销部门工作,你需要根据客户的购买行为对客户进行细分。哪种机器学习方法最适合这个项目?

    a) 无监督学习

    b) 强化学习

    c) 监督学习

    d) 深度学习

    答案

    a, 聚类(这是一种无监督学习方法)是处理数据分割/聚类的最常见算法类型。

  3. 你在一家零售公司工作,该公司需要预测未来几个月的销售情况。哪种机器学习方法最适合这个项目?

    a) 无监督学习

    b) 强化学习

    c) 监督学习

    d) 深度学习

    答案

    c, 预测是一种监督学习方法,旨在预测数值;因此,它可能被构建为回归问题并作为监督学习。

  4. 一家制造公司需要了解他们在生产链的每个阶段花费了多少钱。哪种机器学习方法最适合这个项目?

    a) 无监督学习。

    b) 强化学习。

    c) 监督学习。

    d) 机器学习不是必需的。

    答案

    d, 机器学习无处不在,但并非所有事情都需要机器学习。在这种情况下,公司应该能够从生产链的每个阶段收集成本并汇总,因此没有必要使用机器学习。

  5. 以下哪种学习方法为我们提供了实现聊天机器人的最先进算法?

    a) 无监督学习

    b) 强化学习

    c) 监督学习

    d) 深度学习

    答案

    d, 深度学习为自然语言处理领域提供了最先进的算法。

  6. 你从另一个团队那里收到了一个训练集来创建一个二元分类模型。他们告诉你数据集已经被洗牌并准备好建模。你决定快速查看基于神经网络的特定算法在这个数据集上的表现。然后你将数据分为训练集和测试集,并运行你的算法。然而,结果看起来非常奇怪。似乎算法无法收敛到最优解。对于这个问题,你会首先进行哪方面的调查?

    a) 确保使用的算法能够处理二元分类模型。

    b) 查看每个类别的数据比例,并确保它们是平衡的。

    c) 在开始工作之前对数据集进行洗牌。

    d) 确保你正在使用所选算法的正确超参数。

    答案

    c, 数据科学家必须对其工作持怀疑态度。在没有事先验证的情况下不要对数据进行假设。在本书的这一部分,你可能还不了解神经网络的具体细节,但你知道机器学习模型对它们训练的数据非常敏感。在做出其他决定之前,你应该仔细检查传递给你的假设。顺便说一句,洗牌你的训练数据是你应该做的第一件事。这很可能会出现在考试中。

  7. 你创建了一个分类模型来预测银行交易是否为欺诈。在建模阶段,你的模型在训练集和测试集上都表现良好。当你将模型在生产环境中执行时,人们开始抱怨模型的准确率低。假设在训练阶段没有过度拟合/欠拟合问题,你的第一项调查是什么?

    a) 训练集和测试集不遵循相同的分布。

    b) 创建此模型所使用的训练集不代表模型部署的实际环境。

    c) 最终解决方案中使用的算法无法充分泛化以识别生产系统中的欺诈案例。

    d) 由于所有 ML 模型都包含错误,我们无法推断它们在生产系统中的性能。

    答案

    b, 数据采样非常具有挑战性,你应该始终确保你的训练数据尽可能精确地代表生产数据。在这种情况下,没有证据表明训练集和测试集无效,因为模型能够在两组数据上表现良好且一致。由于问题恰好出现在生产系统中,训练过程中可能存在系统性问题,导致出现此问题。

  8. 你正在训练一个具有 500 个特征的分类模型,在训练集中达到了 90%的准确率。然而,当你将其运行在测试集中时,你只得到了 70%的准确率。以下哪些选项是解决此问题的有效方法(选择所有适用的选项)?

    a) 减少特征数量。

    b) 添加额外特征。

    c) 在训练过程中实现交叉验证。

    d) 选择另一个算法。

    答案

    a, c, 这显然是一个过度拟合问题。为了解决这个问题,你可以减少过多的特征数量(这将减少模型的复杂性并使其对训练集的依赖性降低)。此外,你还可以在训练过程中实现交叉验证。

  9. 你正在训练一个神经网络模型,并希望尽可能快地执行训练过程。以下哪种硬件架构对你加速神经网络训练过程最有帮助?

    a) 使用实现多线程处理的 CPU 的机器。

    b) 使用具有 GPU 处理的机器。

    c) 增加机器的 RAM 容量。

    d) 使用具有 SSD 存储的机器。

    答案

    b, 虽然你可能会从多线程处理和大量 RAM 中获得一些好处,但使用 GPU 训练神经网络将给你带来最佳性能。你将在本书的后续章节中了解更多关于神经网络的知识,但你已经知道它们在训练期间执行大量的矩阵计算,这比 CPU 支持得更好。

  10. 以下哪个关于数据重采样的说法是不正确的?

    a) 交叉验证是一种数据重采样技术,有助于在模型训练过程中避免过拟合。

    b) 引导式采样是一种数据重采样技术,通常嵌入在机器学习模型中,需要重采样能力来估计目标函数。

    c) k-折交叉验证中的参数 k 指定了将创建多少个样本。

    d) 引导式采样在不放回的情况下工作。

    答案

    d, 关于交叉验证和引导式采样的所有陈述都是正确的,除了选项 d,因为引导式采样是放回的(相同的观测值可能会出现在不同的分割中)。

第二章: AWS 人工智能/机器学习应用服务

在本章中,我们将了解 AWS 人工智能服务,用于构建聊天机器人、高级文本分析、文档分析、转录等。本章的设计方式是,您可以通过集成 AWS 人工智能服务来解决不同的用例,并了解它们的工作原理。AWS 每天都在增长,并且他们定期添加新的 AI 服务。

在本章中,您将通过编程或从控制台来处理不同的用例。这将帮助您了解不同的 API 及其用法。我们将使用 S3 进行存储,并使用 AWS Lambda 来执行任何代码。本章的示例是用 Python 编写的,但您可以使用其他支持的语言,如 Java、Node.js、.NET、PowerShell、Ruby 等。

我们将涵盖以下主题:

  • 使用 Amazon Rekognition 分析图像和视频

  • 使用 Amazon Polly 进行语音合成

  • 使用 Amazon Transcribe 进行语音转文本

  • 使用 Amazon Comprehend 实现自然语言处理

  • 使用 Amazon Translate 翻译文档

  • 使用 Amazon Textract 从文档中提取文本

  • 在 Amazon Lex 上创建聊天机器人

让我们开始吧!

技术要求

您在本章中需要的只是一个 AWS 账户。

您可以从 GitHub 下载本章的代码示例,网址为github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-2

使用 Amazon Rekognition 分析图像和视频

如果您需要为您的应用程序添加强大的视觉分析功能,那么Amazon Rekognition是您应该选择的服务。Rekognition Image让您能够轻松构建强大的应用程序,用于搜索、验证和组织数百万张图像。Rekognition Video让您能够从存储或实时流视频中提取基于运动的内容,并帮助您分析它们。Rekognition Video 还允许您索引诸如对象、活动、场景、名人以及面部等元数据,使视频搜索变得简单。Rekognition Image 使用深度神经网络模型检测和标记您图像中的数千个对象和场景。它帮助您捕获图像中的文本,有点像光学字符识别OCR)。一个完美的例子就是印有引语的 T 恤。如果您要拍一张照片并让 Amazon Rekognition 从中提取文本,它就能告诉您文本的内容。您还可以使用 Amazon Rekognition 进行名人识别。我不是名人,所以我不会使用名人识别 API 来识别我的面部;相反,我将使用面部比较 API。

aws.amazon.com/rekognition/faqs/提供的官方文档中,说明了以下内容:

"使用 Rekognition Image,您只需为分析的图像和存储的面部元数据付费。如果您的训练在任何时候失败,您将不会为计算资源付费。"

Amazon Rekognition 的一些常见用途包括以下内容:

  • 图像和视频分析

  • 可搜索的图像库

  • 基于面部用户验证

  • 情感分析

  • 图像中的文本

  • 面部识别

  • 图像审查

  • 搜索视频档案索引

  • 视频的简单过滤,用于明显和暗示性内容

  • 明显裸露的例子——性行为、图形裸露、成人玩具等等

  • 暗示性内容的例子——部分裸露、泳装或内衣等等

探索 Amazon Rekognition 的益处

让我们来看看使用 Amazon Rekognition 的一些好处:

  • AWS 管理其运行的底层基础设施。简而言之,只需使用 API 进行图像分析。我们只需专注于构建和管理我们的深度学习管道。

    无论是否了解图像处理,您都可以仅通过使用 Amazon Rekognition 提供的 API 来执行图像和视频分析,这些 API 可用于多个平台上的任何应用程序或服务。

  • 标签 API 的响应将通过 DetectLabels API 识别图像中的现实世界实体。这些标签包括城市、镇、桌子、家庭、花园、动物、宠物、食物、饮料、电子产品、花卉等等。实体根据其置信度分数进行分类,该分数表示给定预测正确的概率:越高越好。同样,我们可以使用 DetectText API 从图像中提取文本。Amazon Rekognition 可能会根据单词之间的间隔检测多行。句点不代表行的结束。

  • Amazon Rekognition 可以与 AWS Kinesis Video Stream、AWS S3 和 AWS Lambda 集成,以实现无缝且经济的图像和视频分析。使用 AWS IAM 服务,Amazon Rekognition API 调用可以轻松地得到保护和控制。

  • 低成本。您只需为分析的图像和视频付费。

  • 通过 AWS CloudTrail,所有针对 Amazon Rekognition 的 API 调用都可以被捕获为事件。它捕获来自控制台、CLI 或代码对 API 的调用,这进一步使用户能够根据 CloudTrail 事件创建 Amazon SNS 通知。

  • 您可以为特定的 API 调用创建 VPC 端点策略,以在您的 VPC 和 Amazon Rekognition 之间建立私有连接。这有助于您利用增强的安全性。根据 AWS 共享责任模型,AWS 负责基础设施和软件的安全性,我们必须负责在云中保护我们的内容。

亲身体验 Amazon Rekognition

在本节中,我们将学习如何将 AWS Lambda 与 Amazon Rekognition 集成,以检测我们图像(上传至 github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-2/Amazon%20Rekognition%20Demo/images)中的标签,并在 CloudWatch 控制台中打印检测到的对象。我们将在代码中使用 Amazon Rekognition 的 detect_labels API。

我们将首先为 Lambda 创建一个 IAM 角色:

  1. 导航到 IAM 控制台页面。

  2. 从左侧菜单中选择角色

  3. 选择创建角色

  4. 选择一个用例部分选择Lambda

  5. 添加以下托管策略:

    • AmazonS3ReadOnlyAccess

    • AmazonRekognitionFullAccess

    • CloudWatchLogsFullAccess

  6. 将角色命名为 rekognition-lambda-role图 2.1 – 创建角色对话框

    图 2.1 – 创建角色对话框

    接下来,我们将创建一个 Lambda 函数。

  7. 导航到 AWS Lambda 控制台页面。

  8. 选择创建函数

  9. 创建一个函数:

    • 选择 lambda-rekognition

    • rekognition-lambda-role 选择 Python 3.6

图 2.2 – 创建 Lambda 函数

图 2.2 – 创建 Lambda 函数

  1. lambda_function.py 中输入以下代码:

    from __future__ import print_function
    import boto3
    def lambda_handler(event, context):
        print("========lambda_handler started=======")
        # read the bucket name (key) from the event
        name_of_the_bucket=event['Records'][0]['s3']['bucket']
    ['name']
        # read the object from the event
        name_of_the_photo=event['Records'][0]['s3']['object']['key']
        detect_labels(name_of_the_photo,name_of_the_bucket)
        print("Labels detected Successfully")
    def detect_labels(photo, bucket):
        client=boto3.client('rekognition')
      response=client.detect_labels(Image={'S3Object':{'Bucket':bucket,'Name':photo}})
        print('Detected labels for ' + photo) 
        print('==============================')   
        for label in response['Labels']:
            print ("Label: " + label['Name'])
            print ("Confidence: " + 
    str(label['Confidence']))
            print ("Instances:")
            for instance in label['Instances']:
                print ("  Bounding box")
                print ("Top: 
    "+str(instance['BoundingBox']['Top']))
                print ("Left: \
    "+str(instance['BoundingBox']['Left']))
                print ("Width: \
    "+str(instance['BoundingBox']['Width']))
                print ("Height: \
    "+str(instance['BoundingBox']['Height']))
                print ("Confidence: 
    "+str(instance['Confidence']))
                print()
            print ("Parents:")
            for parent in label['Parents']:
                print ("   " + parent['Name'])
            print ("----------")
            print('==============================') 
        return response 
    

    现在,我们将为 Lambda 函数创建一个触发器。

  2. 导航到 AWS S3 控制台页面。创建一个存储桶,例如,rekognition-test-baba,如下截图所示:图 2.3 – AWS S3 控制台页面

    图 2.3 – AWS S3 控制台页面

  3. 点击 images。点击保存

  4. 点击我们的存储桶的属性标签页。

  5. 将滚动到该存储桶的事件

  6. rekognition_event

  7. 所有对象创建事件

  8. images/

  9. Lambda 函数

  10. lambda-rekognition

图 2.4 – S3 存储桶事件窗口

图 2.4 –S3 存储桶事件窗口

接下来,我们将从共享的 GitHub 仓库上传图像到 S3 存储桶 images 文件夹。

  1. 一旦上传,您就可以检查 Lambda 控制台中的监控标签页以监控事件,如下截图所示:图 2.5 – CloudWatch 在 Lambda 控制台中监控事件

    图 2.5 – CloudWatch 在 Lambda 控制台中监控事件

  2. 导航到 CloudWatch > CloudWatch Logs > Log groups > /aws/lambda/lambda-rekognition。选择所有流中的最新流,并在日志中向下滚动以查看您的输出,如下截图所示:

图 2.6 – CloudWatch 日志

图 2.6 – CloudWatch 日志

在本节中,我们学习了如何实现 Amazon Rekognition AI 服务以检测图像中的对象并为每个对象获取置信度分数。在接下来的章节中,我们将看到 Amazon Rekognition 的更多用例,届时我们将检测图像中的文本。在下一节中,我们将了解 Amazon 的文本到语音服务并实现它。

使用 Amazon Polly 进行文本到语音

Amazon Polly全关于将文本转换为语音,并且使用预训练的深度学习模型来完成。这是一个完全托管的服务,所以我们不需要做任何事情。您提供纯文本作为合成输入或在语音合成标记语言(SSML)格式中,以便返回音频流。它还提供了不同的语言和声音供您选择,包括男性和女性选项。Amazon Polly 的输出音频可以保存为 MP3 格式,以便在应用程序(网页或移动)中进一步使用,或者可以是一个 JSON 输出,用于书面语音。

例如,如果我们把文本“巴巴去了图书馆”输入到 Amazon Polly 中,输出的语音标记对象将如下所示:

{"time":370,"type":"word","start":5,"end":9,"value":"went"}

单词“去了”在音频流开始后的 370 毫秒处开始,从给定输入文本的 5 个字节开始,到 9 个字节结束。

它还以ogg_vorbispcm格式返回输出。当使用pcm时,返回的内容是 16 位有符号、单通道(单声道)、小端格式的音频/pcm。

Amazon Polly 的一些常见用途包括以下内容:

  • 可用作阅读网络内容的辅助工具。

  • 可与 Amazon Rekognition 集成,帮助视障人士阅读标志。您可以点击带有文本的标志图片并将其输入到 Amazon Rekognition 中提取文本。输出文本可以用作 Polly 的输入,它将返回语音输出。

  • 可用于公共广播系统,管理员团队只需传递要宣布的文本,Amazon Polly 即可完成魔法般的转换。

  • 通过将 Amazon Polly 与Amazon Connect(电话后端服务)结合使用,您可以构建音频/视频接收器(AVR)系统。

  • 智能设备,如智能电视、智能手表和物联网(IoT)设备,可以使用此功能进行音频输出。

  • 叙事生成。

  • 当与 Amazon Lex 结合使用时,可以开发应用程序的完整语音用户界面。

现在,让我们探索 Amazon Polly 的好处。

探索 Amazon Polly 的好处

使用 Amazon Polly 的一些好处包括以下内容:

  • 此服务完全托管,无需任何管理成本来维护或管理资源。

  • 它提供即时语音校正和增强功能。

  • 您可以使用 Amazon Polly 的 HTTP API 开发自己的访问层。由于有大量的语言支持,如 Python、Ruby、Go、C++、Java 和 Node.js,因此开发变得非常容易。

  • 对于某些神经网络语音,可以使用新闻主播风格进行语音合成,使其听起来像电视或广播电台的广播员。

  • Amazon Polly 还允许您修改特定单词的发音或使用新单词。

接下来,我们将亲身体验 Amazon Polly。

亲身体验 Amazon Polly

在本节中,我们将构建一个管道,可以集成 AWS Lambda 与 Amazon Polly,读取一个文本文件,然后将其生成相同内容的MP3文件到同一个桶的另一个文件夹中。我们将通过 CloudWatch 日志监控任务的进度。

我们将首先为 Lambda 创建一个 IAM 角色。让我们开始吧:

  1. 导航到 IAM 控制台页面。

  2. 从左侧菜单中选择角色

  3. 选择创建角色

  4. 选择Lambda作为受信任实体。

  5. 添加以下托管策略:

    • AmazonS3FullAccess

    • AmazonPollyFullAccess

    • CloudWatchFullAccess

  6. 将角色保存为polly-lambda-role

接下来,我们将创建一个 Lambda 函数:

  1. 导航到polly-lambda

  2. 设置运行时为python 3.6

  3. 使用现有角色;即polly-lambda-role

  4. 将代码粘贴到github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-2/Amazon%20Rekognition%20Demo/lambda_code中的您的 lambda 函数,并在 CloudWatch 控制台中检查其进度。我们将使用 Amazon Polly 的start_speech_synthesis_task API 来运行此代码;它是一个异步合成任务。

  5. 滚动到59 ,如图下所示,然后点击保存

    重要提示

    默认为 3 秒。由于这是一个异步操作,任何重试尝试都将创建更多文件。

    图 2.7 – 编辑基本设置窗口

    图 2.7 – 编辑基本设置窗口

    现在,我们将创建一个桶以触发事件。

  6. 导航到 AWS S3 控制台,创建一个名为polly-test-baba的桶。

  7. 创建一个名为input-text的文件夹(在这个例子中,我们只会上传.txt文件)。

  8. 导航到polly_event

  9. 所有对象创建事件

  10. input-text/

  11. txt

  12. Lambda Function

  13. polly-lambda

  14. 接下来,我们将上传一个文件以触发事件,并在 CloudWatchUpload 中检查其进度,在这种情况下,input-text中的文件test_file.txt,如图下所示。您可以从本书的 GitHub 仓库下载示例文件:github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-2/Amazon%20Polly%20Demo/text_file图 2.8 – 上传文本文件以进行进一步处理后的 S3 桶

    图 2.8 – 上传文本文件以进行进一步处理后的 S3 桶

  15. 这将触发 lambda 函数。您可以通过访问 CloudWatch> CloudWatch 日志> 日志组> /aws/lambda/polly-lambda 来监控您的日志:图 2.9 – CloudWatch 控制台中的日志组

    图 2.9 – CloudWatch 控制台中的日志组

  16. 点击最新的流;日志将如下所示:

    File Content:  Hello Everyone, Welcome to Dublin. How 
    are you doing today?
    {'ResponseMetadata': {'RequestId': '74ca4afd-5844-
    47d8-9664-3660a26965e4', 'HTTPStatusCode': 200, 
    'HTTPHeaders': {'x-amzn-requestid': '74ca4afd-5844-
    47d8-9664-3660a26965e4', 'content-type': 
    'application/json', 'content-length': '471', 'date': 
    'Thu, 24 Sep 2020 18:50:57 GMT'}, 'RetryAttempts': 0}, 
    'SynthesisTask': {'Engine': 'standard', 'TaskId': 
    '57548c6b-d21a-4885-962f-450952569dc7', 'TaskStatus': 
    'scheduled', 'OutputUri': 'https://s3.us-east-
    1.amazonaws.com/polly-test-baba/output-
    audio/.57548c6b-d21a-4885-962f-450952569dc7.mp3', 
    'CreationTime': datetime.datetime(2020, 9, 24, 18, 50, 
    57, 769000, tzinfo=tzlocal()), 'RequestCharacters': 
    59, 'OutputFormat': 'mp3', 'TextType': 'text', 
    'VoiceId': 'Aditi', 'LanguageCode': 'en-GB'}}
    

    以下截图显示了日志样本:

    图 2.10 – CloudWatch 控制台中的日志

    图 2.10 – CloudWatch 控制台中的日志

  17. 它将以 MP3 格式创建输出,如下面的截图所示。下载并收听它:

图 2.11 – 在 S3 存储桶中创建的输出文件

图 2.11 – 在 S3 存储桶中创建的输出文件

重要提示

对于您的移动应用或 Web 应用来说,最可扩展且成本效益最高的方式是为 S3 存储桶生成 AWS 预签名 URL,并将其提供给用户。这些 S3 Put 事件异步调用下游 AI 工作流程以生成结果,并向最终用户发送响应。通过这种方法,可以同时为许多用户提供服务,并且可能会提高性能和吞吐量。

在本节中,我们学习了如何实现文本到语音。在下一节中,我们将了解 Amazon Transcribe,这是一种语音到文本的 AI 服务。

使用 Amazon Transcribe 进行语音到文本转换

在上一节中,我们学习了文本到语音。在本节中,我们将学习语音到文本以及提供此服务的服务:Amazon Transcribe。它是一种使用预训练的深度学习模型的自动语音识别服务,这意味着我们不需要在数 PB 的数据上进行训练以生成模型;亚马逊为我们完成这项工作。我们只需使用可用的 API 来转录音频文件或视频文件;它还支持多种不同的语言和自定义词汇。准确性是关键,并且通过自定义词汇,您可以根据所需的领域或行业来增强它:

图 2.12 – Amazon Transcribe 输入和输出块的示意图

图 2.12 – Amazon Transcribe 输入和输出块的示意图

Amazon Transcribe 的常见用途包括以下内容:

  • 实时音频流和转录。

  • 转录预录制的音频文件。

  • 通过结合 AWS Elasticsearch 和 Amazon Transcribe,启用从媒体文件中进行文本搜索。

  • 对录音音频文件进行情感分析以帮助语音客服(接触中心分析)。

  • 信道识别分离。

接下来,我们将探讨 Amazon Transcribe 的好处。

探索 Amazon Transcribe 的好处

让我们看看使用 Amazon Transcribe 的一些好处:

  • 内容编辑:通过指示 Amazon Transcribe 识别和编辑 VocabularyFilterNameVocabularyFilterMethod(由 StratTranscriptionJob 操作提供),可以确保客户隐私。例如,在金融机构中,这可以用来编辑呼叫者的详细信息。

  • 语言识别:它可以自动识别音频文件中最常用的语言并生成转录。如果您有多个音频文件,则这项服务可以帮助您按语言对它们进行分类。

  • 流式转录:您可以将记录的音频文件或实时音频流发送到 Amazon Transcribe,并实时输出文本流。

  • 自定义词汇或定制转录:您可以根据您的特定需求使用自定义词汇列表来生成准确的转录。

  • 时间戳生成:如果您想为视频创建或添加字幕,那么 Amazon Transcribe 可以返回音频中每个单词或短语的时戳。

  • 成本效益:作为一个托管服务,没有基础设施成本。

现在,让我们亲身体验 Amazon Transcribe。

亲身体验 Amazon Transcribe

在本节中,我们将构建一个管道,其中我们可以将 AWS Lambda 与 Amazon Transcribe 集成,以读取存储在 S3 桶中文件夹内的音频文件,然后将输出 JSON 文件存储在另一个 S3 桶中。我们还将通过 CloudWatch 日志监控任务的进度。我们将使用 start_transcription_job 异步函数来启动我们的工作,并通过 get_transcription_job 持续监控工作,直到其状态变为 COMPLETED。让我们开始吧:

  1. 首先,为 Lambda 函数创建一个名为 transcribe-demo-role 的 IAM 角色,以确保它可以读取和写入 S3,使用 Amazon Transcribe,并在 CloudWatch 日志中打印输出。将以下策略添加到 IAM 角色中:

    • AmazonS3FullAccess

    • CloudWatchFullAccess

    • AmazonTranscribeFullAccess

  2. 现在,我们将使用现有的 IAM 角色 transcribe-demo-role 创建一个名为 transcribe-lambda 的 Lambda 函数,并将其保存。

    请确保您将 start_transcription_job 中的默认超时值更改为更高的值以启动任务,并使用 get_transcription_job API 进行监控。

  3. 将可用的代码粘贴到 github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/blob/master/Chapter-2/Amazon%20Transcribe%20Demo/lambda_function/lambda_function.py 并点击 部署

    这应该会给我们以下输出:

    图 2.13 – 我们创建的 lambda 函数的基本设置部分

    图 2.13 – 我们创建的 lambda 函数的基本设置部分

  4. 接下来,我们将创建一个名为 transcribe-demo-101 的 S3 桶和一个名为 input 的文件夹。通过访问 audio-event 创建一个事件。

  5. 所有对象创建事件

  6. input/

  7. Lambda 函数

  8. transcribe-lambda

  9. .mp4 格式的音频文件上传到 input 文件夹。这将触发 Lambda 函数。根据代码,输出将以 JSON 格式存储在 S3 桶中,然后您可以使用它来读取文件内容。

  10. 导航到 CloudWatch > CloudWatch Logs > Log groups > aws/lambda/transcribe-lambda。从列表中选择最新的流。它看起来如下所示:![图 2.14 – CloudWatch 控制台中指定日志组的日志流 img/B16735_02_014.jpg

    图 2.14 – CloudWatch 控制台中指定日志组的日志流

  11. 输出以 JSON 格式保存在提到的作业名称的 S3 桶中(您可以使用 S3 的 getObject API 下载并读取它):

![图 2.15 – S3 桶中的输出 JSON 文件img/B16735_02_015.jpg

图 2.15 – S3 桶中的输出 JSON 文件

重要提示

不过度配置您函数的超时设置是一种最佳实践。始终了解您的代码性能并根据需要设置函数超时。过度配置函数超时会导致 Lambda 函数运行时间更长,并造成意外的成本。如果您在 Lambda 函数中使用异步 API 调用,那么在成功时将它们写入 SNS 主题,并从那里触发另一个 Lambda 函数是个好主意。如果需要人工干预,建议您使用 AWS Step Functions。

在本节中,我们学习了并应用了 Amazon Transcribe 将语音转换为文本。在下一节中,我们将了解我们可以使用的最强大的 AWS AI 服务之一,以从我们的文本数据中获得最大洞察力。

使用 Amazon Comprehend 实现自然语言处理

此服务帮助您从非结构化文本中提取洞察力。非结构化文本信息呈指数增长。以下是一些数据源示例:

  • 客户参与度:呼叫中心、问题分类、客户调查和产品评论

  • 业务流程:客户/供应商电子邮件、产品支持消息和运营支持反馈

  • 记录和研究:白皮书和医疗记录

  • 新闻和社交媒体:社交媒体分析、品牌趋势和相关事件

现在,问题是,我们能用这些数据做什么?我们如何分析它并从中提取任何价值?答案是 Amazon Comprehend,它用于从您的非结构化数据中获取洞察力。

Amazon Comprehend 的常见用途包括以下内容:

  • 信息管理系统

  • 有组织的主题上的更精确的搜索系统

  • 用户情感分析

  • 支持票分类

  • 从文档中检测语言,然后使用 Amazon Translate 翻译成英语

  • 创建一个系统来标记非结构化临床数据,以协助研究和分析

  • 从公司会议或电视新闻的保存音频文件中提取主题

接下来,我们将探索 Amazon Comprehend 的优势。

探索 Amazon Comprehend 的优势

使用 Comprehend 的一些优势可以在以下图像中看到:

图 2.16 – 显示 Amazon Comprehend 功能的框图

图 2.16 – 显示 Amazon Comprehend 功能的框图

让我们更详细地看看这些:

  • 它检测文本的语言并提取关键短语。Amazon Comprehend 还可以用于情感分析和主题建模。

  • Amazon Comprehend Medical 可用于提取医疗信息。

  • 由于这是一个完全管理的服务,您只需为使用付费;您无需为基础设施付费。您不需要训练、开发和部署自己的模型。

  • 主题建模服务通过提取最多 100 个主题来工作。主题是一个关键字桶,这样您就可以看到实际文档集中有什么。

  • 它准确、持续训练且易于使用。

接下来,我们将亲身体验 Amazon Comprehend。

亲身体验 Amazon Comprehend

在本节中,我们将构建一个管道,其中可以集成 AWS Lambda 与 Amazon Rekognition 和 Amazon Comprehend。然后我们将读取存储在 S3 存储桶中的图像文件,并检测从图像中提取的文本的语言。我们还将使用 CloudWatch 打印输出。以下是我们用例的图示:

图 2.17 – 所需用例的架构图

图 2.17 – 所需用例的架构图

让我们从创建 IAM 角色开始:

  1. 导航到 IAM 控制台页面。

  2. 从左侧菜单中选择角色

  3. 选择创建角色

  4. 选择Lambda作为受信任实体。

  5. 添加以下管理策略

    • AmazonS3ReadOnlyAccess

    • AmazonRekognitionFullAccess

    • ComprehendFullAccess

    • CloudWatchFullAccess

  6. 将角色保存为language-detection-from-image-role

  7. 现在,让我们创建 Lambda 函数。导航到Lambda > 函数 > 创建函数

  8. 将函数命名为language-detection-from-image

  9. 将运行时设置为Python 3.6

  10. 使用我们现有的角色;即language-detection-from-image-role

  11. github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-2/Amazon%20Transcribe%20Demo/lambda_function下载代码,将其粘贴到函数中,然后从 Amazon Rekognition 中选择detect_text API 以检测图像中的文本,并从 Amazon Comprehend 中选择batch_detect_dominant_language API 以检测文本的语言。

  12. 现在,转到您的 AWS S3 控制台,创建一个名为 language-detection-image 的存储桶。

  13. 创建一个名为 input-image 的文件夹(在本例中,我们只会上传 .jpg 文件)。

  14. 导航到属性 > 事件 > 添加通知

  15. image-upload-event中填写所需的字段

  16. 所有对象创建事件

  17. input-image/

  18. .jpg

  19. Lambda 函数

  20. language-detection-from-image

  21. 导航到文件夹中的sign-image.jpg图片。(此文件可在本书的 GitHub 仓库中找到,地址为github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-2/Amazon%20Comprehend%20Demo/input_image)。

  22. 此文件上传将触发 lambda 函数。您可以从CloudWatch> CloudWatch Logs> Log groups> /aws/lambda/language-detection-from-image监控日志。

  23. 点击流并选择最新的一个。检测到的语言将在日志中打印出来,如下面的截图所示:

![图 2.18 – 用于验证输出的 CloudWatch 中的日志图片链接

图 2.18 – 用于验证输出的 CloudWatch 中的日志

重要提示

建议在生产环境中使用批量操作,如BatchDetectSentimentBatchDetectDominantLanguage。这是因为单个 API 操作可能会导致 API 级别的限制。更多详细信息请参阅docs.aws.amazon.com/comprehend/latest/dg/functionality.html

在本节中,我们学习了如何使用 Amazon Comprehend 来检测文本的语言。文本是通过 Amazon Rekognition 提取到我们的 Lambda 函数中的。在下一节中,我们将学习如何通过 Amazon Translate 将相同的文本翻译成英语。

使用 Amazon Translate 翻译文档

大多数时候,人们更喜欢用他们自己的语言进行交流,即使在数字平台上也是如此。Amazon Translate 是一种文本翻译服务。我们可以提供各种语言的文档或文本字符串,并将其翻译成不同的语言。它使用预训练的深度学习技术,所以我们不需要担心模型,也不需要担心它们的管理。我们可以发起 API 请求并获取结果。

Amazon Translate 的常见用途包括以下内容:

  • 如果有组织范围内的需求需要用不同的语言准备文档,那么 Translate 就是将一种语言转换为多种语言的解决方案。

  • 在线聊天应用可以实时翻译,以提供更好的客户体验。

  • 将网站内容快速且经济地本地化到更多语言。

  • 一旦翻译成不同的语言,情感分析可以应用于不同的语言。

  • 为新闻发布网站提供非英语语言支持。

接下来,我们将探讨 Amazon Translate 的好处。

探索 Amazon Translate 的好处

使用 Amazon Translate 的一些好处包括以下内容:

  • 它使用神经机器翻译,模仿人类大脑的工作方式。

  • 无需维护您的资源。

  • 产生高质量的成果并保持其一致性。

  • 您可以自定义品牌名称和模型名称,以及任何其他独特术语都使用自定义术语功能进行翻译。

  • 可以通过 API 轻松集成到应用程序中。

  • 当您需要 Amazon Translate 做更多工作时,它会自动扩展。

接下来,我们将亲身体验 Amazon Translate。

亲身体验 Amazon Translate

在本节中,我们将通过将 AWS Lambda 与 Amazon Rekognition、Amazon Comprehend 和 Amazon Translate 集成来构建一个产品,以读取存储在 S3 桶中的图像文件。然后,我们将检测从图像中提取的文本的语言,以便将其翻译成英语。我们还将使用 CloudWatch 来打印翻译后的输出。以下是我们用例的示意图:

图 2.19 – 所需用例的架构图

图 2.19 – 所需用例的架构图

让我们从创建 IAM 角色开始:

  1. 导航到 IAM 控制台页面。

  2. 从左侧菜单中选择角色

  3. 选择创建角色

  4. 选择Lambda作为受信任实体。

  5. 添加以下管理策略:

    • AmazonS3ReadOnlyAccess

    • AmazonRekognitionFullAccess

    • ComprehendFullAccess

    • CloudWatchFullAccess

    • TranslateFullAccess

  6. 将角色保存为language-translation-from-image

  7. 下一个直接步骤是创建一个 Lambda 函数。导航到Lambda > 函数 > 创建函数

  8. 将函数命名为language-detection-from-image

  9. 将运行时设置为Python 3.6

  10. 使用现有的角色;即language-detection-from-image-role

  11. 将可用的代码粘贴到github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/blob/master/Chapter-2/Amazon%20Translate%20Demo/lambda_function/lambda_function.py,并点击translate_text API 来翻译输入文本。

  12. 下一步是创建一个名为language-translation-from-image的桶。

    创建一个名为image的文件夹。然后,导航到属性 > 事件 > 添加通知

  13. 填写所需的字段,如此处所示,并点击.jpg作为后缀;否则,它将触发 lambda 函数的任何对象创建过程):

    • All object create events

    • image/

    • .jpg

    • Lambda Function

    • language-translation-from-image

  14. sign-image.jpg图片导航到文件夹中。此文件可在本书的 GitHub 存储库中找到:github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-2/Amazon%20Translate%20Demo/input_image

  15. 上传此图片将触发 lambda 函数。您可以通过访问CloudWatch> CloudWatch Logs> Log groups> /aws/lambda/language-translation-from-image来监控日志。

  16. 点击流并选择最新的一个。它看起来如下:

![图 2.20 – 用于验证输出的 CloudWatch 中的日志

![img/B16735_02_020.jpg]

图 2.20 – 用于验证输出的 CloudWatch 中的日志

翻译如下:

Translation of the text from the Image :   
{'PREVENCION DEL COVID-19': 'PREVENTION OF COVID-19', 
'LAVATE LAS MANOS EVITA EL CONTACTO NO TE TOQUES oJOs, 
EVITA': 'WASHE HANDS AVOID CONTACT DO NOT TOUCH EYES', 
'60 SEGUNDOS CON CONTAGIADOS NARIZ O BOCA 
AGLOMERACIONES': '60 SECONDS WITH CONTAGIOUS NOSE OR 
MOUTH AGGLOMERATIONS', 'NO COMPARTAS NO VIAJES A MENOS 
SI TE PONES ENFERMO': "DON'T SHARE NOT TRAVEL UNLESS 
YOU GET SICK", 'CUBIERTOS NI COMIDA QUE SEA NECESARIO 
BUSCA AYUDA MEDICA': 'CUTLERY OR FOOD NEEDED SEEK 
MEDICAL HELP'}

重要提示

对于生产用例,如果您有依赖服务或服务链,建议使用 AWS Lambda 与 AWS Step Function 一起使用。

不建议使用相同的 S3 存储桶来存储输入和输出对象。在同一个存储桶中创建输出对象可能会触发递归 Lambda 调用。如果您正在使用相同的存储桶,我们建议您使用前缀和后缀来触发事件。同样,我们建议使用前缀来存储输出对象。

在本节中,我们学习了如何组合多个服务并将它们的输出链接起来以实现特定的用例结果。我们学习了如何集成 Amazon Rekognition 来检测图像中的文本。然后,我们可以使用 Amazon Comprehend 来检测语言。然后,我们使用相同的输入并在 Amazon Translate 的帮助下将其翻译成英语。然后将翻译后的输出打印在 CloudWatch 日志中进行验证。在下一节中,我们将了解 Amazon Textract,我们可以使用它从文档中提取文本。

使用 Amazon Textract 从文档中提取文本

手动从文档中提取信息是缓慢的、昂贵的且容易出错。传统的光学字符识别软件需要大量的定制,并且仍然会给出错误的结果。为了避免这样的手动过程和错误,您应该使用Amazon Textract。通常,我们将文档转换为图像,以便在图像中的文本周围检测边界框。然后我们应用字符识别技术来读取文本。Textract 为您完成所有这些工作,并且还以最小的努力为您提取文本、表格、表单和其他数据。如果您从 Amazon Textract 获得低置信度结果,那么 Amazon A2I 是最好的解决方案。

Textract 减少了从数百万扫描的文档页中提取文本的手动工作量。一旦信息被捕获,可以对文本采取行动,例如将其存储在不同的数据存储中,分析情感或搜索关键词。以下图表显示了 Amazon Textract 的工作原理:

![图 2.21 – Amazon Textract 的块图表示及其存储输出方式图片

图 2.21 – Amazon Textract 的块图表示及其存储输出方式

Amazon Textract 的常见用途包括以下内容:

  • 记录提取表格或表单的处理工作流程。

  • 使用 Amazon Elasticsearch 从文档中创建搜索索引。

  • 在工作流程中删除个人可识别信息;Textract 自动识别数据类型和表单标签。

接下来,我们将探索 Amazon Textract 的优势。

探索 Amazon Textract 的优势

使用 Textract 有几个原因,如下所述:

  • 零基础设施成本。

  • 全托管服务(减少开发和管理工作量)。

  • 帮助您提取结构化和非结构化数据。

  • 可以分析手写评论。

  • Amazon Textract 的性能优于使用扁平词袋的 OCR 应用程序。

  • 接下来,我们将亲自动手使用 Amazon Textract。

亲自动手使用 Amazon Textract

在本节中,我们将使用 Amazon Textract API 从我们的 S3 存储桶中读取一个图像文件,并在 Cloudwatch 上打印 "FORM" 详细信息。这些信息可以以您希望的格式存储在 S3 中以供进一步使用,也可以存储在 DynamoDB 中作为键值对。让我们开始吧:

  1. 首先,创建一个名为 textract-use-case-role 的 IAM 角色,并具有以下策略。这将允许 Lambda 函数执行,以便它可以读取 S3,使用 Amazon Textract,并在 CloudWatch 日志中打印输出:

    • CloudWatchFullAccess

    • AmazonTextractFullAccess

    • AmazonS3ReadOnlyAccess

  2. 让我们创建一个名为 textract-document-analysis 的 S3 存储桶,并上传 receipt.png 图像文件。这将用于包含将要提取的表单详细信息。图像文件可在以下位置找到:github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-2/Amazon%20Textract%20Demo/input_doc:![图 2.22 – 已将图像 (.png) 文件上传到输入文件夹的 S3 存储桶 图片

    图 2.22 – 已将图像 (.png) 文件上传到输入文件夹的 S3 存储桶

  3. 下一步是创建一个名为 read-scanned-doc 的 Lambda 函数,如图所示,使用现有的执行角色 textract-use-case-role:![图 2.23 – AWS Lambda 创建函数对话框 图片

    图 2.23 – AWS Lambda 创建函数对话框

  4. 函数创建完成后,粘贴以下代码并部署。向下滚动到 Amazon Textract 的 analyze_document API,通过 API 的 FeatureTypes 参数获取 "表和表单" 详细信息:

    import boto3
    import time
    from trp import Document
    textract_client=boto3.client('textract')
    
    def lambda_handler(event, context): 
        print("- - - Amazon Textract Demo - - -") 
        # read the bucket name from the event 
        name_of_the_bucket=event['Records'][0]['s3']['bucket'] ['name'] 
        # read the object from the event 
        name_of_the_doc=event['Records'][0]['s3']['object']['key']
        print(name_of_the_bucket)
        print(name_of_the_doc)
        response = 
    textract_client.analyze_document(Document={'S3Object': 
    {'Bucket': name_of_the_bucket,'Name': 
    name_of_the_doc}},FeatureTypes=["TABLES","FORMS"])
        print(str(response))
        doc=Document(response)
        for page in doc.pages:
            # Print tables
            for table in page.tables:
                for r, row in enumerate(table.rows):
                    for c, cell in enumerate(row.cells):
                        print("Table[{}][{}] = 
    {}".format(r, c, cell.text))
        for page in doc.pages:
            # Print fields
            print("Fields:")
            for field in page.form.fields:
                print("Key: {}, Value: 
    {}".format(field.key, field.value))
    

    与前面的示例不同,我们将创建一个测试配置来运行我们的代码。

  5. 点击 测试 按钮左侧的下拉菜单。

  6. 选择配置测试事件并选择创建新测试事件

  7. 事件模板下拉菜单中选择Amazon S3 Put

  8. 在 JSON 体中,根据我们的存储桶名称和键更改突出显示的值,如图所示:图 2.24 – 测试 lambda 函数的事件模板

    图 2.24 – 测试 lambda 函数的事件模板

  9. TextractDemo中。

  10. 点击保存

  11. 选择您的测试配置(TextractDemo)并点击测试图 2.25 – 在运行测试之前选择测试配置

    图 2.25 – 在运行测试之前选择测试配置

  12. 这将触发 lambda 函数。您可以从CloudWatch> CloudWatch 日志>日志组> /aws/lambda/ read-scanned-doc监控日志。

  13. 点击流并选择最新的一个。它看起来如下;以下屏幕截图可以看到键值对:

图 2.26 – CloudWatch 中的日志以验证输出

图 2.26 – CloudWatch 中的日志以验证输出

重要提示

通过生成 AWS 预签名 URL,然后将其提供给您的移动或 Web 应用程序用户,这是生成 S3 Put 事件以通过 Lambda 异步调用下游 AI 工作流程的最可扩展和最具成本效益的方式。这种方法可以同时为许多用户提供服务,并可能提高性能和吞吐量。

考虑为您的 AWS AI 服务和 S3 存储桶使用相同的区域可能会提高性能并减少网络延迟。AWS VPC 端点可以在不使用公共互联网的情况下利用增强的安全性。您可以将 AWS AI 结果存储在 AWS S3 存储桶中,并对其他数据进行加密以获得更好的安全性。

在本节中,我们学习了如何从扫描的文档中提取文本并将表单数据打印出来。与其他部分不同,我们通过创建包含事件模板的测试配置来使用 lambda 函数的测试功能。在下一节中,我们将学习为组织创建聊天机器人以及如何使用它。

在 Amazon Lex 上创建聊天机器人

Alexa 中大多数可用的功能都是由Amazon Lex驱动的。您可以使用 Amazon Lex 轻松构建聊天机器人。它在幕后使用自然语言理解和自动语音识别。通过 SLU,Amazon Lex 将自然语言语音和文本输入,理解意图,并满足用户的意图。Amazon Lex 机器人可以从控制台或通过 API 创建。其基本要求将在下面的图中展示。

Amazon Lex 的一些常见用途包括以下内容:

  • 既能听又能接收文本输入的应用。

  • 聊天机器人。

  • 对话式人工智能产品,以提供更好的客户和销售体验。

  • 为通过 AWS Lambda 函数提供帮助而创建的自定义业务机器人。

  • 为您的呼叫中心提供语音助手,它可以与用户交谈、安排会议或请求您的账户详情。

  • 通过与 Amazon Cognito 集成,您可以控制用户管理、身份验证和跨所有设备的同步。

接下来,我们将探索 Amazon Lex 的优势。

探索 Amazon Lex 的优势

使用 Lex 的一些原因包括以下内容:

  • 机器人可以直接在 AWS 管理控制台中构建和测试。这些机器人可以通过其丰富的格式化功能轻松集成到 Facebook Messenger、Slack 和 Twilio SMS。

  • 对话记录可以存储在 Amazon CloudWatch 中进行进一步分析。您可以使用它们来监控您的机器人并从中获得见解,以改善用户体验。

  • Amazon Lex 可以集成到其他 AWS 服务中,例如 Amazon Cognito、AWS Lambda、Amazon DynamoDB、Amazon CloudWatch 和 AWS Mobile Hub,以利用 AWS 平台上的应用安全、监控、用户身份验证、业务逻辑、存储和移动应用开发。

  • Amazon Lex 聊天机器人也可以集成到您的自定义 Web 应用程序中。您只需构建一个聊天机器人小部件并将其集成到您的 UI 中。

接下来,我们将亲身体验 Amazon Lex。

亲身体验 Amazon Lex

让我们开始吧:

  1. 登录到console.aws.amazon.com/lex/

  2. 点击开始并选择自定义机器人

  3. 填写以下详细信息并点击创建:![图 2.27 – Amazon Lex 的创建对话框

    ![img/B16735_02_027.jpg]

    图 2.27 – Amazon Lex 的创建对话框

  4. 点击创建意图。将出现一个对话框。选择创建意图

  5. 将新的意图命名为MovieIntent并点击添加

  6. 前往movie_type

  7. 插槽类型:AMAZON.Genre

  8. 提示:你喜欢哪部电影?

  9. 点击movie_type是我的变量:![图 2.28 – 样例表述部分

    ![img/B16735_02_028.jpg]

    图 2.28 – 样例表述部分

  10. 滚动到响应部分以添加消息:![图 2.29 – Amazon Lex 的响应部分

    ![img/B16735_02_029.jpg]

    图 2.29 – Amazon Lex 的响应部分

  11. 滚动到保存意图并点击构建。在成功构建提示后,将显示以下成功消息:![图 2.30 – Amazon Lex 的响应部分

    ![img/B16735_02_030.jpg]

    图 2.30 – Amazon Lex 的响应部分

  12. 现在,您可以测试您的机器人,如下截图所示:

![图 2.31 – 测试机器人的对话

![img/B16735_02_031.jpg]

图 2.31 – 测试机器人的对话

重要提示

并非所有 Amazon Polly 功能都在 Alexa 中可用 – 尤其是 Amazon Polly SSML 功能 – 这使得 Amazon Polly 和 Alexa 有所不同。

这就结束了本章对各种可用的 AWS 应用服务的介绍。

摘要

在本章中,我们了解了一些 AWS AI 服务,这些服务可以用来解决各种问题。我们使用了 Amazon Rekognition 服务,它可以检测对象和面部(包括名人面部),还可以从图像中提取文本。对于文本到语音,我们使用了 Amazon Polly,而对于语音到文本,我们使用了 Amazon Transcribe。在本章的末尾,我们在 Amazon Lex 中构建了一个聊天机器人。

对于图像中的语言检测和翻译,我们使用了 Amazon Rekognition、Amazon Comprehend 和 Amazon Translate。我们学习了如何将它们组合成一个 Lambda 函数来解决我们的问题。

对于认证考试,您不需要记住本章中我们使用的所有 API。可能会有关于我们学习的一些最佳实践的问题,或者关于解决特定问题的服务名称的问题。始终练习使用这些 AWS AI 服务是很好的,因为它将增强您的架构技能。

在下一章中,我们将学习数据准备和转换,这是机器学习最重要的方面。

问题

  1. 使用预定义的逻辑和规则向在线购物者推荐产品是一个机器学习的例子。

    a. 真的

    b. 假的

  2. 机器学习堆栈的哪个级别可以帮助您构建自定义 ML 模型而不需要管理基础设施?

    a. 最高级别(AI 服务)

    b. 中间级别(Amazon SageMaker)

    c. 最低级别(机器学习框架和基础设施)

    d. 您自己的基础设施和代码级别

  3. 你可以用 Amazon Textract 做什么?

    a. 在文档中检测键值对

    b. 为文本提取构建自定义 ML 模型

    c. 发送低置信度分数的文本提取以供人工审查

    d. 将检测到的文本翻译成英语

  4. 使用 Amazon Comprehend,可以训练一个新的模型来帮助您从文本中提取自定义实体。

    a. 假的

    b. 真的

  5. 以下哪项是 Amazon Comprehend 设计用于分析的数据类型示例?

    a. 社交媒体帖子

    b. 表格中的数据

    c. 日志文件

    d. GPS 数据

    答案

    对于日志文件,我们可以使用 CloudWatch 日志洞察。

  6. 当调用 DetectKeyPhrases API 时,以下哪项不是 Amazon Comprehend 返回的内容?

    a. 关键短语

    b. 每个关键短语的数量

    c. 每个关键短语的确信度水平

    d. 每个关键短语的情绪

    答案

    这与情绪无关。

  7. 你想创建一个 Lex 机器人来帮助你订购披萨。为什么在意图配置中添加槽位很重要?

    a. 因此您可以定制不同尺寸和配料的不同披萨订单。

    b. 因此您可以考虑到您可能传达订购披萨意图的不同方式。

    c. 以便自动为您设置 lambda 函数来满足意图。

  8. 假设你负责构建一个分析客户聊天情绪的系统。你应该与 Amazon Lex 集成哪个服务来完成这项工作?

    a. Amazon Transcribe

    b. Amazon Comprehend

    c. Amazon Translate

    d. Amazon Textract

  9. 在哪种情况下,Amazon Lex 的回退意图会有帮助?

    a. 当用户订购披萨,但由于背景噪音,机器人需要用户重复他们所说的话时。

    b. 当机器人必须使用与用户的先前交流来假装理解用户的不清楚信息时。

    c. 当机器人被问到它没有编程回答的问题时。

    答案

    回退意图是为了那些机器人不期望的输入。

  10. 以下哪三个选项是 Amazon Textract 可以处理而传统 OCR 方法无法处理的?

    a. 从文档中提取单词和行

    b. 在不使用任何模板的情况下从文档中提取表单(键/值)

    c. 处理非文本内容,如单选按钮和复选框

    d. 保留存储在表格中的数据组成

  11. 将 Amazon Textract 与 Amazon A2I(人工审查)集成的以下哪个是常见用例?

    a. 您想从图像或 PDF 文档中识别表单标签和值。

    b. 您正在从需要因监管要求或敏感业务决策而进行审查的文档中提取数据。

    c. 您的文档中有表格,您需要保留存储在这些表格中的数据组成。

  12. 您正在尝试从文档中提取表单或表格数据。由于您的使用对延迟敏感,例如移动捕获,您需要同步执行此操作。您应该使用哪个 API?

    a. 分析文档

    b. 检测文档文本

    c. 开始文档分析

    d. 获取文档文本检测

答案

1. B

2. B

3. A, C

4. B

5. A

6. D

7. A

8. B

9. C

10. B, C, D

11. B

12. A

第二部分:数据工程和探索性数据分析

本节描述了如何为机器学习准备数据。它解释了根据每种变量的不同类型,数据操作和转换的不同技术。此外,它还涵盖了缺失数据和异常值的处理。

本节包含以下章节:

  • 第三章**,数据准备和转换

  • 第四章**,理解和可视化数据

  • 第五章**,AWS 数据存储服务

  • 第六章**,AWS 数据处理服务

第三章 数据准备和转换

你可能听说过数据科学家大部分时间都在从事与数据准备相关的活动。现在是时候解释为什么会这样,以及我们谈论的是哪些类型的活动了。

在本章中,你将学习如何处理分类和数值特征,以及应用不同的技术来转换你的数据,例如独热编码、二进制编码器、顺序编码、分箱和文本转换。你还将学习如何处理数据中的缺失值和异常值,这两个任务对于构建良好的机器学习模型至关重要。

本章我们将涵盖以下主题:

  • 识别特征类型

  • 处理分类特征

  • 处理数值特征

  • 理解数据分布

  • 处理缺失值

  • 处理异常值

  • 处理不平衡数据集

  • 处理文本数据

这是一个篇幅较长的章节,所以请耐心等待!详细了解这些主题将肯定让你在 AWS 机器学习专业考试中处于有利位置。

识别特征类型

在不知道特征是什么以及它可能存储哪种类型的信息之前,我们无法开始建模。你已经阅读了关于处理特征的不同的过程。例如,你知道特征工程与构建和准备特征到模型的任务相关;你也知道特征选择与选择最佳特征集以供特定算法使用的任务相关。这两个任务有一个共同的行为:它们可能根据它们处理的特征类型而变化。

理解这种行为(特征类型与适用的转换)非常重要,因为它将帮助你消除考试中的无效答案(最重要的是,你将成为一名更好的数据科学家)。

当我们提到特征类型时,我们指的是特定特征应该存储的数据类型。以下图表展示了我们如何潜在地描述模型的不同特征类型:

![图 3.1 – 特征类型

![img/B16735_03_001.jpg]

图 3.1 – 特征类型

第一章**,机器学习基础中,你已了解到前面图表中展示的特征分类。现在,让我们看看一些真实示例,以便消除你可能存在的任何疑问:

![图 3.2 – 特征值的真实示例

![img/B16735_03_002.jpg]

图 3.2 – 特征值的真实示例

虽然查看变量的值可能有助于您找到其类型,但您绝不应该只依赖这个方面。变量的性质对于做出这样的决定也非常重要。例如,有人可以将云服务提供商变量(如前表所示)编码如下:1(AWS),2(MS),3(Google)。在这种情况下,变量仍然是一个名义特征,即使它现在由离散数字表示。

如果您正在构建机器学习模型,并且没有告诉您的算法这个变量不是一个离散数字,而是一个名义变量,那么算法将把它当作一个数字处理,模型将不再可解释。

重要提示

在将任何机器学习算法与数据结合之前,请确保您的特征类型已经被正确识别。

理论上,如果您对您的特征满意并且已经正确地对每个特征进行了分类,您应该准备好进入 CRISP-DM 方法的建模阶段,不是吗?好吧,也许不是。即使您已经正确地分类了特征,您可能还有很多原因想要在数据准备上花费更多的时间:

  • 一些算法实现,如scikit-learn,可能不接受您的分类特征上的字符串值。

  • 您变量的数据分布可能不是您算法的最优分布。

  • 您的机器学习算法可能会受到您数据规模的影响。

  • 您的变量的一些观测值(行)可能缺少信息,您将不得不修复它们。这些也被称为缺失值。

  • 您可能会发现变量的异常值,这些异常值可能会给您的模型带来潜在的偏差。

  • 您的变量可能存储着不同类型的信息,而您可能只对其中的一些感兴趣(例如,日期变量可以存储星期几或月份的哪一周)。

  • 您可能希望为文本变量找到一个数学表示。

  • 并且相信我,这个列表永远不会结束。

在接下来的章节中,我们将了解如何解决所有这些问题,从分类特征开始。

处理分类特征

对于分类特征的数据转换方法将根据您变量的子类型而有所不同。在接下来的章节中,我们将了解如何转换名义和有序特征。

转换名义特征

在应用机器学习算法之前,您可能需要创建您分类特征的数值表示。一些库可能已经内置了处理这种转换的逻辑,但大多数都没有。

我们将要介绍的第一种转换方法被称为标签编码。标签编码器适用于分类/名义变量,它将为您的变量的每个不同的标签分配一个数字。以下表格显示了标签编码器是如何工作的:

图 3.3 – 标签编码器在作用中

图 3.3 – 标签编码器在作用中

标签编码器将始终确保每个不同的标签都关联一个唯一的数字。在前面的表格中,尽管“印度”出现了两次,但它被分配了相同的数字。

您现在有了每个国家的数值表示,但这并不意味着您可以在模型中使用这种数值表示!在这个特定的情况下,我们正在转换一个没有顺序的命名特征。

根据前面的表格,如果我们将国家变量的编码版本传递给模型,它将做出诸如“巴西(3)大于加拿大(2)”这样的假设,这是没有意义的。

对于这种情况的一个可能解决方案是在"国家"上应用另一种类型的转换:独热编码。这种转换将表示原始特征中的所有类别作为单独的特征(也称为虚拟变量),这将存储每个类别的“存在或不存在”。以下表格正在转换我们在前面表格中查看的相同信息,但这次它正在应用独热编码:

![图 3.4 – 独热编码的实际应用

![图片/B16735_03_004.jpg]

图 3.4 – 独热编码的实际应用

我们现在可以使用国家变量的独热编码版本作为机器学习模型的特征。然而,作为一名怀疑论的数据科学家,您的工作永远不会结束,您的批判性思维能力将在 AWS 机器学习专业考试中得到考验。

假设您的数据集中有 150 个不同的国家。您会想出多少个虚拟变量?150 个,对吧?这里,我们刚刚发现一个潜在问题:除了增加模型的复杂性(这绝不是任何模型所期望的特性)之外,虚拟变量还会给您的数据增加稀疏性

稀疏数据集有很多变量填充了零。通常,很难将这种数据结构拟合到内存中(您很容易耗尽内存),并且对于机器学习算法来说,处理稀疏结构非常耗时。

您可以通过将原始数据分组并减少类别数量来绕过稀疏性问题,甚至可以使用自定义库来压缩稀疏数据,使其更容易操作(例如,Python 中的scipy.sparse.csr_matrix)。

因此,在考试期间,请记住,当您需要将分类/名义数据转换为供机器学习模型使用时,独热编码绝对是正确的做法;然而,考虑到您原始特征中唯一类别的数量,并思考是否为所有这些类别创建虚拟变量是有意义的(如果您有非常多的唯一类别,可能并不合理)。

应用二进制编码

对于具有更多唯一类别的变量类型,创建它们的数值表示的一个潜在方法是应用二进制编码。在这种方法中,目标是把一个分类列转换成多个二进制列,但最小化新列的数量。

这个过程包括三个基本步骤:

  1. 分类数据在通过序数编码器后转换为数值数据。

  2. 然后将得到的数字转换为二进制值。

  3. 二进制值被分割成不同的列。

让我们重用我们的图 3.3中的数据来查看我们如何在这个特定情况下使用二进制编码:

图 3.5 – 二进制编码的实际应用

图 3.5 – 二进制编码的实际应用

如我们所见,我们现在有三个列(Col1、Col2 和 Col3),而不是四个。

转换序数特征

序数特征有一个非常具体的特征:它们有顺序。因为它们具有这种特性,所以对它们应用独热编码是没有意义的;如果你这样做,你将失去特征的顺序大小。

这种类型变量的最常见转换方法被称为序数编码。序数编码器将每个变量的不同标签与一个数字相关联,就像标签编码器一样,但这次,它将尊重每个类别的顺序。以下表格显示了序数编码器是如何工作的:

图 3.6 – 序数编码的实际应用

图 3.6 – 序数编码的实际应用

我们现在可以将编码后的变量传递给机器学习模型,它们将能够正确地处理这个变量,无需应用独热编码转换。这次,比较如“高级数据分析师大于初级数据分析师”是完全有意义的。

避免在训练和测试数据集中产生混淆

不要忘记以下声明:编码器是在训练数据上拟合的,在测试和生产数据上转换的。这就是你的机器学习管道应该如何工作。

假设你已经创建了一个适合图 3.3数据的独热编码器,并返回根据图 3.4的数据。在这个例子中,我们将假设这是我们的训练数据。一旦你完成了训练过程,你可能想要将相同的独热编码转换应用到你的测试数据上,以检查模型的结果。

在我们刚才描述的场景中(这在建模管道中是一个非常常见的情况),你不能在测试数据上重新训练你的编码器!你应该只是重用你在训练数据上创建的之前的编码器对象。技术上,我们说你不应该再次使用fit方法,而应该使用transform方法。

你可能已经知道为什么你应该遵循这个规则的原因,但让我们回顾一下:测试数据是为了提取你模型的性能指标而创建的,所以你不应该用它来提取任何其他知识。如果你这样做,你的性能指标将会受到测试数据的影响,你无法推断出相同的性能(在测试数据中显示)在生产环境中(当新数据到来时)很可能发生。

好的,到目前为止一切顺利。但是,如果我们测试集中有一个训练集中没有的新类别,我们该如何转换这些数据呢?让我们来分析这个特定场景。

回到我们之前在 图 3.3(输入数据)和 图 3.4(输出数据)中看到的 one-hot 编码示例,我们的编码器知道如何转换以下国家:澳大利亚、巴西、加拿大和印度。如果我们测试集中有其他国家,编码器将不知道如何转换它,这就是为什么我们需要定义它在有异常情况下的行为。

大多数机器学习库都为这些情况提供了特定的参数。在我们的例子中,我们可以编程编码器在虚拟变量上引发错误或设置所有为零,如下表所示:

图 3.7 – 在 one-hot 编码转换中处理未知值

图 3.7 – 在 one-hot 编码转换中处理未知值

如我们所见,葡萄牙没有出现在训练集中(图 3.3),因此在转换过程中,我们保持相同的已知国家列表,并说葡萄牙不是其中任何一个(所有为零)。

作为我们知道的非常优秀、持怀疑态度的数据科学家,你应该担心这样一个事实,即你有一个在训练过程中没有使用过的特定类别吗?好吧,也许吧。这种分析类型真的取决于你的问题领域。

处理未知值是非常常见的事情,也是你在机器学习流程中应该预期要做的事情。然而,你也应该问自己,由于你在训练过程中没有使用那个特定的类别,你的模型是否可以被外推和泛化。

记住,你的测试数据必须遵循与你的训练数据相同的数据分布,你很可能在训练或测试集中找到所有(或至少大多数)类别(分类特征的类别)。此外,如果你面临过拟合问题(在训练中表现良好,但在测试集中表现不佳),同时你意识到你的分类编码器在测试集中转换了大量的未知值,猜猜看?很可能你的训练和测试样本没有遵循相同的分布,这完全无效化了你的模型。

正如你所见,我们正逐渐接近目标。我们正在详细讨论偏差和调查策略!现在,让我们继续前进,看看对数值特征进行转换。是的,每种类型的数据都很重要,并驱动着你的决策!

处理数值特征

在数值特征(离散和连续)方面,我们可以考虑依赖于训练数据的转换,以及其他仅依赖于被转换的观察的转换。

那些依赖于训练数据的将使用训练集在fit期间学习必要的参数,然后使用它们来转换任何测试或新数据。逻辑基本上与我们刚才讨论的分类特征相同;然而,这次,编码器将学习不同的参数。

另一方面,那些纯粹依赖于观察的算法不关心训练集或测试集。它们将简单地在一个单独的值上执行数学计算。例如,我们可以通过平方其值来对一个特定变量应用指数转换。这里没有依赖任何地方学习到的参数——只需获取值并平方它即可。

到目前为止,你可能已经在想针对数值特征的成百上千种可用的转换了!确实,选项如此之多,我们无法在这里全部描述,而且对于 AWS 机器学习专业考试,你也不需要知道所有这些。在这里,我们将介绍最重要的(对于考试而言)一些,但我不想限制你的建模技能:花点时间想想,根据你的用例创建自定义转换,你有多少无限的选择。

数据标准化

应用数据标准化意味着改变数据的规模。例如,你的特征可能存储员工年薪,范围在每年 20,000 到 200,000 美元之间,而你希望将这些数据放入 0 到 1 的范围内,其中 20,000(观察到的最小值)将被转换为 0,200,000(观察到的最大值)将被转换为 1。

这种技术在你想将训练数据适配到受底层数据规模/幅度影响的特定类型算法上时尤为重要。例如,我们可以考虑那些使用输入变量点积(如神经网络或线性回归)的算法,以及那些依赖于距离度量的算法(如k-最近邻KNN)或k-均值)。

另一方面,应用数据标准化不会提高基于规则的算法(如决策树)的性能,因为它们将能够检查特征的可预测性(无论是通过还是信息增益分析),而不管数据的规模如何。

重要提示

我们将在本书的后续章节中学习这些算法,以及相关的细节。例如,你可以查看熵和信息增益作为决策树用来检查特征重要性的两种度量。了解每个特征的预测能力有助于算法定义树的根节点、中间节点和叶节点。

让我们花点时间来理解为什么数据归一化将有助于那些类型的算法。我们已经知道,聚类算法的目的是在你的数据中找到组或簇,而最常用的聚类算法之一就是 k-means。我们将使用 k-means 来观察这个问题在实际中的应用,因为它受到数据缩放的影响。

以下图像显示了变量的不同尺度如何改变超平面的投影:

![图 3.8 – 在超平面中绘制不同尺度的数据]

![图 B16735_03_008.jpg]

图 3.8 – 在超平面中绘制不同尺度的数据

在前面的图像的左侧,我们可以看到一个数据点在三维(x,y,z)的超平面中绘制。所有三个维度(也称为特征)都被归一化到 0 和 1 的尺度。在右侧,我们可以看到相同的数据点,但这次“x”维度没有被归一化。我们可以清楚地看到超平面已经改变了。

在实际场景中,我们会有更多的维度和数据点。数据尺度的差异会改变每个簇的中心,并可能改变某些点的分配簇。同样的问题也会出现在依赖于距离计算的算法中,如 KNN。

其他算法,如神经网络和线性回归,将使用您的输入数据计算加权总和。通常,这些类型的算法将执行如 W1X1 + W2X2 + WiXi* 的操作,其中 XiWi 分别指代特定的特征值及其权重。再次,我们将在后面的章节中详细讲解神经网络和线性模型,但你能仅通过查看我们刚才描述的计算过程就看出数据缩放问题吗?如果 X(特征)和 W(权重)是很大的数字,我们很容易得到非常大的值。这将使算法的优化变得更加复杂。

我希望你现在对为什么应该应用数据归一化(以及何时不应应用)有了很好的理解。数据归一化通常在机器学习库中作为 Min Max Scaler 实现。如果你在考试中遇到这个术语,那么请记住它与数据归一化是相同的。

此外,数据归一化不一定需要将你的特征转换到 0 和 1 的范围内。实际上,我们可以将特征转换到我们想要的任何范围内。以下是对归一化的正式定义:

![图 3.9 – 归一化公式]

![图 B16735_03_009.jpg]

图 3.9 – 归一化公式

在这里,Xmin 和Xmax 是范围的上下限值;X是特征的值。除了数据归一化外,还有另一个非常重要的关于数值转换的技术,您必须了解,这不仅是为了考试,也是为了您的数据科学职业生涯。我们将在下一节中探讨这一点。

数据标准化

数据标准化是另一种缩放方法,它转换数据的分布,使得均值变为零,标准差变为一。以下图像正式描述了这种缩放技术,其中X代表要转换的值,µ指的是X的均值,σX的标准差:

图 3.10 – 标准化公式

图 3.10 – 标准化公式

与归一化不同,数据标准化不会产生预定义的值范围。相反,它将您的数据转换成标准的高斯分布,其中您的转换值将代表每个值与分布均值的标准差数。

重要提示

高斯分布,也称为正态分布,是统计模型中最常用的分布之一。这是一个具有两个主要控制参数的连续分布:µ(均值)和σ(标准差)。正态分布围绕均值对称。换句话说,大多数值将接近分布的均值。

数据标准化通常被称为z 分数,广泛用于识别变量的异常值,我们将在本章后面看到。为了演示,以下表格模拟了一个小数据集的数据标准化。输入值位于“年龄”列中,而缩放值位于“Z 分数”列中:

图 3.11 – 数据标准化过程

图 3.11 – 数据标准化过程

在 AWS 机器学习专业考试中,确保你在手动应用归一化和标准化时充满信心。他们可能会提供一个值列表,以及均值和标准差,并询问列表中每个元素的缩放值。

应用分箱和离散化

分箱是一种技术,可以将一组值分组到一个桶或箱中;例如,将 0 到 14 岁之间的人分组到名为“儿童”的桶中,将 15 到 18 岁之间的人分组到名为“青少年”的桶中,依此类推。

离散化是将连续变量转换为离散或名义属性的过程。这些连续值可以通过多种策略进行离散化,例如等宽等频

等宽策略将数据分布在多个相同宽度的桶中。等频策略将数据分布在具有相同频率的多个桶中。

让我们来看一个例子。假设我们有一个包含 16 个数字的列表:10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 90。正如我们所见,这个列表的范围在 10 到 90 之间。如果我们想使用等宽策略创建四个区间,我们会得到以下区间:

  • 区间 >= 10 <= 30 > 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24

  • 区间 > 30 <= 50 >

  • 区间 > 50 <= 70 >

  • 区间 > 71 <= 90 > 90

在这种情况下,每个区间的宽度相同(20 个单位),但观察值并不均匀分布。现在,让我们模拟一个等频率策略:

  • 区间 >= 10 <= 13 > 10, 11, 12, 13

  • 区间 > 13 <= 17 > 14, 15, 16, 17

  • 区间 > 17 <= 21 > 18, 19, 20, 21

  • 区间 > 21 <= 90 > 22, 23, 24, 90

在这种情况下,所有区间都有相同的观察频率,尽管它们是通过不同的区间宽度构建的,以实现这一点。

一旦你计算出了你的区间,你可能想知道下一步是什么,对吧?在这里,你有一些选择:

  • 你可以为你的区间命名,并将它们用作模型上的名义特征!当然,作为一个名义变量,你应该在将数据输入机器学习模型之前考虑应用独热编码。

  • 你可能想要对你的区间进行排序并用作有序特征。

  • 可能你想通过取每个区间的最小值和最大值的平均值来去除特征中的噪声,并使用这个值作为你的变换特征。

看看以下表格,了解这些方法使用我们的等频率示例:

图 3.12 – 处理区间和离散化的不同方法

图 3.12 – 处理区间和离散化的不同方法

再次,尝试不同的区间划分策略会得到不同的结果,你应该分析/测试最适合你数据集的最佳方法。这里没有标准答案——一切都关于数据探索!

应用其他类型的数值变换

归一化和标准化依赖于你的训练数据来调整它们的参数:在归一化情况下是最小值和最大值,在标准缩放情况下是平均值和标准差。这也意味着你必须使用你的训练数据来调整这些参数,永远不要使用测试数据。

然而,还有其他类型的数值变换不需要从训练数据中获取参数来应用。这些类型的变换完全依赖于数学计算。例如,其中一种变换被称为对数变换。这在机器学习模型中是一种非常常见的变换类型,特别适用于偏斜特征。如果你不知道什么是偏斜分布,请看以下图表:

图 3.13 – 偏斜分布

图 3.13 – 偏斜分布

在中间,我们有一个正态分布(或高斯分布)。在左侧和右侧,我们有偏斜分布。在偏斜特征方面,将有一些值远离均值,且仅在一个方向上(要么是左边,要么是右边)。这种行为将推动这个分布的中位数和均值向前面图表中可以看到的长尾的同一方向移动。

一个曾经是偏斜的数据的非常明显的例子是特定地区某一组专业人士的年度工资,例如在美国佛罗里达州工作的资深数据科学家。这类变量通常大部分值都接近其他值(因为人们过去挣的是平均工资),只有少数几个非常高的值(因为一小部分人比其他人挣得多得多)。

希望你现在可以很容易地理解为什么均值和中位数会移动到尾部方向,对吧?高薪将推动它们向那个方向移动。

好吧,但为什么对数变换会对此类特征有益呢?这个问题的答案可以通过其背后的数学来解释:

![Figure 3.14 – Logarithmic propertiesimg/B16735_03_014.jpg

图 3.14 – 对数特性

计算一个数的对数是指数函数的逆运算。对数变换将根据给定的基数(例如基数 2、基数 10 或自然对数的情况下的基数 e)来缩小你的数字的规模。查看上一个例子中我们工资的分布,我们会将这些数字都降下来,使得数字越高,降低的幅度越大;然而,我们会以对数尺度而不是线性方式来做这件事。这种行为将消除这个分布的异常值(使其更接近正态分布),这对许多机器学习算法(如线性回归)是有益的。下表显示了在将数字从线性尺度转换为对数尺度时的一些差异:

![Figure 3.15 – Differences between linear transformation and log transformationimg/B16735_03_015.jpg

图 3.15 – 线性变换与对数变换的区别

我希望你能看到线性变换保持了数据的原始幅度(我们仍然可以看到异常值,但是在另一个尺度上),而对数变换则消除了这些幅度的差异,同时仍然保持了值的顺序。

你能想到另一种遵循相同行为(使分布更接近高斯分布)的数学变换类型吗?好的,我可以给你另一个:平方根。取前面表格中显示的这些数字的平方根,看看你自己吧!

现在,请注意这一点:对数和平方根都属于一组称为幂变换的变换,而且有一个非常流行的、可能在你的 AWS 考试中提到的方法,可以执行一系列我们看到的幂变换。这种方法是由乔治·博克斯和大卫·考克斯提出的,其名称是Box-Cox

重要提示

在你的考试中,如果你看到关于 Box-Cox 转换的问题,请记住,这是一种可以执行许多幂变换(根据 lambda 参数)的方法,其最终目标是使原始分布更接近正态分布(不要忘记这一点)。

只为了总结我们关于为什么数学变换真的可以影响机器学习模型效果的讨论,我将给你一个关于指数变换的直观例子。

假设你有一组数据点,例如图 3.16左侧的数据点。你的目标是画一条线,能够完美地分割蓝色和红色点。仅通过观察原始数据(再次,在左侧),我们知道我们执行这个线性任务的最佳猜测就是你在同一张图片中看到的那个。然而,科学(不是魔法)发生在图片的右侧!通过将这些数字平方并在另一个超平面上绘制,我们可以完美地分离每一组点:

图 3.16 – 指数变换的实际应用

img/B16735_03_016.jpg

图 3.16 – 指数变换的实际应用

我知道你可能正在思考处理数据的各种无限可能方式。尽管这是真的,但你应该始终考虑你正在处理的业务场景,并据此规划你的工作。记住,模型改进或探索总是可能的,但你必须定义你的目标(记住 CRISP-DM 方法论)然后继续前进。

顺便说一句,数据转换很重要,但只是作为数据科学家工作的你工作中的一小部分。你的建模之旅仍需转向其他重要主题,例如处理缺失值和异常值,我们将在下一节中探讨。然而,在那之前,你可能已经注意到在这一节中你被介绍了高斯分布,所以让我们花点时间更详细地讨论一下。

理解数据分布

尽管高斯分布可能是统计和机器学习模型中最常见的分布,但你应该知道它不是唯一的。还有其他类型的数据分布,例如伯努利二项泊松分布。

二项分布是一个非常简单的分布,因为只有两种可能的事件类型:成功或失败。成功事件发生的概率是“p”,而失败事件的概率是“1-p”。

一些遵循伯努利分布的例子包括掷一个六面骰子或抛硬币。在这两种情况下,你必须定义成功事件和失败事件。例如,假设我们在骰子例子中的成功和失败事件如下:

  • 成功:得到一个 6

  • 失败:得到任何其他数字

因此,我们可以说我们有 p 的成功概率(1/6 = 0.16 = 16%)和 1-p 的失败概率(1 - 0.16 = 0.84 = 84%)。

二项分布是伯努利分布的推广。伯努利分布只有一个事件的重复,而二项分布允许事件重复多次,我们必须计算成功的次数。让我们继续使用之前的例子;即,计算我们在 10 次掷骰子中得到 6 的次数。由于这个例子本身的性质,二项分布有两个参数,n 和 p,其中 n 是重复的次数,p 是每次重复成功的概率。

最后,泊松分布允许我们在给定事件在区间内发生的次数的情况下,找到一个时间段内的事件数量。它有三个参数:lambda(λ)、e(欧拉数)和 k,其中 lambda 是每个区间内事件发生的平均次数,e 是欧拉数,k 是事件在区间内发生的次数。

对于所有这些分布,包括高斯分布,我们可以根据它们的参数计算期望的均值和方差。这些信息通常用于假设检验,以检查某些样本数据是否遵循给定的分布,通过比较样本的均值和方差与分布的期望均值和方差。

我希望你现在对数据分布有了更全面的了解,而不仅仅是高斯分布。我们将在整本书中持续讨论数据分布。现在,让我们继续讨论缺失值和异常值检测。

处理缺失值

正如其名所示,缺失值指的是数据的缺失。这种缺失通常由标记表示,这些标记可能或可能没有以标准方式实现。

虽然使用标记是标准的,但这些标记的显示方式可能因不同平台而异。例如,关系型数据库使用NULL表示缺失数据,核心 Python 代码将使用None,而一些 Python 库将缺失数字表示为(非数字NaN)。

重要提示

对于数值字段,不要用替换那些标准缺失标记。默认情况下,零不是缺失值,而是另一个数字。我说“默认情况下”,因为在数据科学中,我们可能会遇到一些数据质量问题,我们将在下一章中讨论。

然而,在实际的商业场景中,你可能找不到那些标准标记。例如,一个软件工程团队可能已经设计了系统,自动用特定的标记填充缺失数据,例如字符串中的“未知”或数字中的“-1”。在这种情况下,你必须通过这两个标记来搜索以找到缺失数据。人们可以设置任何东西。

在前面的例子中,软件工程团队仍然足够友好,给了我们标准标记。然而,有许多情况是遗留系统在用户面前没有添加任何数据质量层,你可能会发现地址字段填写了“我不想分享”或电话号码字段填写了“不要给我打电话”。这显然是缺失数据,但不如前面的例子标准化。

关于缺失数据,你将学到更多细微之处,所有这些内容我们将在本节中涵盖,但请记住:在你开始对缺失值做出决策之前,你应该做好数据探索的准备,并确保你找到了这些值。你可以计算数据频率或使用缺失图,但请采取一些措施。永远不要假设你的缺失数据只由那些方便的标准标记表示。

我们为什么要关注这种类型的数据呢?首先,因为大多数算法(除了在非常具体的机器学习库上实现的决策树之外)在发现缺失值时会引发错误。其次(也许是最重要的),通过将所有缺失数据归入同一个类别,你是在假设它们都是相同的,但在现实中,你并不知道这一点。

这样的决策不仅会给你的模型增加偏差,还会降低其可解释性,因为你将无法解释缺失数据。一旦我们知道我们为什么要处理缺失值,我们就可以看看我们的选项。

从理论上讲,我们可以将缺失值分为两大类:MCARMNAR。MCAR 代表 完全随机缺失,表示缺失数据没有与之相关的模式。另一方面,MNAR 代表 非随机缺失,意味着用于生成数据的底层过程与缺失值严格相关。

让我给你一个 MNAR 缺失值的例子。假设你正在收集用户对特定产品的在线调查反馈。你提问的过程是动态的,取决于用户的回答。当一个用户指定年龄低于 18 岁时,你永远不会询问他的婚姻状况。在这种情况下,婚姻状况的缺失值与用户的年龄相关联(MNAR)。

了解你所处理的缺失值的类别将帮助你理解你是否对生成数据的底层过程有任何控制权。有时,你可以回到源过程,以某种方式完成你的缺失数据。

重要提示

尽管在现实场景中,我们通常必须通过排除或插补来处理缺失数据,但永远不要忘记,你总是可以尝试查看源过程并检查你是否可以检索(或者至少更好地理解)缺失数据。你可能会在考试中遇到这个选项。

如果你没有机会从某处恢复你的缺失数据,那么你应该转向其他方法,例如逐行删除插补

逐行删除指的是丢弃一些数据的过程,这是这种选择的一个缺点。这可能在行级别或列级别发生。例如,假设你有一个包含四个列的 DataFrame,其中一列有 90%的数据缺失。在这种情况下,通常更有意义的是删除整个特征(列),因为你没有大多数观察(行)的这些信息。

从行的角度来看,你可能有一个包含少量观察(行)的 DataFrame,其中其一个特征(列)包含缺失数据。在这种情况下,与其删除整个特征,不如只删除那些少数观察值。

使用这种方法的好处是删除行或列的简单性。同样,缺点是丢失信息。如果你在处理缺失数据时不想丢失信息,那么你应该选择插补策略。

插补也称为替换,其中你将用替代值替换缺失值。插补最常见的方法是用特征的均值替换缺失值。请注意这种方法,因为它很可能出现在你的考试中:

图 3.17 – 使用均值或中位数替换缺失值

图 3.17 – 使用均值或中位数替换缺失值

前面的表显示了一个非常简单的数据集,只有一个特征和五个观察值,其中第三个观察值有缺失值。如果我们决定用特征的均值来替换那个缺失数据,我们会得到 49。有时,当数据中有异常值时,中位数可能更合适(在这种情况下,中位数将是 35):

图 3.18 – 使用组均值或中位数替换缺失值

图 3.18 – 使用组均值或中位数替换缺失值

如果你想要深入了解,你可以根据给定的特征组找到均值或中值。例如,在前面的表中,我们通过添加工作状态列扩展了我们的先前数据集。现在,我们有线索使我们怀疑我们最初通过使用整体中位数(35 岁)来改变缺失值的方法可能是错误的(因为那个人已经退休了)。

你现在可以替换缺失值为你所属相同工作状态的观测值的平均值或中位数。使用这种方法,我们可以将缺失信息更改为 77.5。考虑到这个人已经退休,77.5 比 35 岁更有意义。

重要提示

在分类变量的情况下,你可以用你在数据集中出现频率最高的值来替换缺失数据。根据特定特征对数据集进行分组的逻辑仍然适用。

你还可以使用更复杂的插补方法,包括构建一个机器学习模型来预测你缺失数据的值。这些插补方法(无论是通过平均还是预测值)的缺点是,你正在对数据做出推断,这些推断不一定正确,并且会向数据集添加偏差。

总结来说,处理缺失数据时的权衡是在丢失数据或向数据集添加偏差之间保持平衡。不幸的是,没有科学手册可以遵循,无论你的问题是什么。为了决定你要做什么,你必须参考你的成功标准,探索你的数据,运行实验,然后做出决定。

我们现在将转向许多机器学习算法的另一个头痛问题,也称为异常值。

处理异常值

我们进行这项研究之旅,不仅仅是为了通过 AWS 机器学习专业考试,也是为了成为更好的数据科学家。从数学角度纯粹地看待异常值问题有许多不同的方法;然而,我们使用的数据集是从底层业务流程中提取的,因此在进行异常值分析时,我们必须包括业务视角。

异常值是一组数据中的非典型数据点。例如,以下图表显示了一些在二维平面上绘制的数据点;也就是说,x 和 y。红色点是异常值,因为它在这个数据系列中是一个非典型值:

![Figure 3.19 – Identifying an outlier]

![img/B16735_03_019.jpg]

Figure 3.19 – Identifying an outlier

我们想要处理异常值,因为某些统计方法会受到它们的影响。然而,在先前的图表中,我们可以看到这种行为的实际应用。在左侧,我们绘制了一条最佳拟合线,忽略了红色点。在右侧,我们也绘制了最佳拟合线来拟合数据,但包括了红色点。

通过忽略异常值点,我们可以得出结论,在先前的图表左侧的平面图上,我们将得到一个更好的解决方案,因为它能够更接近大多数值。我们还可以通过计算每条线相关的误差来证明这一点(我们将在本书的后面讨论)。

值得提醒的是,你也在本书的另一个情境中看到了异常值问题:具体来说,在图 3.17中,当我们必须处理缺失值时。在那个例子中,我们使用了中位数(而不是平均值)来解决这个问题。你可以随时回去再次阅读,但此时应该非常清楚的是,中位数比平均值受异常值的影响较小。

你现在知道了什么是异常值以及为什么你应该处理它们。在处理异常值时,你应该始终考虑你的业务视角,但存在数学方法来查找它们。现在,让我们来看看这些异常值检测的方法。

你已经学习了最常见的方法:z 分数。在图 3.11中,我们看到了一个包含一组年龄的表格。再次查阅它以刷新你的记忆。在那个表格的最后一列,我们根据图 3.10中显示的公式计算每个年龄的 z 分数。

这些 z 分数值没有明确的范围;然而,在一个没有异常值的正态分布中,它们将在-3 和 3 之间。记住:z 分数将给出分布平均值的标准差数。以下图表显示了正态分布的一些特性:

图 3.20 – 正态分布特性。图片改编自 https://pt.wikipedia.org/wiki/Ficheiro:The_Normal_Distribution.svg

图 3.20 – 正态分布特性。图片改编自 https://pt.wikipedia.org/wiki/Ficheiro:The_Normal_Distribution.svg

根据正态分布的性质,95%的值将属于平均值的-2 和 2 个标准差范围内,而 99%的值将属于平均值的-3 和 3 个标准差范围内。回到异常值检测的上下文中,我们可以在这些 z 分数值上设置阈值,以指定一个数据点是否为异常值!

没有一个标准的阈值可以用来分类异常值。理想情况下,你应该查看你的数据,看看什么对你更有意义……通常(这不是规则),你将使用平均值的 2 到 3 个标准差之间的某个数字来设置异常值,因为超过 95%的数据将超出这个范围。你可能记得,分布的均值下方上方都有异常值,如下表所示,我们用绝对z 分数大于 3 的异常值进行了标记(值列为了演示而隐藏):

图 3.21 – 根据 z 分数值标记异常值

图 3.21 – 根据 z 分数值标记异常值

我们在先前的表格中发现了两个异常值:第三行和第五行。另一种在数据中查找异常值的方法是应用箱线图逻辑。你将在本书的下一章中更详细地了解箱线图。现在,让我们专注于使用这种方法来查找异常值。

当我们观察一个数值变量时,我们可以从中提取许多描述性统计量,而不仅仅是之前看到的均值、中位数、最小值和最大值。数据分布中存在的一种属性被称为分位数

分位数是从随机变量的累积分布函数中按常规间隔建立的截断点。这些常规间隔,也称为q 分位数,在某种情况下将几乎相同大小,并会得到特殊名称;例如:

  • 四分位数被称为四分位。

  • 10 分位数被称为十分位数。

  • 100 分位数被称为百分位数。

例如,20 百分位数(100 分位数常规间隔)指定了 20%的数据低于该点。在箱线图中,我们使用 4 分位数的常规间隔(也称为四分位)来展示数据的分布(Q1 和 Q3),如下图中所示:

图 3.22 – 箱线图定义

图 3.22 – 箱线图定义

Q1 也被称为下四分位数或 25 分位数,这意味着 25%的数据在分布中低于该点。Q3 也被称为上四分位数或 75 分位数,这意味着 75%的数据在分布中低于该点。

计算 Q1 和 Q3 之间的差异将给出四分位距(IQR)值,然后你可以使用这个值来计算箱线图的界限,如前图中“最小值”和“最大值”标签所示。

最后,我们可以最终推断出,任何低于箱线图“最小值”或高于“最大值”的值都将被标记为异常值。

现在,你已经了解了两种不同的方法可以在你的数据上标记异常值:z 分数和箱线图。你可以决定是否要从数据集中删除这些点,或者创建另一个变量来指定它们确实是异常值(如我们在图 3.21中所做的那样)。

让我们继续我们的数据准备之旅,看看我们在现实生活中会遇到的其他类型的问题。接下来,你将了解到一些用例中存在所谓的罕见事件,这使得机器学习算法关注问题的错误一边,并提出不良解决方案。幸运的是,我们将学习如何调整它们或准备数据以使它们更智能。

处理不平衡数据集

到目前为止,我希望你已经意识到为什么数据准备可能是我们工作中最长的部分。我们已经学习了数据转换、缺失数据值和异常值,但问题列表还在继续。不用担心——请耐心等待,让我们一起掌握这个主题!

机器学习模型中另一个众所周知的问题是,特别是在二元分类问题中,类别不平衡。在二元分类模型中,我们说当大多数观测值属于同一类别(目标变量)时,数据集是不平衡的。

这在欺诈识别系统中非常常见,例如,其中大多数事件属于常规操作,而非常少数的事件属于欺诈操作。在这种情况下,我们也可以说欺诈是一个罕见事件。

在定义数据集是否不平衡时没有强规则,从需要担心它的意义上讲。大多数挑战问题将呈现超过 99%的观察值属于多数类。

不平衡数据集的问题非常简单:机器学习算法将试图在训练数据中找到最佳拟合以最大化其准确性。在一个 99%的案例属于一个单一类的数据集中,如果没有调整,算法可能会优先考虑多数类的确定性。在最坏的情况下,它将把所有观察值分类为多数类,并忽略少数类,而这通常是我们建模时的兴趣所在。

要处理不平衡数据集,我们可以遵循两个主要方向:调整算法来处理这个问题或重新采样数据以使其更平衡。

通过调整算法,你必须指定分类中每个类的权重。这种类权重配置属于算法,而不是训练数据,因此它是一个超参数设置。重要的是要记住,并非所有算法都会有那种配置,也不是所有机器学习框架都会公开它。作为一个快速参考,我们可以提到来自 scikit-learn 机器学习库的DecisionTreeClassifier类,作为一个实现了类权重超参数的好例子。

解决不平衡问题的另一种方法是通过对训练数据集进行下采样上采样来改变。如果你决定采用下采样,你所要做的就是从多数类中移除一些观察值,直到你得到一个更平衡的数据集。当然,这种方法的一个缺点是,你可能会丢失关于你正在移除观察值的多数类的重要信息。

最常见的下采样方法是随机下采样,这是一种天真重采样方法,其中我们随机从训练集中移除一些观察值。

另一方面,你可以选择进行上采样,在这种情况下,你将创建少数类的新的观察值/样本。最简单的方法是天真方法,其中你从训练集中随机选择观察值(带替换)进行复制。这种方法的一个缺点是可能存在过拟合的问题,因为你将复制/突出显示少数类的观察模式。

要避免你的模型欠拟合或过拟合,你应该始终在测试集上测试拟合好的模型。

重要提示

测试集不能进行下采样/上采样:只有训练集应该通过这些重采样技术。

你也可以通过应用合成采样技术来过采样训练集。随机过采样不会向训练集添加任何新信息:它只是复制现有的。通过创建合成样本,你是从现有样本中推导出那些新观察结果(而不是简单地复制它们)。这是一种称为合成少数过采样技术(SMOTE)的数据增强技术。

从技术上讲,SMOTE 所做的是在少数类的特征空间中绘制一条线,并提取接近该线的点。

重要提示

你可能会在考试中发现使用过 SMOTE 这个术语的问题。如果发生这种情况,请记住这个术语应用时的上下文:过采样。

现在,让我们继续下一个关于数据准备的主题,我们将学习如何为机器学习模型准备文本数据。

处理文本数据

我们已经学习了如何将分类特征转换为数值表示,无论是使用标签编码器、顺序编码器还是独热编码。然而,如果我们数据集中有包含长文本的字段怎么办?我们该如何为它们提供数学表示,以便正确地输入机器学习算法?这是一个在自然语言处理(NLP),人工智能的一个子领域中常见的问题。

NLP 模型旨在从文本中提取知识;例如,在语言之间翻译文本、在文本语料库中识别实体(也称为命名实体识别(NER))、从用户评论中分类情感,以及许多其他应用。

重要提示

第二章**中,AWS 人工智能/机器学习应用服务,你了解了一些将 NLP 应用于其解决方案的 AWS 应用服务,例如 Amazon Translate 和 Amazon Comprehend。在考试中,你可能会被要求思考构建某些类型 NLP 应用的最快或最简单的方法(开发工作量最小)。通常,最快或最简单的方法是使用那些现成的 AWS 服务,因为它们为某些用例提供了预训练模型(尤其是机器翻译、情感分析、主题建模、文档分类和实体识别)。

在接下来的几章中,你还将了解一些用于 NLP 应用的内置 AWS 算法,例如 BlazingText、潜在狄利克雷分配(LDA)、神经主题建模和序列到序列算法。这些算法也让你可以创建与那些现成服务创建的相同 NLP 解决方案;然而,你必须使用 SageMaker 并编写自己的解决方案。换句话说,它们提供了更多的灵活性,但需要更多的开发工作量。

在考试中请记住这一点!

虽然 AWS 提供了许多开箱即用的服务和内置算法,允许我们创建 NLP 应用,但现在我们不会查看这些 AWS 产品特性(如我们在第二章**,AWS 人工智能/机器学习应用服务中所述,我们将在第七章**,应用机器学习算法中再次讨论)。我们将通过查看一些数据准备技术来结束本章,这些技术对于准备你的数据以进行 NLP 非常重要。

词袋模型

我们将首先介绍的是所谓的词袋模型BoW)。这是一个非常常见且简单的技术,应用于文本数据,通过创建矩阵表示来描述文本中的单词数量。BoW 包括两个主要步骤:创建词汇表和创建表示文本中已知词汇出现情况。这些步骤可以在以下图中看到:

![图 3.23 – 词袋模型的应用图片

图 3.23 – 词袋模型的应用

首先,我们通常不能使用原始文本来准备词袋模型表示。这里有一个数据清洗步骤,我们将文本转换为小写;将每个单词拆分为标记;删除标点符号、非字母字符和停用词;并在必要时,应用任何其他你可能想要的定制清洗技术。

一旦你清洗了原始文本,你就可以将每个单词添加到全局词汇中。技术上,这通常是一个元组的字典,形式为(单词,出现次数);例如,{(apple, 10), (watermelon, 20)}。如我之前提到的,这是一个全局字典,你应该考虑你正在分析的所有文本。

现在,有了清洗后的文本和更新的词汇表,我们可以以矩阵的形式构建我们的文本表示,其中每一列代表全局词汇中的一个单词,每一行代表你已分析的文本。你如何在每一行中表示这些文本可能因不同的策略而异,例如二进制、频率和计数。让我们更深入地探讨这些策略。

在前面的图中,我们正在处理单个文本,但尝试了三种不同的词袋策略。这就是为什么你可以在表格上看到三行,而不是一行(在实际场景中,你必须从中选择一个进行实施)。

在第一行,我们使用了二进制策略,如果单词存在于全局词汇中,则分配 1,否则分配 0。因为我们的词汇是在单个文本上构建的,所以该文本中的所有单词都属于词汇(这就是为什么在二进制策略中你只能看到 1 的原因)。

在第二行,我们使用了频率策略,该策略会检查文本中每个单词出现的次数,并将其除以文本中单词的总数。例如,单词 "this" 只出现一次(1),而文本中还有七个其他单词(7),所以 1/7 等于 0.14。

最后,在第三行,我们使用了计数策略,这是一种简单的对文本中每个单词出现次数的计数。

重要提示

这个提示非常重要——你很可能在考试中找到它。你可能已经注意到,我们的 BoW 矩阵在中包含独特单词,而每个文本的表示都在中。如果你有 100 篇很长的文本,它们之间只有 50 个独特的单词,你的 BoW 矩阵将有 50 列和 100 行。在考试中,你很可能会收到一个文本列表,并被要求准备 BoW 矩阵。

你还应该了解关于 BoW 的一个极其重要的概念,那就是n-gram配置。n-gram 这个术语用来描述你希望如何查看你的词汇,无论是通过单个单词(单语元),两个单词的组合(双语元),三个单词的组合(三元组),甚至是 n 个单词的组合(n-gram)。到目前为止,我们已经看到了使用单语元方法的 BoW 表示,但更复杂的 BoW 表示可能使用双语元、三元组或 n-gram。

主要逻辑本身并没有改变,但你需要知道如何在 BoW 中表示 n-gram。仍然使用我们前面图中的例子,双语元方法会以以下方式组合这些单词:[这部电影,电影真的很,真的很棒,好尽管,尽管老,老制作]。在考试之前,确保你理解这一点。

重要提示

BoW 的强大和简单之处在于你可以轻松地构建一个训练集来测试你的算法,甚至创建一个基线模型。如果你看图 3.23,你能看到拥有更多数据和仅仅在表中添加一个分类列,比如好评或差评,这将使我们能够训练一个二元分类模型来预测情感吗?

好吧——你可能已经注意到,我为你介绍的大多数令人惊叹的技术都伴随着一些缺点。BoW 的问题在于维护其词汇表的挑战。我们很容易看到,在一个巨大的文本语料库中,词汇量往往会越来越大,而矩阵表示往往会变得稀疏(我知道——又是稀疏性问题)。

解决词汇量问题的可能方法之一是使用词哈希(在机器学习中也称为哈希技巧)。哈希函数将任意大小的数据映射到固定大小的数据。这意味着你可以使用哈希技巧用固定数量的特征来表示每个文本(无论词汇的大小)。技术上,这个哈希空间允许碰撞(不同的文本由相同的特征表示),所以在实现特征哈希时需要考虑这一点。

TF-IDF

与 BoW(词袋模型)相关联的另一个问题是,尤其是在我们使用频率策略构建特征空间时,更频繁出现的单词会因为文档中出现的次数多而显著提高它们的分数。结果往往是,这些高频出现的单词并不是文档的关键词,而只是也在其他几份文档中多次出现的其他单词。

词频-逆词频(TF-IDF)通过检查它们在其他文档中的频率并使用这些信息来重新调整文档中单词的频率,帮助惩罚这些类型的单词。

在处理结束时,TF-IDF 倾向于给予文档中独特的单词(文档特定单词)更多的重视。让我们看看一个具体的例子,以便你能深入理解。

考虑我们有一个包含 100 个单词的语料库,其中单词"Amazon"出现了三次。这个单词的词频(TF)将是 3/100,等于 0.03。现在,假设我们还有其他 1,000 份文档,其中"Amazon"单词出现在这 50 份文档中。在这种情况下,逆词频(IDF)将由对数给出,即 1,000/50,等于 1.30。在分析的具体文档中,单词"Amazon"的 TF-IDF 分数将是 TF * IDF 的乘积,即 0.03 * 1.30(0.039)。

假设,除了 50 份文档外,单词"Amazon"还出现在另外 750 份文档上——换句话说,比先前的场景出现得更频繁。在这种情况下,我们将不会改变这个方程的 TF 部分——它仍然是 0.03。然而,IDF 部分将略有变化,因为这次,它将是 log 1,000/750,等于 0.0036。正如你所看到的,这次,单词"Amazon"的重要性比先前的例子要小得多。

词嵌入

与传统的 BoW(词袋模型)和 TD-IDF 等方法不同,现代文本表示方法将注意信息的上下文,以及单词的存在或频率。遵循这一概念的一个非常流行且强大的方法被称为词嵌入。词嵌入创建一个固定长度的密集向量,可以存储关于文档上下文和意义的信息。

每个单词在多维超平面上的一个数据点表示,我们称之为嵌入空间。这个嵌入空间将有"n"个维度,其中每个维度都指代这个密集向量的特定位置。

虽然这可能听起来有些令人困惑,但这个概念实际上相当简单。假设我们有一个包含四个单词的列表,我们想在五维嵌入空间中绘制它们。这些单词是 king、queen、live 和 castle。以下表格显示了如何做到这一点:

![图 3.24 – 嵌入空间表示

![图片 B16735_03_024.jpg]

图 3.24 – 嵌入空间表示

忘记前面表格中的假设数字,专注于数据结构;你会看到,现在每个单词在嵌入空间中由 "n" 维度表示。将单词转换为向量的这个过程可以通过许多不同的方法来完成,但最流行的是 word2vecGloVe

一旦每个单词都表示为固定长度的向量,你就可以应用许多其他技术来完成你需要做的事情。一个非常常见的任务是在超平面中绘制这些 "单词"(实际上,它们的维度),并直观地检查它们彼此之间的接近程度!

技术上,我们不会直接用这个来绘制它们,因为人类大脑无法解释超过三个维度。然后,我们通常应用降维技术(例如你稍后将要学习的主成分分析),将维度数减少到两个,最后在笛卡尔平面上绘制单词。这就是为什么你可能看到下面图表底部的图片。你有没有想过如何在图表上绘制单词?

图 3.25 – 绘制单词

图 3.25 – 绘制单词

如果你想知道我们是如何得到 图 3.24 中显示的维度的,让我们深入探讨。同样,有不同方法来做这件事,但让我们看看最流行的一种,它使用固定上下文窗口的共现矩阵。

首先,我们必须想出一些逻辑来表示每个单词,同时考虑到我们还要考虑它们的上下文。为了解决上下文要求,我们将定义一个固定上下文窗口,它将负责指定将有多少个单词一起用于上下文学习。例如,让我们将这个固定上下文窗口设置为 2。

接下来,我们将创建一个共现矩阵,它将根据预定义的上下文窗口计算每对单词的出现次数。让我们看看它是如何工作的。考虑以下文本:"I will pass this exam, you will see. I will pass it"。

第一个单词 "pass" 的上下文窗口将是以下这些加粗的:"I will pass this exam, you will see. I will pass it"。考虑到这个逻辑,让我们看看每个单词对在上下文窗口中出现的次数:

图 3.26 – 共现矩阵

图 3.26 – 共现矩阵

正如你所见,当我们使用大小为 2 的上下文窗口时,单词对 "I will" 出现了三次:

  1. I will pass this exam, you will see. I will pass it。

  2. 我会通过这次考试,你会看到的。我会通过它。

  3. 我会通过这次考试,你会看到的。I will pass it。

观察前面的表格,应该将相同的逻辑应用于所有其他单词对,用相关的出现次数替换 "…"。你现在为每个单词都有了数值表示!

重要提示

你应该知道,与固定上下文窗口的共现矩阵相比,有许多替代方案,例如使用 TD-IDF 向量化或甚至更简单的文档中单词计数。这里最重要的信息是,无论如何,你必须为每个单词提供一个数值表示。

最后一步是最终找到图 3.24中显示的那些维度。你可以通过创建一个多层模型来实现,通常基于神经网络,其中隐藏层将代表你的嵌入空间。以下图示展示了我们可以将前面表格中显示的单词压缩到五个维度的简化示例:

图 3.27 – 使用神经网络构建嵌入空间

图 3.27 – 使用神经网络构建嵌入空间

我们将在本书的后面部分更详细地讨论神经网络。现在,理解嵌入向量来自何处已经是一项了不起的成就!

在建模自然语言问题时,你还需要记住的另一件重要事情是,你可以在你的模型中重用预训练的嵌入空间。一些公司已经创建了基于数十亿文档的现代神经网络架构,这已经成为该领域的尖端技术。为了参考,请查看由谷歌提出的双向编码器表示的 TransformerBERT),它已被数据科学社区和行业广泛使用。

我们现在已经到达了关于数据准备和转换的漫长——但非常重要——章节的结尾。让我们抓住这个机会,快速回顾一下我们学到的精彩内容。

摘要

首先,你被介绍到了你可能需要与之合作的特征类型。确定你将与之合作的变量的类型对于定义可以应用于每种情况的转换和技术的类型非常重要。

然后,我们学习了如何处理分类特征。我们看到了,有时,分类变量确实有顺序(例如有序变量),而有时则没有(例如名义变量)。你了解到,独热编码(或虚拟变量)可能是名义特征的转换中最常见的一种;然而,根据唯一类别的数量,在应用独热编码后,你的数据可能会出现稀疏性问题。至于有序特征,你不应该在它们之上创建虚拟变量,因为这样你会丢失变量中已经包含的顺序信息。在这些情况下,有序编码是最合适的转换。

我们继续我们的旅程,通过查看数值特征,我们学习了如何处理连续和离散数据。我们探讨了最重要的转换类型,如归一化、标准化、分箱和离散化。你看到,某些类型的转换依赖于底层数据来找到它们的参数,因此非常重要,避免使用测试集从数据中学习任何东西(它必须严格用于测试)。

你还看到,我们甚至可以将纯数学应用于转换我们的数据;例如,你了解到幂变换可以用来减少特征的偏度,使其更加正常。

接下来,我们研究了缺失数据,并了解了这项任务的重要性。当你建模时,你不能将缺失值视为一个简单的计算问题,其中你只需要用 y 替换 x。这是一个更大的问题,你需要通过探索你的数据来开始解决这个问题,然后检查你的缺失数据是否是随机生成的。

当你决定删除或替换缺失数据时,你必须意识到你可能会丢失信息或向数据添加偏差,分别如此。请记住回顾我们给你提供的所有重要笔记,因为它们很可能以某种方式出现在你的考试中。

接下来,你学习了关于异常值检测的内容。你研究了不同的方法来找到异常值,如 z 分数和箱线图方法。最重要的是,你学习了你可以标记或平滑它们。

在开始时,我告诉你这一章将是一段漫长但值得的旅程,关于数据准备,这就是为什么我需要给你一个很好的感觉,了解如何处理罕见事件,因为这是机器学习中最具挑战性的问题之一。你了解到,有时你的数据可能是不平衡的,你必须要么通过改变类别权重来欺骗你的算法,要么通过应用欠采样和过采样来重新采样你的数据。

最后,你学习了如何处理 NLP 中的文本数据。你现在应该能够手动计算词袋和 TF-IDF 矩阵!我们甚至更深入地学习了词嵌入的工作原理。在本小节中,我们了解到我们可以创建自己的嵌入空间(使用许多不同的方法)或重用预训练的一个,例如 BERT。

我们完成了!我很高兴你做到了,我确信这一章对你的考试成功至关重要。最后,我们为你准备了一些练习题;我希望你会喜欢它们。

在下一章中,我们将深入研究数据可视化技术。

问题

  1. 你正在为一家医疗保健公司担任数据科学家,并创建一个机器学习模型来预测公司索赔中的欺诈、浪费和滥用。该模型的一个特征是,在 2 年期间,特定药物被开具给索赔相同患者的次数。这是哪种类型的功能?

    a) 离散型

    b) 连续型

    c) 名义型

    d) 序数

    答案

    a, 该特征是计算特定药物被开具的次数。个体和可数项被归类为离散数据。

  2. 你正在为一家拥有全球学校和大学的培训机构构建一个机器学习模型。你的模型旨在预测特定学生离开其学习的机会。许多因素可能导致辍学,但你的一个特征是每个学生的当前学术阶段:幼儿园、小学、中学或高中。这是什么类型的特征?

    a) 离散

    b) 连续

    c) 名义

    d) 序数

    答案

    d, 该特征具有隐含的顺序,应被视为分类/序数变量。

  3. 你正在为一家汽车保险公司构建一个机器学习模型。该公司希望创建一个旨在预测其承保车辆被盗可能性的二元分类模型。你已经考虑了许多特征来构建此模型,包括车辆类型(经济型、紧凑型、高级、豪华、货车、运动型和敞篷车)。你将如何转换车辆类型以便在模型中使用它?

    a) 应用序数编码

    b) 应用独热编码

    c) 不需要转换

    d) 选项 A 和 B 是此问题的有效转换

    答案

    b, 在这种情况下,我们有一个分类/名义变量(每个类别之间没有顺序)。此外,唯一类别的数量看起来相当可管理;此外,独热编码非常适合此类数据。

  4. 你正在为一家金融公司担任数据科学家。该公司希望创建一个旨在分类不当付款的模型。你决定将“交易类型”作为你的一个特征(本地、国际、预先批准的等等)。在对此变量应用独热编码后,你意识到你的数据集有更多的变量,并且你的模型训练时间很长。你如何可能解决这个问题?

    a) 通过应用序数编码而不是独热编码。在这种情况下,我们只需创建一个特征。

    b) 通过应用标签编码。

    c) 通过分析哪些类型的交易对不当/正当付款的影响最大。仅对减少的交易类型应用独热编码。

    d) 通过将你的模型迁移到另一种可以更好地处理稀疏数据的编程语言。

    答案

    c, 由于原始变量中类别数量过多,你的转换导致产生了更多特征。尽管独热编码方法看起来是正确的,因为该变量是一个名义特征,该特征的级别(唯一值)数量可能太高。

    在这种情况下,你可以进行探索性数据分析,了解对你问题最重要的交易类型。一旦你知道了这些信息,你就可以将转换限制在这些特定类型上(减少数据稀疏性)。值得注意的是,在这个过程中,你会丢失一些信息,因为现在你的虚拟变量只会关注子集的类别,但这是一种有效的方法。

  5. 你正在一家营销公司担任数据科学家。你的公司正在构建一个聚类模型,用于细分客户。你决定对变量“年收入”进行归一化,其范围在 50,000 到 300,000 之间。

    在应用归一化后,收入为 50,000、125,000 和 300,000 的客户群体的归一化值是什么?

    a) 1, 2 和 3

    b) 0, 0.5 和 1

    c) 0, 0.25 和 1

    d) 5, 12 和 30

    答案

    b, 应用归一化公式并假设期望的范围是 0 和 1,正确答案是 b。

  6. 考虑一个存储员工工资的特定列的数据集。该列工资的均值是 $2,000,而标准差等于 $300. 那位收入 $3,000 的人的标准尺度值是多少?

    a) 3.33

    b) 6.66

    c) 10

    d) 1

    答案

    a, 记住标准尺度公式:(X - µ) / σ,即 (3,000 – 2,000) / 300。

  7. 我们可以应用哪种类型的数据转换将连续变量转换为二元变量?

    a) 分箱和独热编码

    b) 标准化和分箱

    c) 归一化和独热编码

    d) 标准化和独热编码

    答案

    a, 在这种情况下,我们可以通过应用分箱然后获取虚拟变量来对连续变量进行离散化。

  8. 你是一家金融公司的数据科学家,你被分配了一个创建二元分类模型的任务,以预测客户是否会离开公司(也称为流失)。在你的探索性工作中,你意识到有一个特定的特征(信用使用金额)有一些缺失值。这个变量以实数表示;例如,$1,000. 假设你不想丢失信息,处理这些缺失值的最快方法是什么?

    a) 删除任何缺失值。

    b) 创建一个分类模型来预测信用使用金额,并使用它来预测缺失数据。

    c) 创建一个回归模型来预测信用使用金额,并使用它来预测缺失数据。

    d) 用变量的均值或中位数替换缺失数据。

    答案

    d, 在这个情况下,几乎所有的选项都是处理这个问题的有效方法,除了选项 b,因为预测缺失数据需要你创建一个回归模型,而不是分类模型。选项 a 是处理缺失数据的有效方法,但不是针对我们不想丢失信息的问题。选项 c 也是一个有效的方法,但不是最快的。选项 d 是此问题的最合适的答案。

  9. 你必须为特定的客户创建一个机器学习模型,但你意识到大部分特征有超过 50%的数据缺失。在这个关键情况下,我们的最佳选择是什么?

    a) 删除超过 50%缺失数据的整个列

    b) 删除包含至少一条缺失信息的所有行

    c) 与数据集所有者核实是否可以从其他地方检索缺失数据

    d) 用特征的均值或中位数替换缺失信息

    答案

    c, 这是一个非常关键的情况,其中大部分信息实际上都是缺失的。你应该与数据集所有者合作,了解为什么会出现这个问题,并检查生成这些数据的过程。如果你决定删除缺失值,你将丢失大量信息。另一方面,如果你决定替换缺失值,你将在数据中添加大量偏差。

  10. 你作为一个人力资源公司的高级数据科学家,正在创建一个特定的机器学习模型,该模型使用一个在倾斜特征上表现不佳的算法,如下面的图像所示:

    图 3.28 – 倾斜特征

    你可以应用哪些变换来减少这个特征的倾斜度(选择所有正确答案)?

    a) 归一化

    b) 对数变换

    c) 指数变换

    d) Box-Cox 变换

    答案

    b, d, 为了减少倾斜度,幂变换是最合适的方法。特别是,你可以应用对数变换或 Box-Cox 变换来使这个分布更接近高斯分布。

  11. 你正在处理一个欺诈识别问题,其中大部分标记数据属于一个单一类别(非欺诈)。只有 0.1%的数据指的是欺诈案例。你将提出哪些建模技术来使用在这个用例中(选择所有正确答案)?

    a) 应用随机过采样来创建欺诈案例的副本。

    b) 应用随机欠采样来从非欺诈案例中移除观察值。

    c) 在这样一个不平衡的数据集上创建分类模型是不可能的。最好的办法是向数据集所有者请求更多的欺诈案例。

    d) 应用合成过采样来创建非欺诈案例的副本。

    答案

    a, b, 在机器学习中,不平衡的数据集非常常见,有许多不同的方法可以处理这个问题。选项 c 绝对不是正确的。注意选项 d;你应该能够对你的数据应用合成过采样,但为了创建更多少数类的观测值,而不是来自多数类。选项 a 和 b 是正确的。

  12. 你正在为机器学习准备文本数据。这次,你想要在以下文本之上创建一个二元词袋 BoW 矩阵:

    "我将掌握这个认证考试"

    "我将通过这个认证考试"

    你的 BoW 矩阵表示将有多少行和列?

    a) 7 行和 2 列

    b) 2 行和 7 列

    c) 14 行和 4 列

    d) 4 列和 14 行

    答案

    b, 让我们一起计算下表中矩阵。

    如你所见,技巧在于知道哪些标记是两个文本共有的。我们只有两个文本;行数也将是两个——每个文本一个:

    图 3.29 – 结果词袋

  13. 你正在进行一项调查,以检查一组人在特定开发工具上的经验年数。你提出了以下分布:

    图 3.30 – 偏斜数据分布

    你能说些什么关于这个分布的众数、平均值和中位数(选择所有正确答案)?

    a) 平均值大于中位数

    b) 平均值小于中位数

    c) 中位数大于众数

    d) 中位数小于众数

    答案

    a, c, 这是一个偏斜分布(向右)。这意味着你的平均值将被推向尾巴的同一侧,然后是中位数。因此,我们将有众数 < 中位数 < 平均值。

  14. 你作为一家零售公司的数据科学家工作。你正在为分类目的构建一个基于决策树的模型。在你的评估过程中,你意识到模型的准确率是不可接受的。以下哪项任务不是提高你的决策树模型准确率的有效方法?

    a) 调整模型的超参数。

    b) 缩放数值特征。

    c) 尝试不同的方法来转换分类特征,例如二进制编码、独热编码和有序编码(当适用时)。

    d) 如果数据集不平衡,尝试不同的重采样技术(欠采样和过采样)是值得的。

    答案

    b, 缩放数值特征是机器学习模型中的一个重要任务,但并不总是需要的。特别是在基于决策树的模型中,改变数据的比例不会导致更好的模型性能,因为这种类型的模型不受数据比例的影响。

  15. 你正在从事一个数据科学项目,其中你必须创建一个 NLP 模型。你决定在模型开发期间测试 Word2vec 和 GloVe,以尝试提高模型精度。Word2vec 和 GloVe 是两种什么类型的?

    a) 预训练词嵌入

    b) 预训练的 TF-IDF 矢量

    c) One-hot 编码技术

    d) 以上皆非

    答案

    a, 一些自然语言处理(NLP)架构可能包括嵌入层。如果你遇到这类项目,你可以通过训练一个特定模型来创建自己的嵌入空间(使用你自己的数据集)或者你可以使用任何预训练的词嵌入模型,例如由谷歌预训练的 Word2vec 模型。

第四章: 理解和可视化数据

数据可视化是一门艺术!无论你和你团队在数据准备和初步分析建模上投入了多少努力,如果你不知道如何有效地展示你的发现,你的观众可能无法理解你试图表达的观点。

在处理决策者时,这种情况下可能会变得更糟。例如,如果你选择了错误的一组图表来讲述一个特定的故事,人们可能会误解你的分析并做出糟糕的决策。

理解不同类型的数据可视化以及它们如何与每种分析类型相匹配,这将使你在吸引观众和传达你想要的信息方面处于非常有利的地位。

在本章中,你将了解一些数据可视化技术。我们将涵盖以下主题:

  • 在你的数据中可视化关系

  • 在你的数据中可视化比较

  • 在你的数据中可视化组成

  • 在你的数据中可视化分布

  • 构建关键绩效指标

  • 介绍 Quick Sight

我们已经知道为什么我们需要掌握这些主题,所以让我们开始吧。

在你的数据中可视化关系

当我们需要展示数据中的关系时,我们通常是在谈论在图表中绘制两个或更多变量以可视化它们的依赖程度。散点图可能是展示两个变量之间关系的最常见图表类型。以下是一个关于两个变量,xy的散点图:

图 4.1 – 使用散点图绘制关系

图 4.1 – 使用散点图绘制关系

前面的图表显示了xy之间的清晰关系。随着x的增加,y也增加。在这种情况下,我们可以说这两个变量之间存在线性关系。请记住,散点图也可能捕捉到其他类型的关系,而不仅仅是线性关系。例如,也有可能在两个变量之间找到指数关系。

另一个用于比较的好图表被称为气泡图。就像散点图一样,它也会显示变量之间的关系;然而,在这里,你可以使用第三个维度,它将由点的尺寸来表示。

以下是一个解释投资方案的气泡图,其中x是年利率,y是投资期限,气泡的大小是每个投资选项的大小:

图 4.2 – 使用气泡图绘制关系

图 4.2 – 使用气泡图绘制关系

观察前面的图表,我们可以看到两种类型的关系:投资期限越长,年收益率越高,投资金额越高,年收益率也越高。正如我们所见,这是一种非常有效的展示这种分析的方式。接下来,我们将学习如何比较我们的数据。

在你的数据中可视化比较

比较在数据分析中非常常见,我们有不同的方式来展示它们。让我们从条形图开始。我相信你已经看过很多使用这种可视化类型的报告。

条形图可以用来比较不同类别中的一个变量;例如,不同型号的汽车价格或按国家划分的人口规模。在下面的图表中,我们使用条形图展示了截至 2020 年 6 月印度各州的新冠病毒病例数:

![图 4.3 – 使用条形图绘制比较

![图片 B16735_04_003.jpg]

![图 4.3 – 使用条形图绘制比较

有时,我们也可以使用堆积柱状图为正在分析的数据添加另一个维度。例如,在下面的图表中,我们使用堆积条形图来显示按性别划分的泰坦尼克号上的人数。此外,我们还将幸存者(正类)和未幸存者(负类)的人数进行了细分:

![图 4.4 – 使用堆积条形图分析泰坦尼克号灾难数据集

![图片 B16735_04_004.jpg]

![图 4.4 – 使用堆积条形图分析泰坦尼克号灾难数据集

如我们所见,大多数女性在灾难中幸存,而大多数男性则没有。堆积条形图帮助我们可视化性别之间的差异。最后,你应该知道我们也可以在那些堆积条形图上显示百分比,而不是绝对数字。

柱状图在需要比较不同时期的一个或两个变量时也非常有用。例如,在下面的图表中,我们可以看到按省份划分的加拿大年度电动汽车销量:

![图 4.5 – 使用柱状图绘制比较

![图片 B16735_04_005.jpg]

![图 4.5 – 使用柱状图绘制比较在不同时期进行比较的另一种非常有效的方法是使用折线图。在下面的图表中,我们展示了一个有趣的例子,说明我们如何在不同发布日期的项目中比较不同算法的性能。重要提示折线图通常非常有帮助,可以显示在分析的时间段内数据中是否存在任何趋势。折线图的一个非常常见的用途是预测,我们通常需要分析时间序列数据中的趋势和季节性。例如,我们可以看到,与分类和回归树CART)模型相比,AdaBoostADA)、梯度提升GB)、随机森林RF)和逻辑回归LOGIT)等其他算法的性能较差。然而,在 7 月份,CART 模型进行了更改,结果它在所有其他模型中排名第三。每个时期的最佳模型的故事可以很容易地在以下图表中看到:图 4.6 – 使用折线图绘制比较

图 4.6 – 使用折线图绘制比较

最后,你还可以使用表格来展示你的数据比较。当我们的数据有多个维度(通常放在表格的行中)以及一个或多个用于比较的指标时(通常放在表格的列中),表格就更有用了。

在下一节中,我们将学习另一组图表,旨在展示你的变量的分布。这组图表对于建模任务尤为重要,因为你必须知道一个特征的分布,才能考虑对其进行潜在的数据转换。让我们看看这个吧!

在你的数据中可视化分布

探索你的特征分布非常重要,以便了解其一些关键特征,如偏度、均值、中位数和分位数。你可以通过绘制直方图轻松地可视化偏度。这种类型的图表将你的数据分组到区间中,并在其上执行计数。例如,以下图表显示了年龄变量的直方图:

图 4.7 – 使用直方图绘制分布

图 4.7 – 使用直方图绘制分布

通过观察直方图,我们可以得出结论,大多数人年龄在 20 到 50 岁之间。我们还可以看到一些超过 60 岁的人。以下图表显示了直方图的另一个例子,其中我们正在绘制一个特定事件的支付分布,该事件有不同的票价。我们想看看人们每张票支付了多少钱:

图 4.8 – 使用直方图检查偏度

图 4.8 – 使用直方图检查偏度

在这里,我们可以看到大多数人每张票支付的最大金额为 100 美元。这就是为什么我们可以看到向右偏斜的分布(尾部)的原因。

如果你想要看到分布的其他特征,如中位数、分位数和异常值,那么你应该使用箱线图。在以下图表中,我们再次比较了给定数据集中不同算法的性能。

这些算法在交叉验证过程中执行了多次,因此对于同一算法产生了多个输出;例如,每个折叠上算法执行的每个准确度指标。

由于我们对每个算法都有多个准确度指标,我们可以使用箱线图来检查这些算法在交叉验证过程中的表现:

图 4.9 – 使用箱线图绘制分布

图 4.9 – 使用箱线图绘制分布

在这里,我们可以看到箱线图可以展示一些关于数据分布的信息,例如它的中位数、下四分位数、上四分位数和异常值。为了完全理解箱线图的每个元素,请看以下图表:

![图 4.10 – 箱线图元素图片 B16735_04_010.jpg

图 4.10 – 箱线图元素

通过分析图 4.9中显示的箱线图,我们可以得出结论,ADA 算法在交叉验证过程中呈现了一些异常值,因为其中一个执行产生了一个非常好的模型(大约 92%的准确率)。AdaBoost 的所有其他执行结果都低于 85%的准确率,中位数约为 80%。

在分析图 4.9后,我们可以得出的另一个结论是,CART 算法在交叉验证过程中表现最差(中位数和下四分位数最低)。

在我们结束本节之前,请注意,你也可以使用散点图来分析当你有多个变量时的数据分布。现在,让我们看看另一组有用的图表,用于展示你的数据中的组合。

在你的数据中可视化组合

有时候,你想要分析组成你特性的各种元素;例如,每个地区的销售额百分比或每个渠道的查询百分比。在这两个例子中,我们并没有考虑任何时间维度;相反,我们只是整体地查看数据。对于这类没有时间维度的组合,你可以使用饼图堆积 100%柱状图树状图来展示你的数据。

以下是一个饼图,显示了在预定时间段内,给定公司每个客户渠道的查询数量:

![图 4.11 – 使用饼图绘制组合图片 B16735_04_011.jpg

图 4.11 – 使用饼图绘制组合

如果你想要在考虑时间维度的情况下展示组合,那么你最常见的选项将是堆积面积图堆积 100%面积图堆积柱状图堆积 100%柱状图。为了参考,请看以下图表,它显示了 2016 年至 2020 年各地区的销售额:

![图 4.12 – 使用堆积 100%柱状图绘制组合图片 B16735_04_012.jpg

图 4.12 – 使用堆积 100%柱状图绘制组合

如我们所见,堆积 100%柱状图有助于我们理解不同时期的组合。

建立关键绩效指标

在我们结束这些数据可视化部分之前,我想介绍关键绩效指标,或简称KPI

KPI 通常是一个描述业务指标结果的单一值,例如客户流失率、净推荐值(NPS)、投资回报率(ROI)等等。尽管不同行业有一些常用的指标,但你可以根据你公司的需求自由地提出一个数字。

老实说,与指标相关联的最复杂挑战并不在于它们的可视化方面本身,而在于它们被构建的方式(所使用的规则)以及它们将在公司不同层级之间如何被传达和使用。

从可视化角度来看,就像任何其他单一值一样,您可以使用我们所学到的所有图表来分析您的指标,具体取决于您的需求。然而,如果您只想展示您的关键绩效指标(KPI),没有时间维度,您可以使用一个小部件

好了,关于 AWS 机器学习专业考试中的数据可视化技术,我就说这么多。现在,让我们来看看 Quick Sight,这是一个 AWS 服务,您可以在其中实现您刚刚学到的所有可视化技术。

介绍 Quick Sight

Amazon Quick Sight 是一种基于云的分析服务,允许您构建数据可视化和临时分析。Quick Sight 支持多种数据源,例如 Redshift、Aurora、Athena、RDS 以及您的本地数据库解决方案。

其他数据源包括 S3,您可以从 Excel、CSV 或日志文件中检索数据,以及软件即服务SaaS)解决方案,您可以从 Salesforce 实体中检索数据。

Amazon Quick Sight 有两个版本:

  • 标准版

  • 企业版

这两个版本之间最重要的区别是它们与 Microsoft 活动目录AD)的集成可能性以及静态加密。这两个功能仅在企业版中提供。

重要提示

请记住,AWS 服务不断演变,因此标准版和企业版之间可能在未来出现更多差异。您应始终查阅 AWS 服务的最新文档,以检查有什么新内容。

在访问管理方面,Quick Sight 提供了一个非常简单的界面,您可以使用它来控制用户访问。在标准版中,您邀请用户到您的 Quick Sight 账户有两个主要选项:

  • 您可以邀请一个 IAM 用户。

  • 您可以向电子邮件地址发送邀请。

如果您邀请了一个 IAM 用户,那么他们可以自动登录到您的账户并查看或编辑您的可视化,具体取决于您在 Quick Sight 用户创建过程中提供的权限类型。如果您邀请了一个电子邮件地址,那么电子邮件的所有者必须访问他的/她的邮箱来完成此操作。

删除用户也是一个相当直接的过程。在删除用户时,您必须提供的额外信息是您是否希望将孤立的资源转移到您的账户中的另一个用户,或者您是否希望删除该用户的所有资源。

如果您正在使用企业版,由于您有 AD 在工作,这个过程可能会有些不同。在这种情况下,您可以授予 AD 组的访问权限,该组中的所有用户都将获得对 Quick Sight 账户的访问权限。

此外,请记住,在两个版本中,所有数据传输都是加密的;然而,你只能在企业版中找到静态加密。

当你将数据导入 Quick Sight 时,你实际上在技术上创建了我们所说的数据集。数据集反过来会被导入到 Quick Sight 中,以优化的结构进行导入,这被称为超级快速、并行、内存计算引擎SPICE)。这就是为什么 Quick Sight 能够在大数据上进行数据可视化。

我们知道 Quick Sight 提供高可用性和持久性,因为导入它的数据是复制的。

你还应该知道的是,Quick Sight 不仅允许你绘制数据,还可以执行一些小的数据准备任务,例如重命名字段、计算新字段、更改数据类型、准备查询以从源检索数据以及连接来自同一源的数据表。

让我们总结一下使用 Quick Sight 的主要步骤:

  1. 用户创建和授权。

  2. 连接到数据源

  3. 将数据导入到数据集中。

  4. 你的数据集将被导入到SPICE中。

  5. 从数据集中,你可以创建一个分析

  6. 最后,在你的分析中,你可以添加可视化元素。

  7. 如果你想要更进一步,你可以创建分析快照并将其放置在仪表板中。或者,你也可以将分析分组到故事中。

这就结束了本章关于数据可视化的内容!现在,让我们看看我们学到了什么。

概述

我们已经到达了本章关于数据可视化的结尾。让我们借此机会快速回顾一下我们学到了什么。我们本章开始时向您展示了如何可视化数据中的关系。散点图和气泡图是这一类别中最重要的图表,分别用于显示两个或三个变量之间的关系。

然后,我们转向了数据可视化的另一个类别,旨在比较数据。你可以用来显示比较的最常见图表是柱状图、条形图和折线图。表格也很有用,可以显示比较。

我们接下来讨论的使用案例是可视化数据分布。用于显示分布的最常见图表类型是直方图和箱线图。

然后,我们转向了组合。当我们想要展示构成数据的不同元素时,我们会使用这一组图表。在展示组合时,你必须意识到你想要展示的是静态数据还是随时间变化的数据。对于静态数据,你应该使用饼图、堆叠的 100%条形图或树状图。对于随时间变化的数据,你应该使用堆叠面积图、堆叠 100%面积图、堆叠柱状图或堆叠 100%柱状图。

本章的最后部分是为 Quick Sight 保留的,这是一种 AWS 服务,你可以使用它来可视化你的数据。你了解了服务的不同版本和功能,然后介绍了 SPICE。

干得好!在下一章中,你将学习 AWS 的数据存储服务,如 S3、EBS、EFS 以及许多其他服务。这将是你认证旅程中非常重要的一章,所以请确保你已经准备好了!然而,在我们跳入新的一章之前,让我们再为考试练习一下!

问题

  1. 你正在一家金融科技公司担任数据科学家。目前,你正在开发一个回归模型,预测客户下个月将在信用卡交易上花费多少钱。你认为你已经创建了一个很好的模型;然而,你想要完成残差分析以确认模型误差是围绕零随机分布的。进行这种残差分析的最佳图表是什么?

    a) 折线图

    b) 气泡图

    c) 散点图

    d) 堆积条形图

    答案

    C,在这种情况下,你想要展示模型误差的分布。散点图是展示这种分析的一个很好的方法。模型误差围绕零随机分布只是模型没有过度拟合的更多证据。直方图也适合进行误差分析。

  2. 尽管你认为两个特定的变量高度相关,但你认为这并不是线性相关。了解这两个变量之间的相关类型对于确定你将在项目后期阶段使用的算法类型至关重要。你可以使用哪种类型的图表来展示这两个变量之间的相关性?

    a) 折线图

    b) 气泡图

    c) 直方图

    d) 散点图

    答案

    D,相关性是一种关系类型。在这种情况下,我们只有两个变量,所以散点图是解决这个问题的一个很好的方法。

  3. 你正在一家呼叫中心公司工作,业务团队想要查看他们交互式语音响应设备每个通道的通话百分比。你刚刚得到了这些百分比,按月细分。向用户展示这种月度信息的最佳方式是什么?

    a) 饼图

    b) 堆积 100% 柱状图

    c) 直方图

    d) 散点图

    答案

    B,在这种情况下,你想要展示数据在不同时期内的组成。a 和 b 都可以用来展示组成;然而,只有选项 b 才适合展示每个月的这些组成。

  4. 你正在一家电信公司担任数据科学家。该公司提供许多与宽带、电视、电话和移动相关的不同服务。总共,公司提供超过 50 种服务。你想要查看每个客户通常签约的服务数量。使用哪种最合适的图表来准备这种可视化?

    a) 饼图

    b) 堆积 100% 柱状图

    c) 直方图

    d) 散点图

    答案

    C,由于公司有如此多的服务,你想查看每个客户所拥有的服务数量分布,最合适的图表是直方图。记住,大多数时候,当分析的目标是展示分布时,你最常见的选项是直方图和箱线图。根据具体情况,散点图也可以使用。

  5. 你正在为公司制作一份销售报告,需要对不同地区的销售情况进行不同类型的比较。以下哪种类型的图表适合用于展示你的数据比较(选择所有正确答案)?

    a) 条形图

    b) 柱状图

    c) 折线图

    d) 直方图

    答案

    A, B, C,在用图表展示数据比较方面,你有多种选择。当只有一个变量且没有时间维度时使用条形图;当有一个或两个变量随时间变化时使用柱状图;当有三个或更多变量随时间变化时使用折线图。最后,记住也可以使用表格来展示比较。当你有三个或更多变量时,这尤其有帮助。

  6. 你正在为一个气象组织担任数据科学家。你的公司正在测量整个夏季特定地区的每日温度。夏季已经结束,现在是时候展示所收集数据的详细报告了。以下哪些选项不是有效的分析类型(选择所有正确答案)?

    a) 创建一个箱线图来展示数据的某些统计信息;例如,中位数温度、下四分位数、上四分位数和异常值点。

    b) 创建一个直方图来展示所有不同测量温度的日的数据分布。

    c) 创建一个关键绩效指标,仅用于展示在该特定地区夏季测量的平均温度。

    d) 创建一个折线图来展示温度的每日演变。这将让你对增加和减少的趋势有所了解。

    答案

    所有这些答案都是针对这个特定问题的有效分析类型。箱线图和直方图可以非常有用,用于展示数据的分布;关键绩效指标可以提供一个直接的答案,即“平均温度是多少?”;折线图可以用来展示测量期间数据的趋势。对于这个问题,你可以使用许多其他类型的分析。例如,你可以考虑使用柱状图来展示每个月的平均温度。

  7. 你正在一家金融公司工作,你的团队负责投资组合。你有多个投资选项,它们的关键特征包括年利率、投资期限和投资金额。这三个组成部分之间存在直接关系。你已经创建了一个气泡图来展示这些投资选项之间的关系,但现在,你想要进行比较并添加一些更多维度,例如风险水平和逐年表现。以最紧凑的方式展示这些信息的最合适方法是什么?

    a) 通过添加这些新维度修改你之前创建的当前气泡图。

    b) 创建一个表格来展示这些信息,其中每个投资选项由行表示,每个指标由列表示。

    c) 保持当前气泡图不变,并创建更多可视化来展示新的指标。

    d) 保持当前气泡图不变,并以表格结构展示其余信息。

    答案

    B,你应该意识到,在考试期间,你可能会遇到有多个正确答案的问题;然而,只有一个答案是最佳的。在这种情况下,只有一个选项是错误的,但其他所有选项都是可能的。选项 b 是最准确的答案,因为问题是在询问“最紧凑的方式”来展示信息。在考试期间,请注意问题中的特定关键词。

  8. 你正在为一家营销公司担任数据科学家。目前,你正在构建一个机器学习模型来预测客户流失。你在模型中使用的特征之一是年薪。由于这个变量的性质,你怀疑对数转换将有助于使这个特征更接近正态分布。以下哪个图表将支持你证明,确实,对数转换是这个特征的不错想法?

    a) 直方图

    b) 散点图

    c) 折线图

    d) 堆积条形图

    答案

    A,决定是否对数转换是一个好主意将取决于数据的分布。如果你有一个偏斜的分布,那么对数转换可能有助于将数据更接近正态分布。根据你用于建模的算法,这种转换可以提高你模型的准确性。直方图是正确答案,因为它将展示支持你决策的数据分布。

  9. 你正在为一家科技公司担任数据分析师。你的公司希望分析不同服务线的销售情况,你决定使用 Quick Sight 作为数据可视化工具。以下哪个关于 Quick Sight 的说法是错误的

    a) Quick Sight 将数据集导入 SPICE 以优化数据处理。使用 SPICE,你的分析查询处理速度快,你不需要等待直接查询过程。

    b) 尽管 Quick Sight 可以加密数据传输,但它不支持静态加密。

    c) Quick Sight 可以连接到 Redshift、Aurora、Athena、RDS、本地数据库、S3 和 SaaS。

    d) 当权限授予 Active Directory 组时,该组的用户不会收到通知。

    答案

    B,所有这些答案都是正确的,除了选项 b。Quick Sight 确实支持静态加密,但仅限于企业版。另一个仅在企业版中支持的重要功能是集成 Active Directory。

  10. 你在一家使用 Quick Sight 进行数据可视化的公司工作。以下哪些类型的分析 Quick Sight 支持(选择所有正确答案)?

    a) 分析数据中的关系

    b) 分析数据中的比较

    c) 分析数据中的组成

    d) 分析数据分布

    答案

    Quick Sight 是一款非常出色的工具,它支持我们在本章中学到的所有用例。它不仅支持这些用例,还通过使用 SPICE 优化数据处理。

第五章:数据存储的 AWS 服务

AWS 提供了一系列服务来安全地存储您的数据。在 AWS 上提供了多种存储选项,例如块存储、文件存储和对象存储。由于硬件投资较高、管理开销和系统升级管理,本地数据存储管理成本较高。使用 AWS 存储服务,您只需为使用的部分付费,无需管理硬件。我们还将了解 Amazon S3 提供的各种存储类别,以实现数据的智能访问和降低成本。您可以在考试中期待有关存储类别的题目。随着我们继续本章的学习,我们将掌握 Amazon RDS 的单 AZ 和多 AZ 实例,以及RTO恢复时间目标)和RPO恢复点目标)的概念。

在本章中,我们将通过以下部分学习如何通过以下方式安全地存储我们的数据,以便进行进一步的分析:

  • 在 Amazon S3 上存储数据

  • 控制 S3 存储桶和对象的访问

  • 保护 Amazon S3 上的数据

  • 在静态和传输中保护 S3 对象

  • 使用其他类型的数据存储

  • 关系型数据库服务(RDS)

  • 管理 Amazon RDS 的故障转移

  • 自动备份、RDS 快照、恢复和读取副本

  • 使用具有多主能力的 Amazon Aurora 进行写入

  • 在 Amazon Redshift 上存储列式数据

  • 作为 NoSQL 数据库服务的 Amazon DynamoDB

技术要求

您在本章中需要的只是 AWS 账户和配置好的 AWS CLI。Amazon 详细解释了如何为您的账户配置 AWS CLI 的步骤:docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html

您可以从 GitHub 下载代码示例,这里:github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-5/

在 Amazon S3 上存储数据

S3是亚马逊基于云的对象存储服务,可以通过互联网从任何地方访问。它是大型数据集的理想存储选项。它是基于区域的,因为您的数据存储在特定区域,直到您将数据移动到另一个区域。除非您进行配置,否则您的数据永远不会离开该区域。在特定区域中,数据在该区域的可用区中进行复制;这使得 S3 在区域上具有弹性。如果该区域中的任何可用区发生故障,则其他可用区将处理您的请求。它可以通过 AWS 控制台 UI、AWS CLI、AWS API 请求或标准 HTTP 方法进行访问。

S3 有两个主要组件:存储桶对象

  • 存储桶是在特定的 AWS 区域中创建的。存储桶可以包含对象,但不能包含其他存储桶。

  • 对象有两个主要属性。一个是,另一个是。值是存储的内容,键是名称。对象的最大大小可以是 5 TB。根据此处可用的亚马逊 S3 文档 docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html,对象还具有版本 ID、元数据、访问控制信息和子资源。

    重要提示

    根据亚马逊的文档,S3 为新对象的 PUT 操作提供写后一致性,这意味着如果你放置了一个新对象或创建了一个新对象,然后立即使用其键来读取该对象,那么你会得到你刚刚上传的确切数据。然而,对于覆盖和删除操作,它以最终一致性的方式表现。这意味着如果你在删除或覆盖操作后立即读取一个对象,那么你可能会读取到旧副本或过时的对象版本。将对象内容复制到三个可用区需要一些时间。

可以通过使用前缀来逻辑上维护文件夹结构。让我们以一个例子来说明,一个图像被上传到一个名为 bucket-name-example 的桶中,前缀为 folder-name,对象名称为 my-image.jpg。整个结构看起来像这样:/bucket-name-example/folder-name/my-image.jpg

可以使用桶名 bucket-name-example 和键 /folder-name/my-image.jpg 来读取对象的内容。

亚马逊为存储在 S3 中的对象提供了几种存储类:

  • 标准存储:这是频繁访问的对象和快速访问的存储类。S3 标准具有毫秒级的首字节延迟,并且对象可以被公开访问。

  • 降低冗余 (RR):这个选项比标准存储类提供更少的冗余。可以在此类中存储非关键且可重复的数据。AWS S3 文档建议不要使用此类,因为标准存储类更经济。

  • 标准不频繁访问 (IA):当你需要数据快速返回但不是频繁访问时,使用此选项。对象大小必须至少为 128 KB。最小存储时间为 30 天。如果对象在 30 天内被删除,你仍然会被收取 30 天的费用。标准 IA 对象对可用区的丢失具有弹性。

  • 单区不频繁访问:这种存储类别的对象仅存储在一个可用区,这使得它比标准 IA更便宜。最小对象大小和存储时间与标准 IA相同。从这个存储类别的对象更不可用且更不具弹性。当你有另一个副本或数据可以重新创建时,应使用此存储类。对于长期存储的非关键且可替换的数据,以及访问不频繁的情况,应使用单区 IA存储类。

  • 冰川:此选项用于长期存档和备份。检索此类存储类中的对象可能需要几分钟到几小时。最小存储时间为 90 天。您不能使用 Amazon Glacier API 访问作为对象生命周期管理一部分从 S3 移动到冰川的对象。

  • 冰川深存档:此类的最小存储时间为 180 天。这是最便宜的存储类,默认检索时间为 12 小时。

  • 智能分层:这个存储类旨在减少运营开销。用户支付监控费用,AWS 根据对象的访问模式在标准(频繁访问层)和标准 IA(低成本不频繁访问层)之间选择一个存储类。此选项旨在用于具有未知或不可预测访问模式的长久数据。

通过一系列规则,可以轻松管理存储类之间的转换和对象的删除,这些规则被称为S3 生命周期配置。这些规则包括操作。这些操作可以应用于一个桶或该桶中由前缀或标签定义的一组对象。操作可以是转换操作过期操作。转换操作定义了在创建用户定义天数后的对象的存储类转换。过期操作配置了版本化对象的删除,或删除删除标记或不完整的分片上传。这对于管理成本非常有用。

图 5.1中给出了一个说明。您可以在以下链接中找到更多详细信息:docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html

![图 5.1 – S3 存储类的比较表]

![图片/B16735_05_001.jpg]

图 5.1 – S3 存储类的比较表

创建桶以存储数据

现在,让我们看看如何使用 AWS CLI 创建桶、上传对象和读取对象。

  1. 在第一步中,我们将使用aws s3 ls命令检查是否创建了任何桶:

    $ pwd
    /Users/baba/AWS-Certified-Machine-Learning-Specialty-
    2020-Certification-Guide/Chapter-5/s3demo/demo-files
    $ aws s3 ls
    
  2. 此命令在此处没有返回任何内容。因此,我们将使用mb参数创建一个桶。假设桶名为demo-bucket-baba,位于us-east-1区域:

    $ aws s3 mb s3://demo-bucket-baba --region us-east-1
    make_bucket: demo-bucket-baba
    $ aws s3 ls
    2020-11-04 14:39:50 demo-bucket-baba
    
  3. 我们已经创建了一个桶,下一步是将文件复制到我们的桶中,使用cp参数,如下面的代码所示:

    $ aws s3 cp sample-file.txt s3://demo-bucket-baba/
    upload: ./sample-file.txt to s3://demo-bucket-
    baba/sample-file.txt
    
  4. 要通过 AWS 控制台验证文件上传操作,请登录您的 AWS 账户并转到 AWS S3 控制台查看相同的内容。AWS S3 控制台列出了如图图 5.2所示的结果。控制台在您阅读本书时可能已经发生变化!![图 5.2 – AWS S3 截图以列出您的文件]

    ![图片/B16735_05_002.jpg]

    --recursive will do the job for you:
    
    

    cp命令和--recursive参数。为了实现这一点,您将需要创建两个桶,demo-bucket-baba-copied 和 demo-bucket-baba-moved。步骤如下:

    $ aws s3 mb s3://demo-bucket-baba-copied --region us-east-2
    $ aws s3 mb s3://demo-bucket-baba-moved --region us-east-2
    $ aws s3 cp s3://demo-bucket-baba s3://demo-bucket-baba-copied/ --recursive
    $ aws s3 mv s3://demo-bucket-baba s3://demo-bucket-baba-moved/ --recursive
    $ aws s3 ls 
    2020-11-04 14:39:50 demo-bucket-baba
    2020-11-04 15:44:28 demo-bucket-baba-copied
    2020-11-04 15:44:37 demo-bucket-baba-moved
    $ aws s3 ls s3://demo-bucket-baba/
    

    如果所有命令都成功运行,那么原始存储桶最终应该是空的(因为所有文件现在都已移动)。注意:在认证考试中,您不会找到很多关于存储桶和对象级操作的问题。然而,了解基本操作和所需步骤总是更好的。

    
    
  5. 一旦动手实践完成,必须删除存储桶以避免成本。在提供rb命令之前,存储桶必须为空:

    $ aws s3 rb s3://demo-bucket-baba
    $ aws s3 rb s3://demo-bucket-baba-moved
    remove_bucket failed: s3://demo-bucket-baba-moved An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty
    
  6. demo-bucket-baba-moved存储桶不为空,因此我们无法删除该存储桶。在这种情况下,使用--force参数删除整个存储桶及其所有内容,如下所示:

    rm command with the --recursive parameter. 
    
  7. 让我们以一个具有前缀images的存储桶test-bucket为例。这个前缀包含四个名为animal.jpgdraw-house.jpgcat.jpghuman.jpg的图像文件。

  8. 现在,为了删除图像中的内容,命令如下:aws s3 rm s3://test-bucket/images –recursive

  9. 现在存储桶应该是空的。

在下一节中,我们将学习关于对象标签和对象元数据的内容。

区分对象标签和对象元数据

让我们比较这两个术语:

  • 对象标签:对象标签是一个键值对。AWS S3 对象标签可以帮助您过滤分析和指标,对存储进行分类,根据某些分类对对象进行安全保护,根据对象的某些分类跟踪成本,以及更多。对象标签可以用来创建生命周期规则,将对象移动到更便宜的存储层。您可以为对象添加最多 10 个标签,为存储桶添加最多 50 个标签。标签键可以包含 128 个 Unicode 字符,而标签值可以包含 256 个 Unicode 字符。

  • 对象元数据:对象元数据是描述对象的描述性数据。它由名称-值对组成。对象元数据作为 HTTP 头在对象上返回。它们有两种类型:一种是系统元数据,另一种是用户定义元数据。用户定义元数据是用户添加到对象中的自定义名称-值对。名称必须以x-amz-meta开头。您可以更改对象上的所有系统元数据,如存储类、版本控制和加密属性。更多详细信息请参阅docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

    重要提示

    元数据名称不区分大小写,而标签名称区分大小写。

在下一节中,我们将学习如何通过不同的策略控制 Amazon S3 上存储桶和对象的访问,包括资源策略和身份策略。

控制对 Amazon S3 上存储桶和对象的访问

一旦对象存储在存储桶中,下一个主要步骤就是管理访问。S3 默认是私有的,并且通过多种方法向其他用户、组或资源提供访问权限。这意味着可以通过 访问控制列表(ACLs)、公共访问设置身份策略存储桶策略 来管理对象的访问权限。

让我们详细看看其中的一些。

S3 存储桶策略

Principal 被渲染为 *

{
  "Version":"2012-10-17"
  "Statement":[
    {
      "Sid":"AnyoneCanRead",
      "Effect":"Allow",
      "Principal":"*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::my-bucket/*"]
    }
    ]
}

默认情况下,S3 中的所有内容都对所有者私有。如果我们想将前缀公开给全世界,那么资源将变为 arn:aws:s3:::my-bucket/some-prefix/*,同样,如果它是为特定的 IAM 用户或 IAM 组设计的,那么这些详细信息将进入策略中的主体部分。

也可以在存储桶策略中添加条件。让我们考察一个组织希望保持存储桶公开并白名单特定 IP 地址的用例。策略可能看起来像这样:

{ 
  "Version":"2012-10-17" 
  "Statement":[ 
    { 
      "Sid":"ParticularIPRead", 
      "Effect":"Allow", 
      "Principal":"*", 
      "Action":["s3:GetObject"], 
      "Resource":["arn:aws:s3:::my-bucket/*"], 
      "Condition":{
        "NotIpAddress":{"aws:SourceIp":"2.3.3.6/32"}
      }
    } 
    ] 
}

更多示例可在 AWS S3 开发者指南中找到,链接如下:docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html

阻止公共访问 是为存储桶所有者提供的单独设置,以避免在存储桶策略中犯任何错误。在实际场景中,存储桶可能会由于策略错误而公开;为了避免此类错误或数据泄露,AWS 提供了此设置。它提供了比存储桶策略更高的安全级别。你可以在创建存储桶时选择此设置,也可以在创建存储桶后设置。

(示例中的 us-east-1):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "rds:*",
            "Resource": ["arn:aws:rds:us-east-1:*:*"]
        },
        {
            "Effect": "Allow",
            "Action": ["rds:Describe*"],
            "Resource": ["*"]
        }
    ]
}

访问控制列表(ACLs)用于授予高级权限,通常用于授予对其他 AWS 账户的访问权限。ACLs 是存储桶或对象的 子资源 之一。存储桶或对象可以通过 ACLs 快速公开。AWS 不建议这样做,你也不应该在测试中期待有关此问题的问题。了解这一点是好的,但它不如 S3 存储桶策略 灵活。

现在,让我们在下一节中了解保护我们数据的方法。

保护 Amazon S3 上的数据

在本节中,我们将学习如何记录对象的每个版本。除了持久性之外,Amazon 还提供了几种技术来保护 S3 中的数据。其中一些技术涉及启用版本控制和加密对象。

版本控制可以帮助你在更新、删除或上传操作中,如果当前对象出现任何问题,回滚到之前的版本。

通过加密,你可以控制对象的访问。你需要适当的密钥来读取和写入对象。我们还将学习多因素认证(MFA)用于删除操作。亚马逊还允许跨区域复制(CRR),在另一个区域中维护对象的副本,这可以在任何灾难期间用于数据备份,以提供额外的冗余,或者用于提高不同区域的数据访问速度。

应用存储桶版本控制

让我们现在通过一些实际操作示例来了解如何使用帮助启用存储桶版本控制。可以在创建存储桶时从 AWS S3 控制台应用存储桶版本控制:

  1. 要从命令行启用存储桶的版本控制,必须首先创建存储桶,然后才能启用版本控制,如下例所示。在这个例子中,我已经创建了一个存储桶,version-demo-mlpractice,并通过put-bucket-versioning命令启用了版本控制:

    $ aws s3 mb s3://version-demo-mlpractice/
    $ aws s3api put-bucket-versioning --bucket version-demo-mlpractice --versioning-configuration Status=Enabled
    $ aws s3api get-bucket-versioning --bucket version-demo-mlpractice
    {
        "Status": "Enabled"
    }
    
  2. 我们没有使用任何加密方式创建这个存储桶。因此,如果你运行aws s3api get-bucket-encryption --bucket version-demo-mlpractice,它将输出一个错误,显示以下内容:

    The server side encryption configuration was not found
    
  3. put-bucket-encryption API。命令看起来是这样的:

    $ aws s3api put-bucket-encryption --bucket version-demo-mlpractice --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":
    {"SSEAlgorithm":"AES256"}}]}'
    
  4. 同样可以使用以下命令进行验证:aws s3api get-bucket-encryption --bucket version-demo-mlpractice

我们将在下一节中了解更多关于加密的内容。

应用存储桶加密

你还需要了解在存储桶上启用版本控制将如何帮助。有一些用例中,文件会定期更新,并且将为同一文件创建版本。为了模拟这种场景,请尝试以下示例:

  1. 在这个例子中,我们将创建一个包含版本信息的文件。我们将覆盖它并检索它以检查该文件中的版本:

    $ echo "Version-1">version-doc.txt
    $ aws s3 cp version-doc.txt s3://version-demo-mlpractice
    $ aws s3 cp s3://version-demo-mlpractice/version-doc.txt 
    check.txt
    $ cat check.txt
    Version-1
    $ echo "Version-2">version-doc.txt
    $ aws s3 cp version-doc.txt s3://version-demo-mlpractice
    $ aws s3 cp s3://version-demo-mlpractice/version-doc.txt 
    check.txt
    $ cat check.txt
    Version-2
    
  2. 在检索时,我们得到了文件的最新版本,换句话说,在这个例子中是Version-2。要检查每个版本以及它们的最新版本,S3 提供了list-object-versions API,如下所示。从 JSON 结果中,你可以推断出最新版本:

    $ aws s3api list-object-versions 
    --bucket version-demo-mlpractice
    {
        "Versions": [
            {
                "ETag": 
    "\"b6690f56ca22c410a2782512d24cdc97\"",
                "Size": 10,
                "StorageClass": "STANDARD",
                "Key": "version-doc.txt",
                "VersionId": 
    "70wbLG6BMBEQhCXmwsriDgQoXafFmgGi",
                "IsLatest": true,
                "LastModified": "2020-11-07T15:57:05+00:00",
                "Owner": {
                    "DisplayName": "baba",
                    "ID": "XXXXXXXXXXXX"
                }
            },
            {
                "ETag": "\"5022e6af0dd3d2ea70920438271b21a2\"",
                "Size": 10,
                "StorageClass": "STANDARD",
                "Key": "version-doc.txt",
                "VersionId": "f1iC.9L.MsP00tIb.sUMnfOEae240sIW",
                "IsLatest": false,
                "LastModified": "2020-11-07T15:56:27+00:00",
                "Owner": {
                    "DisplayName": "baba",
                    "ID": " XXXXXXXXXXXX"
                }
            }
        ]
    }
    
  3. 可能会有这样的情况,你需要将当前对象的早期版本回滚。在前面的例子中,最新的是Version-2。你可以通过将VersionId子资源解析到get-object API 调用中,并重新上传该对象,将任何所需的版本设置为最新或当前版本。另一种方法是,通过在delete-object API 请求中将versionId传递到–version-id参数中,删除当前或最新版本。更多关于 API 的详细信息,请参阅此处:docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html

  4. 当你在启用了版本控制的存储桶中删除一个对象时,并不会从存储桶中删除该对象。它只是创建了一个名为DeleteMarker的标记。它看起来是这样的:

    $ aws s3api delete-object --bucket version-demo-mlpractice --key version-doc.txt
    {
        "DeleteMarker": true,
        "VersionId": "BKv_Cxixtm7V48MWqBO_KUkKbcOaH5JP"
    }
    
  5. 这意味着对象没有被删除。你可以使用以下命令列出它:

    aws s3api list-object-versions --bucket version-demo-mlpractice
    
  6. 现在存储桶中没有名为version-doc.txt的对象,您可以使用aws s3 ls命令来验证这一点,因为该标记已成为具有新 ID 的对象的当前版本。如果您尝试检索已删除的对象,这意味着删除标记正在充当对象的当前版本,那么您将获得一个VersionId,如下面的示例命令所示。一个简单的删除请求(不带版本 ID)不会删除删除标记并创建另一个具有唯一版本 ID 的删除标记。因此,对于同一对象可以有多个删除标记。在此需要注意的是,这将消耗您的存储空间,并且您将为此付费:

    $ aws s3 ls s3://version-demo-mlpractice/
    $ aws s3api delete-object --bucket version-demo-mlpractice --key version-doc.txt --version-id BKv_Cxixtm7V48MWqBO_KUkKbcOaH5JP
    {
        "DeleteMarker": true,
        "VersionId": "BKv_Cxixtm7V48MWqBO_KUkKbcOaH5JP"
    }
    
  7. 在现在列出存储桶时,可以看到较旧的对象:

    $ aws s3 ls s3://version-demo-mlpractice/
    2020-11-07 15:57:05         10 version-doc.txt
    

    由于我们已经涵盖了考试主题并练习了大多数所需的概念,我们应该删除存储桶中的对象,然后删除存储桶以节省成本。此步骤将删除对象的版本,从而永久删除对象。

  8. 在这里,通过向其提供版本 ID,然后是另一个版本 ID 来删除最新版本:

    $ aws s3api delete-object --bucket version-demo-mlpractice --key version-doc.txt --version-id 70wbLG6BMBEQhCXmwsriDgQoXafFmgGi
    $ aws s3api delete-object --bucket version-demo-mlpractice --key version-doc.txt --version-id f1iC.9L.MsP00tIb.sUMnfOEae240sIW
    $ aws s3api list-object-versions --bucket version-demo-mlpractice
    

    我们现在可以清楚地看到空存储桶了。

    重要提示

    AWS 最佳实践建议通过多因素认证删除添加另一层保护。可以防止意外删除存储桶,并确保存储桶中对象的安全性。可以通过控制台和 CLI 启用或禁用多因素认证删除。如 AWS 文档所述,多因素认证删除需要两种认证方式同时进行:您的安全凭证,以及一个有效序列号、一个空格和显示在批准的认证设备上的六位代码的组合。

CRR 可以帮助您在不同地理区域之间分离数据。一个典型的用例是在灾难期间的正常业务活动。如果某个区域发生故障,则另一个区域可以在 CRR 启用的情况下支持用户。这提高了数据可用性。另一个用例是如果同一数据被另一个计算资源使用,例如在另一个区域启动的 EC2 或 AWS Lambda,可以减少延迟。您还可以使用 CRR 将对象复制到属于不同所有者的另一个 AWS 账户。对于认证考试,以下是一些重要要点值得记录:

  • 为了使用 CRR,必须在源和目标存储桶上启用版本控制。

  • 通过添加规则,在源存储桶上启用了复制。作为源,可以是整个存储桶、前缀或标签进行复制。

  • 通过分配适当的加密密钥,加密对象也可以进行复制。

  • 目标存储桶可以位于同一账户或另一个账户。您可以在目标存储桶中更改对象的存储类型和所有权。

  • 对于 CRR,可以选择现有的角色或创建新的 IAM 角色。

  • 源存储桶上可以有多个复制规则,并赋予其优先级。优先级较高的规则会覆盖优先级较低的规则。

  • 当你添加复制规则时,只有规则启用后创建的新版本对象才会被复制。

  • 如果从源存储桶中删除了版本,则它们不会被从目标存储桶中删除。

  • 当你从源存储桶中删除一个对象时,它会在该源存储桶中创建一个删除标记。S3 不会将此删除标记复制到目标存储桶。

在下一节中,我们将介绍保护 S3 对象的概念。

保护静态和传输中的 S3 对象

在前一节中,我们学习了存储桶默认加密的概念,这与对象级加密完全不同。存储桶没有被加密,而对象被加密。这里可能会出现一个问题:什么是存储桶默认加密? 我们将在本节中学习这些概念。在传输过程中,可以使用安全套接字层(SSL)传输层安全性(TLS)来保护 HTTPS 请求的传输。下一步是保护数据,授权人员可以编码和解码数据。

在同一个存储桶中,可以对不同的对象有不同的加密设置。S3 支持对象静态存储的客户端加密(CSE)服务器端加密(SSE)

  • 客户端加密:客户端通过 S3 端点将对象上传到 S3。在客户端加密(CSE)中,数据在上传到 S3 之前由客户端加密。尽管用户和 S3 端点之间的传输发生在加密通道中,但通道中的数据已经被客户端加密,无法被看到。在传输过程中,默认通过 HTTPS 进行加密。因此,AWS S3 存储加密对象,在任何时候都无法以任何格式读取数据。在 CSE 中,客户端负责加密对象内容。因此,在密钥管理和加密解密过程中,控制权始终在客户端。这导致 CPU 使用量巨大。S3 仅用于存储。

  • 服务器端加密:客户端通过 S3 端点将对象上传到 S3。尽管传输中的数据通过使用 HTTPS 的加密通道,但对象本身在通道内没有被加密。一旦数据到达 S3,它就会被 S3 服务加密。在 SSE 中,你信任 S3 执行加密解密、对象存储和密钥管理。S3 对象有三种 SSE 技术可用:

    a) SSE-C

    b) SSE-S3

    c) SSE-KMS

  • 在进行PUT操作时,用户必须向 S3 提供密钥和对象。S3 使用提供的密钥加密对象,并将哈希(加密文本)附加到对象上。一旦对象被存储,S3 就会丢弃加密密钥。这个生成的哈希是一次的,不能用来生成新的密钥。当用户提供带有解密密钥的GET操作请求时,哈希会识别是否使用了特定的密钥进行加密。然后,S3 解密并丢弃密钥。

  • PUT操作中,用户只需提供未加密的对象。S3 创建一个用于加密过程的密钥。由于这个密钥是在内部创建、旋转并由 S3 端到端管理的,因此没有人可以更改这个主密钥。这是对象的唯一密钥。它默认使用 AES-256 算法。

  • 使用存储在 AWS 密钥管理服务(SSE-KMS)中的客户主密钥进行服务器端加密AWS 密钥管理服务(KMS)管理客户主密钥(CMK)。AWS S3 与 AWS KMS 协作并生成一个 AWS 管理的 CMK。这是 SSE-KMS 默认使用的密钥。每次上传对象时,S3 都会使用一个专用的密钥来加密该对象,而这个密钥是一个数据加密密钥(DEK)。DEK 由 KMS 使用 CMK 生成。S3 提供了 DEK 的明文版本和加密版本。DEK 的明文版本用于加密对象然后被丢弃。DEK 的加密版本与加密对象一起存储。当您使用 SSE-KMS 时,不需要使用 S3 创建的默认 CMK。您可以创建并使用客户管理的 CMK,这意味着您可以控制其上的权限以及密钥材料的旋转。因此,如果您所在的组织中有一个关注密钥旋转或加密用户与解密用户之间角色分离的监管委员会,那么 SSE-KMS 是解决方案。在 SSE-KMS 上还可以进行日志记录和审计,以跟踪针对密钥的 API 调用。

  • PUT操作。

在下一节中,我们将了解一些与 EC2 实例一起使用的数据存储。

使用其他类型的数据存储

弹性块存储(EBS)用于在可用区创建卷。该卷只能连接到同一可用区内的 EC2 实例。Amazon EBS 提供SSD(固态硬盘)HDD(硬盘驱动器)类型的卷。对于基于 SSD 的卷,主导的性能属性是IOPS(每秒输入输出),而对于 HDD 则是吞吐量,通常以 MiB/s 来衡量。以下表格在图 5.3中提供了不同卷和类型的概述:

![图 5.3 – 不同卷及其用例]

![图片/B16735_05_003.jpg]

图 5.3 – 不同卷及其用例

EBS对可用区(AZ)具有容错性。如果由于某种原因,一个 AZ 失败,那么卷将无法访问。为了避免这种情况,可以从 EBS 卷创建快照,并且快照存储在 S3 中。一旦快照到达 S3,快照中的数据就具有区域容错性。第一个快照是卷上数据的完整副本,从那时起,快照是增量式的。快照可以用来克隆卷。由于快照存储在 S3 中,可以在该区域的任何 AZ 中克隆卷。快照可以在区域之间共享,并且可以在灾难恢复期间从它们克隆卷。

AWS KMS 管理 CMK。AWS KMS 可以使用 AWS 管理的 CMK 来管理 EBS,或者 AWS KMS 可以使用客户管理的 CMK。当创建加密卷时,EBS 会使用 CMK。CMK 用于创建一个加密的 DEK,该 DEK 与卷一起存储在物理磁盘上。这个 DEK 只能通过 KMS 解密,前提是该实体有解密权限。当从加密卷创建快照时,快照会使用相同的 DEK 进行加密。从该快照创建的任何卷也将使用该 DEK。

实例存储卷是物理连接到 EC2 实例的块存储设备。由于实例附加的临时存储来自实例启动的主机,因此它们提供最高的性能。EBS 可以在任何时候附加到实例,但实例存储必须在实例启动时附加;一旦实例启动,就不能再附加。如果 EC2 实例的底层主机存在问题,则相同的实例将在另一个主机上启动,并带有新的实例存储卷,而早期的实例存储(临时存储)和旧数据将丢失。附加卷的大小和能力取决于实例类型,更详细的信息可以在这里找到:aws.amazon.com/ec2/instance-types/

弹性文件系统(EFS)提供了一种基于网络的文件系统,可以在 Linux EC2 实例内部挂载,并且可以一次由多个实例使用。它是NFSv4的实现。它可以用于通用模式、最大 I/O 性能模式(用于科学分析或并行计算)、突发模式和预配吞吐量模式。

正如我们所知,在实例存储的情况下,数据是易变的。一旦实例丢失,数据就会从实例存储中丢失。对于 EFS 来说并非如此。EFS 与 EC2 实例存储是分开的。EFS 是一个文件存储,通过 VPC 内部的挂载目标被多个 EC2 实例访问。本地系统可以通过混合网络访问 EFS 存储,例如VPNDirect Connect。EFS 还支持两种存储类别:标准和高频访问。标准用于频繁访问的数据。高频访问是长期存储、较少访问数据的成本效益存储类别。可以使用生命周期策略在存储类别之间转换数据。

重要提示

对于最大 I/O 需求,实例存储是首选,如果数据可替换且临时。

关系型数据库服务(RDSes)

这是在 AWS 考试中最常见的考试主题之一。在考试之前,你应该具备足够的知识。在本节中,我们将学习关于 Amazon 的 RDS。

AWS 为用户提供了几种关系型数据库作为服务。用户也可以在 EC2 实例上运行他们想要的数据库。最大的缺点是实例在一个区域的可用区中仅可用。EC2 实例必须被管理和监控,以避免任何类型的故障。需要自定义脚本来维护数据备份。任何数据库主要或次要版本更新都会导致停机。在 EC2 实例上运行的数据库实例在数据库负载增加时无法轻松扩展,因为复制不是一项容易的任务。

RDS 提供可管理的数据库实例,这些实例本身可以包含一个或多个数据库。想象一下,在一个 EC2 实例上运行数据库服务器,而你不需要管理或维护它。你只需要访问服务器并在其中创建数据库。AWS 将管理其他一切,例如实例的安全性、实例上运行的操作系统、数据库版本以及数据库服务器的高可用性。RDS 支持多种引擎,如 MySQL、Microsoft SQL Server、MariaDB、Amazon Aurora、Oracle 和 PostgreSQL。你可以根据自己的需求选择其中任何一种。

Amazon RDS 的基础是一个数据库实例,它可以支持多种引擎,并且用户可以创建多个数据库。一个数据库实例只能通过使用主实例的数据库CNAME(CNAME 是域名系统数据库中规范名称的别名)来访问。RDS 使用标准数据库引擎。因此,使用某种工具在自管理的数据库服务器上访问数据库与访问 Amazon RDS 相同。

既然我们已经了解了 Amazon RDS 的需求,让我们了解 Amazon RDS 中的故障转移过程。我们将介绍如果 RDS 实例出现问题,Amazon 提供哪些服务。

管理 Amazon RDS 的故障转移

RDS 实例可以是单可用区多可用区。在多可用区中,多个实例协同工作,类似于活动-被动故障转移设计。

对于单可用区 RDS 实例,可以为该实例分配存储。简而言之,单可用区 RDS 实例在同一可用区中有一个可用的附加块存储(EBS 存储)。这使得 RDS 实例的数据库和存储容易受到可用区故障的影响。分配给块存储的存储可以是 SSD(gp2 或 io1)或磁性存储。为了确保 RDS 实例的安全,建议使用安全组并根据需求提供访问权限。

多可用区始终是避免任何故障并保持应用程序高可用性的最佳架构设计方式。利用多可用区功能,备用副本会与主体实例同步保持同步。备用实例在其指定的可用区有自己的存储。备用副本不能直接访问,因为所有 RDS 访问都是通过单个数据库 CNAME。除非发生故障转移,否则无法访问备用实例。备用实例不提供性能优势,但它确实在 RDS 实例的可用性方面构成改进。它只能在同一区域发生,即在 VPC 内同一区域的另一个可用区的子网中。当多可用区 RDS 实例在线时,你可以从备用副本中备份,而不会影响性能。在单可用区实例中,备份操作期间可能会出现可用性和性能问题。

要理解多可用区(multi-AZ)的工作原理,让我们以一个单可用区(single-AZ)的实例为例,并将其扩展到多可用区。

假设你有一个运行在名为db-vpc的 VPC 内us-east-1区域AZ-A的 RDS 实例。这成为了一个 RDS 实例单可用区设计的主体实例。在这种情况下,将在AZ-A可用区为该实例分配存储。一旦你选择在另一个名为AZ-B的可用区进行多可用区部署,AWS 将在db-vpc VPC 内us-east-1区域的AZ-B可用区创建一个备用实例,并在us-east-1区域的AZ-B为备用实例分配存储。除此之外,RDS 将从主体实例到备用副本启用同步复制。正如我们之前所学的,访问我们的 RDS 实例的唯一方式是通过数据库 CNAME,因此,访问请求会发送到 RDS 主体实例。一旦写入请求到达端点,它就会写入主体实例。然后它将数据写入硬件,这是附加到主体实例的块存储。同时,主体实例将相同的数据复制到备用实例。最后,备用实例将数据提交到其块存储。

主实例将数据写入硬件,并并行地将数据复制到备用实例,因此在它们各自的硬件中的数据提交操作之间有最小的时间延迟(几乎为零)。如果主实例发生错误,RDS 会检测到这一点并将数据库端点更改为备用实例。访问数据库的客户端可能会经历非常短暂的中断。这种故障转移在 60-120 秒内发生。它不提供容错系统,因为在故障转移操作期间会有一些影响。

您现在应该已经理解了 Amazon RDS 的故障转移管理。现在,让我们学习如何自动备份 RDS,使用快照在发生任何故障时进行恢复,以及下一节中的读取副本。

自动备份、RDS 快照、恢复和读取副本

在本节中,我们将了解 RDS 的自动备份手动快照是如何工作的。这些功能是 Amazon RDS 的一部分。

让我们考虑一个每天早上 5 点进行备份的数据库。如果应用程序在上午 11 点失败,那么可以从上午 11 点进行的备份中重新启动应用程序,但会丢失 6 小时的数据。这被称为 6 小时RPO(恢复点目标)。因此,RPO 是指最近一次备份和事件之间的时间,这定义了数据丢失的数量。如果您想减少这个时间,那么您必须安排更多的增量备份,这将增加成本和备份频率。如果您的业务需要更低的 RPO 值,那么业务必须为满足技术解决方案投入更多的资金。

现在,根据我们的例子,一位工程师被分配了这个任务,在灾难发生时尽快将系统上线。工程师通过向现有系统添加一些额外的硬件组件并安装一些更新的软件版本,在同一天下午 2 点成功将数据库上线。这被称为 3 小时RTO(恢复时间目标)。因此,RTO 是指灾难恢复和完全恢复之间的时间。通过拥有备用硬件和记录恢复过程,可以降低 RTO 值。如果业务需要更低的 RTO 值,那么您的业务必须在备用硬件和有效的系统设置上投入更多的资金以执行恢复过程。

在 RDS 中,RPO 和 RTO 在选择自动备份手动快照时发挥着重要作用。这两个备份服务都使用 AWS 管理的 S3 存储桶,这意味着它不能在用户的 AWS S3 控制台中可见。它是区域弹性,因为备份被复制到 AWS 区域中的多个可用区。对于单 AZ RDS 实例,备份是从单个可用的数据存储进行的,而对于已启用多 AZ 的 RDS 实例,备份是从备用数据存储(主存储在备份方面保持不变)进行的。

快照是针对 RDS 实例的手动操作,并且这些快照存储在 AWS 管理的 S3 桶中。RDS 实例的第一个快照是数据的完整副本,后续的快照是增量备份,反映了数据的变化。在快照过程的耗时方面,第一个快照所需时间较长,从那时起,增量备份会更快。当任何快照发生时,它可能会影响单 AZ RDS 实例的性能,但不会影响多 AZ RDS 实例的性能,因为这是在备用数据存储上发生的。手动快照不会过期,需要自动清除,并且它们会存在于 RDS 实例终止之后。当你删除 RDS 实例时,它会建议为你创建一个最后的快照,并且这个快照将包含你 RDS 实例内部的所有数据库(RDS 实例中不仅仅只有一个数据库)。当你从手动快照恢复时,你将恢复到单个时间点,这会影响 RPO。

要自动化整个流程,你可以选择一个时间窗口来捕捉这些快照。这被称为自动备份。这些时间窗口可以明智地管理,从而本质上降低业务的 RPO(恢复点目标)值。自动备份的保留期为 0 到 35 天,其中 0 表示禁用,最大值为 35 天。根据 AWS 文档,保留的自动备份包含数据库实例的系统快照和事务日志。它们还包括数据库实例属性,如分配的存储和数据库实例类别,这些是将其恢复为活动实例所必需的。数据库生成事务日志,这些日志包含特定数据库中的实际数据变化。这些事务日志每 5 分钟由 RDS 写入 S3。事务日志还可以在快照之上重放,以恢复到 5 分钟粒度的时间点。理论上,RPO 可以是一个 5 分钟的时间点。

当您执行还原操作时,RDS 会创建一个新的 RDS 实例,这意味着一个新的数据库端点来访问该实例。使用这些实例的应用程序必须指向新的地址,这会显著影响 RTO。这意味着还原过程并不非常快,这会影响 RTO。为了在故障期间最小化 RTO,您可以考虑复制数据。使用副本,复制损坏数据的机会很高。克服这一点的唯一方法是拥有快照,并且 RDS 实例可以恢复到损坏之前的时间点。Amazon RDS 读取副本与多区域副本不同。在多区域 RDS 实例中,备用副本不能直接用于任何操作,除非主实例故障,而读取副本可以直接使用,但仅限于读取操作。读取副本有自己的数据库端点,读取密集型应用程序可以直接指向此地址。它们与主实例异步保持同步。读取副本可以在与主实例相同的区域或不同区域创建。其他区域的读取副本称为跨区域读取副本,这提高了应用程序的全球性能。

根据 AWS 文档,每个数据库实例允许有五个直接读取副本,这有助于扩展读取性能。由于异步复制,读取副本具有非常低的 RPO 值。在主实例故障的情况下,它们可以被提升为读写数据库实例。这可以快速完成,并且提供了相当低的 RTO 值。

在下一节中,我们将了解亚马逊自己的数据库引擎,Amazon Aurora。

使用多主功能写入 Amazon Aurora

Amazon Aurora 是亚马逊开发的最可靠的数据库引擎,以简单和成本效益的方式提供速度。Aurora 使用单个主实例和零个或多个副本的集群。Aurora 的副本可以为您提供 RDS 中的读取副本和多区域实例的优势。Aurora 使用共享集群卷进行存储,并可供集群中所有计算实例(最多 64 TiB)使用。这允许 Aurora 集群更快地提供资源,并提高可用性和性能。Aurora 使用基于 SSD 的存储,提供高 IOPS 和低延迟。与其它 RDS 实例不同,Aurora 不要求您分配存储,它基于您使用的存储。

Aurora 集群有多个端点,包括集群端点读取端点。如果没有副本,则集群端点与读取端点相同。如果有可用的副本,则读取端点在读取端点之间进行负载均衡。集群端点用于读写,而读取端点旨在从集群中读取。如果您添加更多副本,则 AWS 在幕后为新副本管理负载均衡。

当发生故障转移时,副本会被提升到读写模式,这需要一些时间。在 Aurora 集群的多主模式下可以避免这种情况。这允许多个实例同时执行读写操作。

在 Amazon Redshift 上存储列式数据

Amazon Redshift 不用于实时事务处理,但用于数据仓库目的。它设计用于支持 PB 级规模的大量数据。它是一个基于列的数据库,用于分析、长期处理、维护和聚合。Redshift Spectrum可以用于查询 S3 上的数据,而无需将数据加载到 Redshift 集群中(尽管需要 Redshift 集群)。它不是 OLTP,而是 OLAP。AWS QuickSight可以与 Redshift 集成进行可视化,它提供了一个类似 SQL 的界面,允许您使用 JDBC/ODBC 连接进行数据查询。

Redshift 在 VPC 中的一个可用区使用集群架构,节点间具有更快的网络连接。它不是设计为高可用性,因为它与可用区紧密耦合。一个 Redshift 集群有一个主节点,该节点负责客户端与集群计算节点之间的所有通信、查询规划和聚合。计算节点负责运行由主节点提交的查询并存储数据。默认情况下,Redshift 使用公共网络与外部服务或任何 AWS 服务进行通信。通过增强 VPC 路由,可以通过自定义网络设置进行控制。

作为 NoSQL 数据库即服务的 Amazon DynamoDB

Amazon DynamoDB 是 AWS 中的一种 NoSQL 数据库即服务产品。它是一个完全管理的键/值和文档数据库。通过其端点可以轻松访问 DynamoDB。输入和输出吞吐量可以手动或自动管理或扩展。它还支持数据备份、时间点恢复和数据加密。在本章中,我们不会涵盖 DynamoDB 表结构或键结构,因为这对于认证考试不是必需的。然而,了解它们的基本知识是好的。有关更多详细信息,请参阅此处可用的 AWS 文档:docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.html

摘要

在本章中,我们学习了亚马逊的各种数据存储服务以及如何通过各种策略来保护数据,并使用这些服务。如果您正在处理机器学习用例,那么您可能会遇到这样的场景,您必须为您的需求选择一个有效的数据存储服务。

在下一章中,我们将学习存储数据的处理。

问题

  1. 要设置 S3 存储桶存储的区域,您必须首先创建存储桶,然后单独设置区域。

    A. 是的

    B. 错误

  2. 为了复制 S3 存储桶的内容,是否必须将源存储桶和目标存储桶放在同一个区域?

    A. 是的

    B. 错误

  3. 默认情况下,存储桶中的对象是私有的。

    A. 是的

    B. 错误

  4. 通过 WS,S3 对象是不可变的,您只能执行 put 和 delete。重命名是具有不同名称的同一对象的 GET 和 PUT。

    A. 是的

    B. 错误

  5. 如果用户在同一个存储桶中存储了一个未版本化的对象和一个版本化的对象,那么用户只能删除未版本化的对象。版本化对象不能被删除。

    A. 是的

    B. 错误

    答案

    版本控制适用于整个存储桶而不是对象。如果存储桶上启用了版本控制,则只能暂停;不能禁用。

  6. 对删除标记的简单删除请求将:

    A. 删除删除标记

    B. 创建删除标记的副本

    C. 不删除删除标记,但会创建另一个删除标记

    D. 删除对象的原始版本

  7. 通过 RDS 多可用区实例可以提高扩展性和性能。

    A. 是的

    B. 错误

    答案

    RDS 多可用区与扩展性和性能无关。它用于故障转移。

  8. EFS 使用什么协议?

    A. SMB

    B. NFS

    C. EBS

    D. HTTP

  9. EFS 支持哪些操作系统?

    A. 仅 Linux

    B. 仅 Windows

    C. Windows 和 Linux 都支持

    D. 既不是 Windows 也不是 Linux

  10. EFS 是私有服务吗?

    A. 是的。

    B. 不,它是一个公共服务。

    C. 它既是私有服务也是公共服务。

    D. 既不是私有服务也不是公共服务。

  11. 以下哪两个是正确的?

    A. 多可用区:同一区域::只读副本:多个区域

    B. 多可用区:多个区域::只读副本:同一区域

    C. 多可用区:同步复制::只读副本:异步复制

    D. 多可用区:异步复制::只读副本:同步复制

  12. 以下哪一个是正确的?

    A. 只读副本是只读实例。

    B. 只读副本是可读写实例。

    C. 只读副本是只写实例。

    D. 只读副本是只读实例,直到提升为读写。

  13. EFS 可以从哪里访问?

    A. 仅在 VPC 内部

    B. 通过 AWS 端点

    C. 任何有公共互联网连接的地方

    D. 在 VPC 内部或通过混合网络连接到该 VPC 的任何本地位置

  14. 以下哪三个是正确的?

    A. 实例存储卷是持久存储。

    B. 实例存储卷是临时(短暂)存储。

    C. 如果发生硬件故障,存储在实例存储卷上的数据可能会丢失。

    D. 当 EC2 实例重启时,存储在实例存储卷上的数据可能会丢失。

    E. 当 EC2 实例停止和启动时,存储在实例存储卷上的数据可能会丢失。

    答案

    硬件故障可能会改变底层主机。因此,实例存储卷没有保证。当您停止实例并重新启动它时,由于主机变化,实例存储卷会丢失。实例重启不同于停止和启动;它意味着操作系统重启。

  15. 为了使用 EC2 和 EBS 启用静态加密,您需要...

    A. 在创建 EBS 卷时配置加密。

    B. 使用适当的操作系统的文件系统配置加密。

    C. 使用 X.509 证书配置加密。

    D. 在 S3 中挂载 EBS 卷,然后使用存储桶策略加密存储桶。

  16. 以下哪项是在 EBS 快照上无法执行的操作?

    A. 从快照创建镜像。

    B. 从快照创建 EBS 卷。

    C. 与另一个 AWS 账户共享快照。

    D. 创建加密快照的非加密副本。

  17. 使用 EBS,您需要执行以下操作(选择两项)。

    A. 从另一个加密卷的快照创建一个加密卷。

    B. 从加密快照创建加密卷。

    C. 通过创建未加密快照的加密副本,从未加密快照创建一个加密快照。

    D. 加密现有卷。

    答案

    更多关于 EBS 的信息,请访问以下链接:docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#EBSEncryption_considerations

答案

1. B

2. B

3. A

4. A

5. B

6. C

7. B

8. B

9. A

10. B

11. A, C

12. D

13. D

14. B, C, E

15. A

16. D

17. A, C

第六章:用于数据处理的服务

在上一章中,我们学习了在 AWS 中存储数据的几种方法。在本章中,我们将探讨使用这些数据并从数据中获得一些洞察的方法。在某些用例中,您必须处理数据或将数据加载到 Hive 数据仓库以查询和分析数据。如果您在 AWS 上,并且数据存储在 S3 中,那么您必须在 AWS EMR 上创建一个 hive 表来查询它们。为了提供相同的管理服务,AWS 有一个名为 Athena 的产品,您需要创建一个数据目录并在 S3 上查询数据。如果您需要转换数据,那么 AWS Glue 是转换并恢复到 S3 的最佳选择。让我们设想一个需要流式传输数据并在此数据上创建分析报告的用例。对于此类场景,我们可以选择 AWS Kinesis Data Streams 来流式传输数据并将其存储在 S3 中。使用 Glue,相同的数据可以被复制到 Redshift 以进行进一步的分析利用。现在,让我们了解它们,我们将简要介绍以下内容。

  • 使用 Glue 设计 ETL 作业

  • 使用 Athena 查询 S3 数据

  • 通过 AWS Kinesis Data Streams 流式传输数据并使用 Kinesis Firehose 进行存储

  • 从本地位置摄取数据到 AWS

  • 将数据迁移到 AWS 并扩展本地数据中心到 AWS

  • 在 AWS 上处理数据

技术要求

您可以从 GitHub 下载示例中使用的数据,链接如下:github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-6

在 AWS Glue 上创建 ETL 作业

在现代数据管道中,存在多个阶段,例如生成数据、收集数据、存储数据、执行 ETL、分析和可视化。在本节中,我们将从高层次概述这些阶段,并深入理解ETL提取转换加载)部分:

  • 数据可以由多个设备生成,包括移动设备或物联网设备、网络日志、社交媒体、交易数据、在线游戏等。

  • 这么大的数据量可以通过使用轮询服务或通过集成 AWS Lambda 的 API 网关来收集数据,或者通过 AWS Kinesis 或 AWS 管理的 Kafka 或 Kinesis Firehose 等流来收集。如果您有一个本地数据库,并且希望将数据收集到 AWS 中,那么您可以选择 AWS DMS 来完成这项工作。您可以通过 AWS DataSync 将本地数据同步到 Amazon S3、Amazon EFS 或 Amazon FSx。AWS Snowball 用于收集/传输数据到和从 AWS 中。

  • 下一步涉及存储数据,我们在上一章中学习了一些服务,例如 AWS S3、EBS、EFS、Amazon RDS、Amazon Redshift 和 DynamoDB。

  • 一旦我们了解了我们的数据存储,就可以设计一个 ETL 作业来提取-转换-加载或提取-加载-转换我们的结构化或非结构化数据,以便进行进一步分析。例如,我们可以考虑使用 AWS Lambda 在实时转换数据并将其存储到 S3 中,或者我们可以在 EMR 集群上运行 Spark 应用程序来转换数据,并将其存储在 S3、Redshift 或 RDS 中。

  • AWS 中提供了许多服务用于对转换后的数据进行分析;例如,亚马逊 EMR、亚马逊雅典娜、亚马逊 Redshift、亚马逊 Redshift Spectrum 和 Kinesis Analytics。

  • 数据分析完成后,您可以使用 AWS Quicksight 可视化数据,以了解模式或趋势。数据科学家或机器学习专业人员会喜欢应用统计分析来更好地理解数据分布。商业用户使用它来准备报告。我们已经在第四章,“理解和可视化数据”中学习了各种展示和可视化数据的方法。

从传统的数据管道中,我们了解到 ETL 完全是关于在服务器上编码和维护代码以确保其顺利运行。如果数据格式有任何变化,那么代码就需要进行更改,这会导致目标模式的变化。如果数据源发生变化,代码也必须能够处理这种情况,这会带来额外的开销。我们应该编写代码来识别数据源中的这些变化吗?我们需要一个系统来自适应变化并为我们发现数据吗? 答案是AWS Glue。现在,让我们了解为什么 AWS Glue 如此著名。

AWS Glue 的特性

AWS Glue 是 AWS 上完全托管的无服务器 ETL 服务。它具有以下特性:

  • 它通过连接到数据源自动发现和分类您的数据,并生成数据目录。

  • 亚马逊雅典娜、亚马逊 Redshift 和亚马逊 EMR 等服务可以使用数据目录来查询数据。

  • AWS Glue 生成 ETL 代码,这是 Spark 在 Python 或 Scala 中的扩展,也可以进行修改。

  • 它会自动扩展以匹配运行 ETL 作业和将数据加载到目标位置所需的 Spark 应用程序要求。

AWS Glue 拥有数据目录,这是其成功的关键。它有助于从数据源中发现数据,并让我们对其有所了解:

  • 数据目录自动发现新数据并提取模式定义。它检测模式更改和版本表。它检测 Amazon S3 上的 Apache Hive 风格的分区。

  • 数据目录自带用于流行数据类型的内置分类器。可以使用Grok 表达式编写自定义分类器。分类器有助于检测模式。

  • Glue 爬虫可以按需或按计划运行以更新 Glue 数据目录中的元数据。Glue 爬虫必须与一个 IAM 角色关联,该角色有足够的权限读取数据源,例如 Amazon RDS、Amazon Redshift 和 Amazon S3。

既然我们对 AWS Glue 有了简要的了解,让我们运行以下示例来亲自动手。

熟练使用 AWS Glue 数据目录组件

在本例中,我们将创建一个作业,使用 AWS Glue 将数据从 S3 复制到 Redshift。我所有的组件都创建在us-east-1区域。让我们先创建一个存储桶:

  1. 导航到 AWS S3 控制台并创建一个存储桶。我已将该存储桶命名为aws-glue-example-01

  2. 点击input-data

  3. 在文件夹内导航并点击sales-records.csv数据集。数据可在以下 GitHub 位置找到:github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-6/AWS-Glue-Demo/input-data

    由于我们已经将数据上传到 S3 存储桶,让我们创建一个 VPC,在其中我们将创建我们的 Redshift 集群。

  4. 通过访问console.aws.amazon.com/vpc/home?region=us-east-1# URL 导航到 VPC 控制台并点击AWS services

    b) com.amazonaws.us-east-1.s3 (网关类型)

    c) 选择默认 VPC(我们将使用此默认 VPC 创建 Redshift 集群)

  5. 保持其他字段不变并点击创建端点

  6. 点击redshift-self,并选择默认 VPC 下拉菜单。为Redshift 安全组提供一个适当的描述。点击创建安全组

  7. 点击所有流量

    b) 自定义

    c) 在搜索字段中,选择相同的安全组(redshift-self)

  8. 点击保存规则

    现在,让我们创建我们的 Redshift 集群。

  9. 导航到 Amazon Redshift 控制台。点击创建集群并填写高亮字段,如图图 6.1所示:图 6.1 – Amazon Redshift 创建集群的屏幕截图

    图 6.1 – Amazon Redshift 创建集群的屏幕截图

  10. 滚动并填写高亮字段,如图图 6.2所示:图 6.2 – Amazon Redshift 集群数据库配置部分的屏幕截图

    图 6.2 – Amazon Redshift 集群数据库配置部分的屏幕截图

  11. 滚动并更改附加配置字段,如图图 6.3所示:图 6.3 – Amazon Redshift 集群附加配置部分的屏幕截图

    图 6.3 – Amazon Redshift 集群附加配置部分的屏幕截图

  12. 还要更改 IAM 权限,如图图 6.4所示:图 6.4 – Amazon Redshift 集群集群权限部分的屏幕截图

    图 6.4 – Amazon Redshift 集群的集群权限部分截图

  13. 滚动并点击 创建集群。集群将在一分钟或两分钟内变为可用状态。

    接下来,我们将创建一个 IAM 角色。

  14. 导航到 AWS IAM 控制台,并在屏幕上的 访问管理 部分选择 角色

  15. 点击 创建角色 按钮,并从服务中选择 Glue。点击 下一步:权限 按钮跳转到下一页。

  16. 搜索 AmazonS3FullAccess 并选择。然后,搜索 AWSGlueServiceRole 并选择。由于我们在这个示例中将数据写入 Redshift,因此选择 AmazonRedshiftFullAccess。点击 下一步:标签,然后点击 下一步:审查 按钮。

  17. 提供一个名称,Glue-IAM-Role,然后点击 创建角色 按钮。角色将如图 6.5 所示出现:图 6.5 – IAM 角色截图

    图 6.5 – IAM 角色截图

    现在,我们已经有了输入数据源和输出数据存储,下一步是从 AWS Glue 控制台创建 Glue 爬虫。

  18. 选择 glue-redshift-connection

    b) Amazon Redshift

  19. 点击 redshift-glue-example

    b) glue-dev

    c) awsuser

    d) ********(输入在第 10 步中创建的值)

  20. 点击 IAM 角色部分的 Glue-IAM-Role,然后点击 测试连接

  21. 前往 s3-glue-crawler,然后点击 下一步。在 指定爬虫源类型 页面上,保持所有默认设置,然后点击 下一步

  22. s3://aws-glue-example-01/input-data/sales-records.csv

  23. 点击 下一步

  24. No。点击 下一步

  25. Glue-IAM-Role。然后点击 下一步

  26. Run on demand。点击 下一步

  27. 没有创建数据库,因此点击 s3-data,点击 下一步,然后点击 完成

  28. 选择爬虫 s3-glue-crawler,然后点击 s3-data 中的 1,如前所述,已创建,并添加了一个表。点击 sales_records_csv。现在可以看到已经发现了模式。如果推断的数据类型不符合您的需求,您可以更改数据类型。

在本节动手实践中,我们学习了数据库表、数据库连接、S3 上的爬虫以及 Redshift 集群的创建。在下一节动手实践中,我们将学习如何使用 Glue 创建 ETL 作业。

AWS Glue ETL 组件的动手实践

在本节中,我们将使用之前创建的数据目录组件来构建我们的作业。让我们先创建作业:

  1. 导航到 AWS Glue 控制台,然后在 ETL 部分的 作业 下点击。

  2. 点击 s3-glue-redshift

  3. Glue-IAM-Role(这是我们在上一节中创建的角色)

  4. Spark

  5. Spark 2.4, Python 3 with improved job start up times (Glue version 2.0)

  6. 保持其他字段不变,然后点击 下一步

  7. 选择 sales_records_csv 并点击 下一步

  8. 默认选择更改模式,然后点击下一步(在撰写本书时,Glue 2.0 不支持机器学习转换)。

  9. 默认选择JDBC作为数据存储,并选择glue-redshift-connection作为连接。提供glue-dev作为数据库名称(如前节中创建的),然后点击下一步

  10. 接下来是输出模式定义页面,你可以选择要从目标模式中删除的所需列。向下滚动并点击保存作业并编辑脚本

  11. 你现在可以看到屏幕左侧正在创建的管道和右侧的建议代码,如图 6.6 所示。你可以根据你的需求修改代码。点击运行作业按钮。会出现一个弹出窗口,要求你编辑任何你希望更改的细节。这是可选的。然后,点击运行作业按钮:![图 6.6 – AWS Glue ETL 作业的截图

    ![img/B16735_06_06.jpg]

    图 6.6 – AWS Glue ETL 作业的截图

  12. 作业成功后,导航到 Amazon Redshift 并点击查询编辑器

  13. 将数据库名称设置为glue-dev,然后提供用户名和密码以创建连接。

  14. 选择public模式,现在你可以查询表以查看记录,如图 6.7 所示:

![图 6.7 – Amazon Redshift 的查询编辑器截图

![img/B16735_06_07.jpg]

图 6.7 – Amazon Redshift 的查询编辑器截图

我们现在了解了如何使用 AWS Glue 创建 ETL 作业,将数据从 S3 存储桶复制到 Amazon Redshift。我们还使用 UI 控制台中的查询编辑器查询了 Amazon Redshift 中的数据。如果你已成功完成这些步骤,建议删除 Redshift 集群和 AWS Glue 作业。AWS 会在你的账户中创建两个存储桶来存储 AWS Glue 脚本和 AWS Glue 临时结果。因此,也请删除这些以节省成本。我们将在下一节中使用 S3 数据上创建的数据目录。

在下一节中,我们将学习如何使用 Athena 查询 S3 数据。

使用 Athena 查询 S3 数据

Athena 是一个无服务器服务,用于查询存储在 S3 中的数据。它是无服务器的,因为客户端不管理用于计算的服务器:

  • Athena 使用模式来呈现对存储在 S3 中的数据的查询结果。你定义你希望数据以模式的形式出现,Athena 从 S3 读取原始数据,根据定义的模式显示结果。

  • 输出可以被其他服务用于可视化、存储或各种分析目的。S3 中的源数据可以是以下任何一种结构化、半结构化和非结构化数据格式,包括 XML、JSON、CSV/TSV、AVRO、Parquet、ORC 等。CloudTrail、ELB 日志和 VPC 流量日志也可以存储在 S3 中,并由 Athena 进行分析。

  • 这遵循了读取时定义模式的技术。与传统技术不同,表在数据目录中预先定义,数据在读取时进行投影。允许在数据上执行类似 SQL 的查询,而无需转换源数据。

现在,让我们通过一个示例来理解这一点,我们将使用在 AWS Glue 上创建的AWSDataCatlog对 S3 数据进行查询:

  1. 导航到 AWS Athena 控制台。从sampledb数据库中选择AWSDataCatalog(将在 AWS Glue 数据目录中创建一个表,名为elb_logs)。

  2. 选择s3-data作为数据库。

  3. 点击右上角的设置并填写如图图 6.8所示的详细信息(我使用了与上一个示例相同的存储桶和不同的文件夹):图 6.8 – Amazon Athena 的设置截图

    图 6.8 – Amazon Athena 的设置截图

  4. 下一步是在查询编辑器中编写您的查询并执行它。一旦执行完成,请删除您的 S3 存储桶和 AWS Glue 数据目录。这将为您节省费用。

在本节中,我们学习了如何通过 AWS 数据目录使用 Amazon Athena 查询 S3 数据。您也可以创建自己的模式并从 S3 查询数据。在下一节中,我们将学习 Amazon Kinesis Data Streams。

使用 Kinesis 数据流处理实时数据

Kinesis 是亚马逊的流服务,可以根据需求进行扩展。它在区域中具有高度可用性。它默认保留数据 24 小时,或可选地最多保留 365 天。Kinesis 数据流用于大规模数据摄取、分析和监控:

  • Kinesis 可以被多个生产者摄取,多个消费者也可以从流中读取数据。让我们通过一个实时示例来理解这一点。假设您有一个生产者将数据摄取到 Kinesis 流中,默认保留期为 24 小时,这意味着今天早上 5:00:00 摄取的数据将在明天早上 4:59:59 之前在流中可用。这些数据在此之后将不可用,理想情况下,应该在过期之前消费,或者如果它很重要,可以存储在某个地方。保留期可以额外付费延长至最多 365 天。

  • Kinesis 可用于实时分析或仪表板可视化。生产者可以想象成一段将数据推入 Kinesis 流的代码,它可以是一个运行代码的 EC2 实例、Lambda 函数、物联网设备、本地服务器、移动应用程序或设备等。

  • 同样,消费者也可以是一段在 EC2 实例、Lambda 函数或本地服务器上运行的代码,这些代码知道如何连接到 Kinesis 流、读取数据并对数据进行一些操作。AWS 提供触发器,在数据到达 Kinesis 流时立即调用 Lambda 消费者。

  • Kinesis 因其分片架构而具有可扩展性,这是 Kinesis 流的基本吞吐量单元。什么是分片? 分片是一种逻辑结构,根据分区键对数据进行分区。一个分片支持每秒1 MB的写入容量和每秒2 MB的读取容量。单个分片每秒支持1,000PUT记录。如果你创建了一个包含3个分片的流,那么可以实现3 MB/sec的写入吞吐量和6 MB/sec的读取吞吐量,这允许3,000PUT记录。因此,随着分片数量的增加,你需要支付额外的费用以获得更高的性能。

  • 分片中的数据通过 Kinesis 数据记录存储,最大可达 1 MB。Kinesis 数据记录根据分区键跨分片存储。它还有一个序列号。序列号在执行putRecordputRecords API 操作时由 Kinesis 分配,以便唯一标识一个记录。分区键由生产者在将数据添加到 Kinesis 数据流时指定,分区键负责将记录隔离和路由到流中的不同分片以平衡负载。

  • 在 Kinesis 流中加密数据有两种方式:服务器端加密和客户端加密。客户端加密难以实现和管理密钥,因为客户端必须在将数据放入流之前加密数据,并在从流中读取数据之后解密数据。通过AWS/KMS启用的服务器端加密,数据在放入流和从流中获取时自动加密和解密。

    注意

    不要将 Amazon Kinesis 与 Amazon SQS 混淆。Amazon SQS 支持一个生产组和一组消费组。如果你的用例需要多个用户发送和接收数据,那么 Kinesis 是解决方案。

    对于解耦和异步通信,SQS 是解决方案,因为发送者和接收者不需要相互了解。

    在 SQS 中,没有持久性的概念。一旦读取了消息,下一步就是删除。Amazon SQS 没有保留时间窗口的概念。如果你的用例需要大规模摄取,那么应该使用 Kinesis。

在下一节中,我们将学习如何存储流式数据以进行进一步分析。

使用 Kinesis Data Firehose 存储和转换实时数据

有许多用例需要将数据流式传输并存储以供未来分析。为了克服这些问题,你可以编写一个 Kinesis 消费者来读取 Kinesis 流并将数据存储在 S3 中。这个解决方案需要一个实例或机器来运行代码,并具有从流中读取和写入 S3 所需的访问权限。另一个可能的选项是运行一个 Lambda 函数,该函数在向流发送putRecordputRecords API 时被触发,并从流中读取数据以存储在 S3 桶中:

  • 为了使这个过程变得简单,Amazon 提供了一个名为 Kinesis Data Firehose 的独立服务。它可以轻松地连接到 Kinesis 数据流,并且需要基本的 IAM 角色将数据写入 S3。这是一个完全托管的服务,用于减少管理服务器和代码的负担。它还支持将流式数据加载到 Amazon Redshift、Amazon Elasticsearch 服务和 Splunk。Kinesis Data Firehose 可以自动扩展以匹配数据的吞吐量。

  • 数据可以在存储或发送到目的地之前通过 AWS Lambda 函数进行转换。如果您想使用未转换的数据构建原始数据湖,那么通过启用源记录备份,您可以在转换之前将其存储在另一个 S3 桶中。

  • 通过 AWS/KMS 的帮助,数据可以在发送到 S3 桶后进行加密。必须在创建交付流时启用。数据还可以以支持的格式(如 GZIP、ZIP 和 SNAPPY 压缩格式)进行压缩。

在下一节中,我们将了解用于从本地服务器将数据导入 AWS 的不同 AWS 服务。

从本地服务器导入 AWS 的不同数据方式

随着对数据驱动用例需求的增加,目前管理本地服务器上的数据相当困难。当您处理大量数据时,备份并不容易。这些数据在数据湖中正被用于构建深度神经网络,创建数据仓库以从中提取有意义的信息,运行分析,以及生成报告。

现在,如果我们看看将数据迁移到 AWS 的可用选项,那么也会带来各种挑战。例如,如果您想将数据发送到 S3,那么您必须编写几行代码将您的数据发送到 AWS。您将需要管理代码和服务器以运行代码。必须确保数据通过 HTTPS 网络传输。您需要验证数据传输是否成功。这增加了过程的复杂性,同时也带来了时间和精力上的挑战。为了避免此类情况,AWS 提供服务来匹配或解决您的用例,通过设计混合基础设施允许本地数据中心和 AWS 之间的数据共享。让我们在接下来的章节中了解这些内容。

AWS 存储网关

存储网关是一种混合存储虚拟设备。它可以在三种不同的模式下运行——文件网关磁带网关卷网关。它可以用于扩展、迁移和备份本地数据中心到 AWS:

  • 在磁带网关模式下,存储网关将虚拟磁带存储在 S3 上,当磁带被弹出并归档时,磁带将从 S3 移动到 Glacier。活动磁带存储在 S3 上进行存储和检索。归档或导出的磁带存储在 Glacier 的虚拟磁带架(VTS)中。虚拟磁带可以创建,大小从 100 GiB 到 5 TiB 不等。总共可以配置 1PB 的本地存储,并且可以将无限数量的磁带归档到 Glacier。这对于现有的磁带备份系统以及需要将备份数据迁移到 AWS 的场景非常理想。您可以在以后退役物理磁带硬件。

  • 在文件网关模式下,存储网关将文件映射到 S3 对象上,可以使用可用的存储类之一进行存储。这有助于您将数据中心扩展到 AWS。您可以将更多文件加载到文件网关中,这些文件将作为 S3 对象存储。它可以在您的本地虚拟服务器上运行,通过服务器消息块(SMB)网络文件系统(NFS)连接到各种设备。文件网关通过 HTTPS 公共端点连接到 AWS,以在 S3 对象上存储数据。可以对这些 S3 对象应用生命周期策略。您可以将您的活动目录(AD)轻松集成到文件网关中,以控制对文件共享中文件的访问。

  • 在卷网关模式下,存储网关提供块存储。使用这种存储有两种方式,一种为网关缓存,另一种为网关存储

  • 网关存储是一种本地运行的卷存储网关,它具有本地存储和上传缓冲区。总共可以创建 32 个卷,每个卷的大小可达 16 TB,总容量为 512 TB。主数据存储在本地,备份数据在后台异步复制到 AWS。卷通过互联网小型计算机系统接口(iSCSI)提供,以便基于网络的服务器访问。它通过 HTTPS 公共端点连接到存储网关端点,并从备份数据创建 EBS 快照。这些快照可用于创建标准的 EBS 卷。此选项非常适合迁移到 AWS 或灾难恢复或业务连续性。本地系统将继续使用本地卷,但 EBS 快照存储在 AWS 中,可以用作备份的替代品。这不是数据中心扩展的最佳选择,因为您需要大量的本地存储。

  • Gateway Cached是一种在本地运行的卷存储网关,它具有缓存存储和上传缓冲区。不同之处在于,添加到存储网关的数据不是本地的,而是上传到 AWS。主数据存储在 AWS。频繁访问的数据在本地缓存。这是将本地数据中心扩展到 AWS 的理想选择。它通过 HTTPS 公共端点连接到存储网关端点,并创建存储为标准 EBS 快照的S3 支持卷(AWS 管理的存储桶)快照。

Snowball、Snowball Edge 和 Snowmobile

它们属于同一产品家族,用于在业务运营地点和 AWS 之间进行物理数据传输。对于在 AWS 中移动大量数据,您可以使用以下三者中的任何一个:

  • Snowball:您可以通过提交一个工作订单从 AWS 订购此设备。AWS 将设备交付给您用于加载数据并发送回来。Snowball 中的数据使用 KMS 进行加密。它提供两种容量范围,一种是 50 TB,另一种是 80 TB。对于 10 TB 到 10 PB 之间的数据,订购一个或多个 Snowball 设备是经济实惠的。设备可以被发送到不同的地点。它没有计算能力;它只提供存储能力。

  • Snowball Edge:这与 Snowball 类似,但它同时具备存储和计算能力。它的容量比 Snowball 大。它提供快速网络连接,例如通过 RJ45 的 10 Gbps、10/25 Gb 通过 SFP28,以及 40/100 Gb+通过 QSFP+铜线。这对于将千兆到太字节的数据安全快速地传输到 AWS 是非常理想的。

  • Snowmobile:这是一个位于卡车上的运输集装箱内的便携式数据中心。这允许您将艾字节的数据从本地迁移到 AWS。如果您的数据量超过 10 PB,则 Snowmobile 是首选。本质上,在请求 Snowmobile 后,一辆卡车将被开到您的位置,您将数据中心连接到卡车上,并传输数据。如果您有多个地点,选择 Snowmobile 进行数据传输不是理想的选择。

AWS DataSync

AWS DataSync 旨在将数据从本地存储迁移到 AWS,或反之亦然:

  • 它是 AWS 为数据处理传输、归档或成本效益存储、灾难恢复、业务连续性和数据迁移提供的理想产品。

  • 它具有特殊的数据验证功能,可以在数据到达 AWS 后立即验证原始数据与 AWS 中的数据,换句话说,它检查数据的完整性。

  • 通过考虑一个具有 SAN/NAS 存储的本地数据中心示例,让我们深入理解这个产品。当我们在一个 VMWare 平台上运行 AWS DataSync 代理时,这个代理能够通过 NFS/SMB 协议与 NAS/SAN 存储进行通信。一旦启动,它就会与 AWS DataSync 端点通信,从那里,它可以连接到多种不同类型的地点,包括各种 S3 存储类别或基于 VPC 的资源,例如弹性文件系统EFS)和 FSx for Windows Server。

  • 它允许您在特定时间段内安排数据传输。通过配置内置的带宽节流,您可以限制 DataSync 使用的网络带宽量。

在 AWS 上处理存储数据

AWS 中有几个用于处理存储在 AWS 中的数据的服务。在本节中,我们将介绍 AWS Batch 和 AWS EMR(弹性 MapReduce)。EMR 是 AWS 提供的一项服务,主要用于以管理方式运行 MapReduce 作业和 Spark 应用程序。AWS Batch 用于长时间运行、计算密集型的工作负载。

AWS EMR

EMR 是 AWS 提供的一项托管 Apache Hadoop 实现,它还包括 Hadoop 生态系统的其他组件,如 Spark、HBase、Flink、Presto、Hive、Pig 等。我们不会在认证考试中详细讨论这些:

  • EMR 集群可以从 AWS 控制台或通过 AWS CLI 以特定数量的节点启动。集群可以是长期集群或临时集群。如果您有一个长期运行的传统集群,那么您必须自行配置机器并管理它们。如果您有需要更快执行的工作,那么您需要手动添加一个集群。在 EMR 的情况下,这些管理开销消失了。您可以向 EMR 请求任意数量的节点,并且它将为您管理和启动节点。如果您在集群上启用了自动扩展,那么在需求增加时,EMR 将在集群中启动新的节点,一旦负载减少,就会退役这些节点。

  • EMR 在后台使用 EC2 实例运行,并在 VPC 中的一个可用区运行。这使节点之间的网络速度更快。AWS Glue 在后台使用 EMR 集群,用户无需担心 AWS EMR 的操作理解。

  • 从用例的角度来看,EMR 可以用于处理或转换存储在 S3 中的数据,并将输出数据存储在 S3 中。EMR 使用节点(EC2 实例)作为数据处理的基本单元。EMR 节点有多种变体,包括主节点、核心节点和任务节点。

  • EMR 主节点充当 Hadoop namenode,并管理集群及其健康状态。它负责在其他核心节点和任务节点之间分配作业工作负载。如果您启用了 SSH,则可以连接到主节点实例并访问集群。

  • EMR 集群可以有一个或多个核心节点。如果您与 Hadoop 生态系统相关联,那么核心节点类似于 Hadoop 数据节点,它们负责在其中运行任务。

  • 任务节点是可选的,它们没有 HDFS 存储。它们负责运行任务。如果某个原因导致任务节点失败,那么这不会影响 HDFS 存储,但核心节点故障会导致 HDFS 存储中断。

  • EMR 有其文件系统 EMRFS。它由 S3 支持,这使得它具有区域弹性。如果核心节点失败,数据仍然安全在 S3 中。HDFS 在 I/O 效率方面表现良好,比 EMRFS 更快。

在下一节中,我们将了解 AWS Batch,它是一个可管理的批量处理计算服务,可用于长时间运行的服务。

AWS Batch

这是一个可管理的批量处理产品。如果您使用 AWS Batch,则作业可以在没有最终用户交互的情况下运行,或者可以安排运行:

  • 想象一个事件驱动的应用程序,它启动 Lambda 函数来处理存储在 S3 中的数据。如果处理时间超过 15 分钟,那么 Lambda 有执行时间限制。在这种情况下,AWS Batch 是一个更好的解决方案,其中计算密集型工作负载可以通过 API 事件进行调度或驱动。

  • AWS Batch 非常适合需要更长时间处理时间或更多计算资源的使用场景。

  • AWS Batch 运行一个可以是脚本或可执行文件的作业。一个作业可以依赖于另一个作业。作业需要一个定义,例如谁可以运行作业(使用 IAM 权限)、作业可以在哪里运行(要使用的资源)、挂载点和其他元数据。

  • 任务被提交到队列中,在那里它们等待计算环境容量。这些队列与一个或多个计算环境相关联。

  • 计算环境执行实际的工作,即执行作业。这些可以是 ECS 或 EC2 实例,或任何计算资源。您还可以定义它们的大小和容量。

  • 环境根据其优先级从队列中接收作业并执行作业。它们可以是管理的或非管理的计算环境。

  • AWS Batch 可以将元数据存储在 DynamoDB 中以供进一步使用,也可以将输出存储到 S3 存储桶中。

    注意

    如果你在考试中遇到一个需要灵活计算、更高磁盘空间、无时间限制(超过 15 分钟)或有效资源限制的事件式工作负载问题,那么请选择 AWS Batch。

摘要

在本章中,我们学习了在 AWS 中处理数据的不同方式。我们还学习了将数据中心扩展到 AWS、迁移数据到 AWS 以及摄取过程的能力。我们还学习了使用数据以我们自己的方式处理数据并使其准备好分析的多种方法。我们了解了数据目录的魔力,它帮助我们通过 AWS Glue 和 Athena 查询我们的数据。

在下一章中,我们将学习各种机器学习算法及其用法。

问题

  1. 如果您有大量物联网设备向 AWS 发送数据,由大量移动设备消费,以下哪个选项应该选择?

    A. SQS 标准队列

    B. SQS FIFO 队列

    C. Kinesis 流

  2. 如果您需要解耦一个高流量应用程序,以下哪个选项应该选择?

    A. SQS 标准队列

    B. SQS FIFO 队列

    C. Kinesis 流

  3. 为了提高 Kinesis 流的性能,我需要更改以下哪个设置?

    A. 流的读取容量单位

    B. 流的写入容量单位

    C. 流的分区

    D. 流的区域

  4. 以下哪个确保数据完整性?

    A. AWS Kinesis

    B. AWS DataSync

    C. AWS EMR

    D. Snowmobile

  5. 以下哪种存储网关模式可以用 S3 存储替换磁带驱动器?

    A. 体积网关存储

    B. 体积网关缓存

    C. 文件

    D. VTL

  6. 以下哪种存储网关模式可以用于将 SMB 存储呈现给客户端?

    A. 体积网关存储

    B. 体积网关缓存

    C. 文件

    D. VTL

  7. 以下哪种存储网关模式适合数据中心扩展到 AWS?

    A. 体积网关存储

    B. 体积网关缓存

    C. 文件

    D. VTL

  8. AWS 中哪种存储产品可用于 Windows 环境的共享存储?

    A. S3

    B. FSx

    C. EBS

    D. EFS

  9. 在 EMR 集群中,哪个节点处理操作?

    A. 主节点

    B. 核心节点

    C. 任务节点

    D. 主节点

  10. 在 EMR 集群中,哪些节点适合 spot 实例?

    A. 主节点

    B. 核心节点

    C. 任务节点

    D. 主节点

  11. 如果您有大量流数据并添加到 Redshift,您将使用哪些服务(选择三个)?

    A. Kinesis Data Streams

    B. Kinesis Data Firehose

    C. S3

    D. SQS

    E. Kinesis Analytics

  12. Kinesis Firehose 支持使用 Lambda 进行数据转换。

    A. 正确

    B. 错误

  13. 以下哪些是 Kinesis Data Firehose 的有效目的地(选择五个)?

    A. HTTP

    B. Splunk

    C. Redshift

    D. S3

    E. Elastic Search

    F. EC2

    G. SQS

答案

1. C

2. A

3. C

4. B

5. D

6. C

7. B

8. B

9. A

10. C

11. A, B, C

12. A

13. A, B, C, D, E

第三部分:数据建模

本节总结了最常见的机器学习算法。它描述了每个算法的逻辑,何时使用它们,以及如何调整它们的超参数。

本节包含以下章节:

  • 第七章**,应用机器学习算法

  • 第八章**,评估和优化模型

  • 第九章**,Amazon SageMaker 建模

第七章:应用机器学习算法

在上一章中,我们学习了 AWS 的数据处理服务,包括 Glue、Athena 和 Kinesis!现在是时候进入建模阶段,研究机器学习算法了。我相信,在前面几章中,你已经意识到构建机器学习模型需要大量关于 AWS 服务、数据工程、数据探索、数据架构等方面的知识。这次,我们将更深入地探讨我们之前讨论过的算法以及许多其他算法。

对不同类型的算法和机器学习方法的良好理解将使你在项目决策中处于非常有利的地位。当然,这种知识对于 AWS 机器学习专业考试也是至关重要的。

请记住,有成千上万的算法,顺便说一句,你甚至可以为特定问题提出自己的算法。此外,我们将涵盖最相关的算法,并希望这些算法你可能在考试中遇到。

本章的主要内容包括:

  • 存储训练数据

  • 关于集成模型的说明

  • 回归模型

  • 分类模型

  • 预测模型

  • Object2Vec

  • 聚类

  • 异常检测

  • 维度约简

  • IP 洞察

  • 自然语言处理

  • 强化学习

好的,让我们开始吧!

介绍本章

在本章中,我们将讨论几个算法、建模概念和学习策略。我们认为所有这些主题都将对你的考试和数据科学家职业生涯有益。

我们将本章结构化,不仅涵盖考试所需的必要主题,还让你对最重要的学习策略有一个良好的认识。例如,考试将检查你对 K-means 基本概念的了解;然而,我们将对其进行更深入的探讨,因为这是作为数据科学家职业的重要主题。

我们将采取这种方法,更深入地研究某些类型的模型,我们认为每个数据科学家都应该掌握其算法逻辑。所以,请记住:有时,我们可能在考试中比预期走得更深,但这对你来说将极其重要。

在本章中,我们多次使用术语内置算法。当我们想要提及 AWS 在他们的 SageMaker SDK 上实现的算法列表时,我们将使用这个术语。

让我给你一个具体的例子:你可以使用 scikit-learn 的 KNN 算法(如果你不记得什么是 scikit-learn,可以通过回到第一章机器学习基础)来创建一个分类模型并将其部署到 SageMaker。然而,AWS 还提供了他们 SDK 上的 KNN 算法的自身实现,该实现针对 AWS 环境进行了优化。在这里,KNN 是一个内置算法的例子。

如你所见,在 AWS 上的可能性是无限的,因为你可以利用内置算法,或者引入自己的算法来在 SageMaker 上创建模型。最后,为了使这一点非常明确,这里有一个从 AWS SDK 导入内置算法的示例:

import sagemaker
knn = sagemaker.estimator.Estimator(get_image_uri(boto3.Session().region_name, "knn"),
        get_execution_role(),
        train_instance_count=1,
        train_instance_type='ml.m5.2xlarge',
        output_path=output_path,
        sagemaker_session=sagemaker.Session())
knn.set_hyperparameters(**hyperparams)

你将在第九章,“Amazon SageMaker 建模”中学习如何在 SageMaker 上创建模型。目前,你只需了解 AWS 有一套自己的库,其中实现了这些内置算法。

要训练和评估一个模型,你需要训练数据和测试数据。在实例化你的估计器之后,你应该用这些数据集来喂养它。我不想破坏第九章,“Amazon SageMaker 建模”,但你应该事先了解数据通道的概念。

数据通道是与输入数据相关的配置,你可以在创建训练作业时将其传递给 SageMaker。你应该设置这些配置,只是为了通知 SageMaker 你的输入数据格式。

第九章,“Amazon SageMaker 建模”中,你将学习如何创建训练作业以及如何设置数据通道。到目前为止,你应该知道,在配置数据通道时,你可以设置内容类型ContentType)和输入模式TrainingInputMode)。让我们更详细地看看训练数据应该如何存储,以便能够与 AWS 的内置算法正确集成。

存储训练数据

首先,你可以使用多个 AWS 服务来准备机器学习的数据,例如 EMR、Redshift、Glue 等。预处理完训练数据后,你应该将其存储在 S3 中,以算法期望的格式存储。以下表格显示了每个算法可接受的数据格式列表:

图 7.1 – 每个 AWS 算法可接受的数据格式

图 7.1 – 每个 AWS 算法可接受的数据格式

如我们所见,许多算法接受 text/.csv格式。请注意,如果你想使用该格式,你应该遵循以下规则:

  • 你的 CSV 文件不能有标题记录。

  • 对于监督学习,目标变量必须在第一列。

  • 在配置训练管道时,将输入数据通道的content_type设置为text/csv

  • 对于无监督学习,在'content_type=text/csv;label_size=0'中设置label_size

虽然 text/.csv 格式对许多用例来说都很好,但大多数情况下,AWS 的内置算法与recordIO-protobuf配合得更好。这是一种用于训练 AWS 内置算法的优化数据格式,其中 SageMaker 将数据集中的每个观测值转换为二进制表示,即一组 4 字节的浮点数。

RecordIO-protobuf 接受两种类型的输入模式:管道模式文件模式。在管道模式下,数据将直接从 S3 流出,这有助于优化存储。在文件模式下,数据将从 S3 复制到训练实例的存储卷。

我们几乎准备好了!现在,让我们快速浏览一些建模定义,这将帮助你理解一些更高级的算法。

关于集成模型的一些话

在我们深入算法之前,有一个重要的建模概念你应该了解,称为集成。集成这个术语用来描述使用多个算法创建模型的方法。

例如,与其只创建一个模型来预测欺诈交易,你还可以创建多个执行相同任务的模型,并通过一种投票系统选择预测结果。下表展示了这个简单的例子:

图 7.2 – 集成方法上的投票系统示例

图 7.2 – 集成方法上的投票系统示例

对于回归问题,这种方法同样适用,我们不是通过投票,而是通过平均每个模型的预测结果,并将其作为最终结果。

投票和平均只是集成方法中的两个例子。其他强大的技术包括混合堆叠,其中你可以创建多个模型,并将每个模型的输出作为主模型的特征。回顾前面的表格,"模型 A"、"模型 B"和"模型 C"将被用作预测最终结果的特征。

结果表明,许多机器学习算法在训练过程中使用集成方法,以嵌入式的方式。这些算法可以分为两大类:

  • 自助聚合Bagging:这种方法中,在数据的不同样本上训练多个模型。然后,通过投票或平均系统进行预测。这个类别的主要算法被称为随机森林

  • 提升法:这种方法中,在数据的不同样本上训练多个模型。然后,一个模型试图通过惩罚错误预测来纠正下一个模型的错误。这个类别的主要算法被称为随机梯度提升AdaBoost

既然你已经知道了集成模型是什么,那么让我们继续学习一些可能出现在你考试中的机器学习算法。虽然并非所有这些算法都使用集成方法,但我相信这将更容易让你识别出来。

我们将根据 AWS 算法类别划分接下来的几个部分:

  • 监督学习

  • 无监督学习

  • 文本分析

  • 图像处理

最后,我们将概述 AWS 中的强化学习。

监督学习

AWS 为通用目的(回归和分类任务)以及更具体的目的(预测和向量化)提供了监督学习算法。这些子类别中可以找到的内置算法列表如下:

  • 线性学习算法

  • 因子分解机算法

  • XGBoost 算法

  • K-最近邻算法

  • Object2Vec 算法

  • DeepAR 预测算法

让我们从回归模型和线性学习算法开始。

与回归模型一起工作

好的;我知道现实问题通常既不是线性的也不是简单的。然而,研究线性回归模型是了解一般回归模型内部发生什么的好方法(是的,回归模型可以是线性的和非线性的)。这是每位数据科学家必须掌握的知识,也可以帮助你解决现实挑战。我们将在以下小节中更详细地探讨这一点。

介绍回归算法

线性回归模型旨在根据一个或多个变量(X)预测一个数值(Y)。从数学上讲,我们可以将这种关系定义为 Y = f(X),其中 Y 被称为依赖变量,X 被称为独立变量

在回归模型中,我们想要预测的组件(Y)始终是一个连续的数字;例如,房价或交易数量。我们在第一章,“机器学习基础”,表 2中看到了这一点,当我们根据目标变量选择合适的监督学习算法时。请随意回去复习它。

当我们只用一个变量来预测 Y 时,我们称这个问题为简单线性回归。另一方面,当我们使用多个变量来预测 Y 时,我们说我们有一个多重线性回归问题。

还有另一类回归模型,称为非线性回归。然而,让我们暂时把它放在一边,先了解简单线性回归是什么意思。

回归模型属于机器学习的监督学习方面(另一方面是非监督学习),因为算法试图根据独立变量和依赖变量之间的现有相关性来预测值。

但 Y=f(X)中的“f”是什么意思?“f”是负责根据 X 预测 Y 的回归函数。换句话说,这正是我们想要弄清楚的功能!当我们开始谈论简单线性回归时,请注意以下三个问题和答案:

  1. 线性回归中的“f”的形状是什么?

    线性,当然!

  2. 我们如何表示线性关系?

    使用一条直线(你将在几分钟内理解原因)。

  3. 那么,定义直线的函数是什么?

    ax + b(只需查看任何数学书籍)。

就这些!线性回归模型由y = ax + b给出。一旦我们试图根据 X 预测 Y,我们只需要找出“a”和“b”的值。我们可以采用相同的逻辑来了解其他类型回归的内部情况。

相信我,找出“a”和“b”的值并不是我们要做的唯一事情。知道“a”也被称为alpha 系数,或斜率,代表线的倾斜度,而“b”也被称为beta 系数,或y 截距,代表线与 y 轴交叉的位置(进入由 x 和 y 组成的二维平面)。你将在下一个子节中看到这两个术语。

还值得知道,每个我们无法控制的预测因子都存在误差。让我们称它为“e”,并将简单线性回归正式定义为y = ax + b + e。从数学上讲,这个误差是通过预测值和真实值之间的差异来表达的。

好的,让我们找到 alpha 和 beta,为这一部分画上一个圆满的句号!

最小二乘法

有不同的方法来找到直线的斜率和 y 截距,但最常用的方法是称为最小二乘法。这种方法背后的原理很简单:我们必须找到最佳直线,以减少平方误差的总和

在下面的图中,我们可以看到一个带有多个点和线的笛卡尔平面。“线 a”代表这些数据的最优拟合线——换句话说,那将是这些点的最佳线性回归函数。但我是怎么知道的呢?很简单:如果我们计算每个点(就像下面图中我们放大查看的那个点)相关的误差,我们会意识到“线 a”包含了最小的平方误差总和:

![Figure 7.3 – 最小二乘法原理的可视化]

![img/B16735_07_003.jpg]

图 7.3 – 最小二乘法原理的可视化

值得从头开始理解线性回归,这不仅是为了认证考试,而且主要是为了你作为数据科学家的职业生涯。为了给你提供一个完整的例子,我们已经开发了一个包含我们将要逐步看到的所有计算的电子表格!我们鼓励你使用这个支持材料进行一些模拟。让我们看看它是如何运作的。

从头开始创建线性回归模型

我们将使用一个非常简单的数据集,只包含两个变量:

  • X:代表一个人的工作经验年数

  • Y:代表一个人的平均薪水

我们想要理解 X 和 Y 之间的关系,并且如果可能的话,根据工作经验(X)预测薪水(Y)。正如我之前提到的,现实中的问题往往有更多的独立变量,并且不一定呈线性。然而,我相信这个例子会给你提供掌握更复杂算法的基础知识。

要找出 alpha 和 beta 系数(或者如果您愿意,斜率和 y 截距),我们需要找到与数据集相关的某些统计量,因此让我们看看这里显示的数据和辅助统计量:

 图 7.4 – 基于工作经验数量预测平均工资的数据集

图 7.4 – 基于工作经验数量预测平均工资的数据集

如我们所见,X 和 Y 之间存在几乎完美的线性关系。随着工作经验的增加,工资也随之增加。除了 X 和 Y 之外,我们还需要计算以下统计量:记录数、X 的平均值、Y 的平均值、X 和 Y 的协方差、X 的方差和 Y 的方差。以下公式提供了方差和协方差的数学表示(分别),其中x bary barn分别代表 X 的平均值、Y 的平均值和记录数:

如果您想检查表 7.2中每个辅助统计量的公式计算细节,请参阅本书附带的支持材料。在那里,您将找到这些公式已经为您实现。

这些统计量很重要,因为它们将被用来计算我们的 alpha 和 beta 系数。以下图像解释了我们将如何计算这两个系数,以及相关系数RR 平方。后两个指标将给我们一个关于模型质量的概念,模型越接近 1,模型就越好:

图 7.5 – 计算简单线性回归系数的公式

图 7.5 – 计算简单线性回归系数的公式

应用这些公式后,我们将得到以下结果:

图 7.6 – 寻找回归系数

图 7.6 – 寻找回归系数

前面的表格已经包含了我们用于在新的数据上做出预测所需的所有信息。如果我们用原始方程中的系数替换,y = ax + b + e,我们将找到回归公式如下:

Y = 1021,212 * X + 53,3

从现在开始,为了进行预测,我们只需要将 X 替换为经验年数。结果,我们将找到 Y,即预测的工资。我们可以在以下图表中看到模型拟合和图 7.8中的某些模型预测:

图 7.7 – 将数据拟合到回归方程中

图 7.7 – 将数据拟合到回归方程中

我们在这里看到预测值:

图 7.8 – 模型预测

图 7.8 – 模型预测

当你在分析回归模型时,你应该能够理解你的模型是否具有良好的质量。我们在第一章,“机器学习基础”中讨论了许多建模问题(例如过拟合),你已经知道你总是需要检查模型性能。

对回归模型的一个良好方法是执行所谓的残差分析。这就是我们在散点图中绘制模型的误差,并检查它们是否随机分布(如预期)的地方。如果误差不是随机分布的,这意味着你的模型无法泛化数据。以下图表显示了我们的示例的残差分析:

图 7.9 – 残差分析

图 7.9 – 残差分析

这里的要点是误差是随机分布的。这样的证据,加上高 R 平方评分,可以用作支持使用此模型的论据。

重要提示

第八章,“评估和优化模型”中,我们将学习关于评估指标的内容。例如,我们将了解到每种类型的模型可能都有自己的评估指标集。回归模型通常使用均方误差(MSE)和均方根误差(RMSE)进行评估。换句话说,除了 R、R 平方和残差分析之外,理想情况下,你将在测试集上执行你的模型以提取其他性能指标。你甚至可以使用交叉验证系统来检查模型性能,正如我们在第一章,“机器学习基础”中学到的。

非常常见的是,当模型残差确实呈现模式并且不是随机分布时,这是因为数据中现有的关系不是线性的,而是非线性的,因此必须应用另一种建模技术。现在,让我们看看我们如何解释模型的结果。

解释回归模型

了解如何解释线性回归模型也是很好的。有时,我们使用线性回归不一定是为了创建预测模型,而是为了进行回归分析,这样我们可以理解自变量和因变量之间的关系。

回顾我们的回归方程(Y = 1021,212 * X + 53,3),我们可以看到我们的两个术语:alpha 或斜率(1021.2)和 beta 或 y 轴截距(53.3)。我们可以这样解释这个模型:对于每增加一年工作经验,你的薪水将增加 1,021.3 美元。此外,请注意,当“工作经验年数”为零时,预期的薪水将是 53.3 美元(这是我们的直线与 y 轴相交的点)。

从一个通用角度来看,你的回归分析应该回答以下问题:对于独立变量(斜率)中每增加一个额外单位,因变量的平均变化是多少?请做笔记并确保你知道如何解释简单线性回归模型——这对于你作为数据科学家日常活动中的一个重要事情来说是非常重要的事情!让我们继续前进,看看关于线性回归的一些最终考虑。

检查调整后的 R 平方

到目前为止,我希望你对回归模型有了更好的理解!还有一个非常重要的主题你应该知道,无论它是否会在考试中出现,那就是你模型的简约性方面。

我们已经在第一章《机器学习基础》中讨论了简约性。这是你优先考虑简单模型而不是复杂模型的能力。在查看回归模型时,你可能需要使用多个特征来预测你的结果。这也被称为多元回归模型。

当这种情况发生时,R 和 R 平方系数往往会奖励具有更多特征的更复杂模型。换句话说,如果你继续向多元回归模型添加新特征,你会得到更高的 R 和 R 平方系数。这就是为什么你不能仅仅基于这两个指标来做决定。

你可以使用的一个额外指标(除了 R、R 平方、MSE 和 RMSE 之外)被称为调整后的 R 平方。当我们向模型添加不带来任何实际收益的额外特征时,这个指标会受到惩罚。在下面的表中,我们提供了一个假设的例子,只是为了展示当你开始失去简约性时的情况:

图 7.10 – 比较 R 平方和调整后的 R 平方

图 7.10 – 比较 R 平方和调整后的 R 平方

在这里,我们可以得出结论,在模型中保持三个变量比保持四个或五个变量更好。向该模型添加四个或五个变量会增加 R 平方(正如预期的那样),但会降低调整后的 R 平方。

好吧;到目前为止,你应该对回归模型有了非常好的理解。现在,让我们看看 AWS 为这类模型提供的内置算法有哪些。这对你的考试很重要,所以让我们来看看。

AWS 上的回归建模

AWS 有一个内置的算法称为线性学习器,其中我们可以实现线性回归模型。内置的线性学习器使用随机梯度下降SGD)来训练模型。

重要提示

当我们谈到神经网络时,我们将了解更多关于 SGD 的内容。现在,我们可以将 SGD 视为我们刚刚剖析的流行的最小二乘误差方法的替代方案。

线性学习内置算法提供了一个超参数,可以在训练过程之前对数据进行归一化处理。这个超参数的名称是normalize_data。这非常有帮助,因为线性模型对数据的规模很敏感,通常利用数据归一化。

重要提示

我们在第三章中讨论了数据归一化,数据准备和转换。如果你需要复习,请查看该章节。

线性学习算法的一些其他重要超参数是L1wd,它们分别扮演L1 正则化L2 正则化的角色。

L1 和 L2 正则化有助于线性学习器(或任何其他回归算法实现)避免过拟合。传统上,我们称实现 L1 正则化的回归模型为Lasso 回归模型,而对于具有 L2 正则化的回归模型,我们称它们为岭回归模型。

虽然这可能听起来很复杂,但实际上并不复杂!实际上,回归模型方程仍然是相同的;即y = ax + b + e。变化在于损失函数,它用于找到最佳最小化误差的系数。如果你回顾图 7.3,你会看到我们定义误差函数为e = (ŷ - y)²,其中是回归函数值,y是真实值。

L1 和 L2 正则化将惩罚项添加到损失函数中,如下公式所示(注意,我们将 ŷ替换为 ax + b):

λ(lambda)参数必须大于 0,并且需要手动调整。一个非常高的λ值可能会导致欠拟合问题,而一个非常低的λ值可能不会导致最终结果有显著的变化(如果你的模型已经过拟合,它将保持过拟合)。

在实际应用中,L1 和 L2 正则化之间的主要区别是,L1 会将不那么重要的系数缩小到零,这将迫使特征被删除(充当特征选择器)。换句话说,如果你的模型因为具有大量特征而过拟合,L1 正则化应该可以帮助你解决这个问题。

重要提示

在你的考试中,记住 L1 和 L2 正则化的基础,特别是它们之间的关键区别,其中 L1 作为一个特征选择器效果很好。

最后但同样重要的是,许多内置算法可以服务于多种建模目的。线性学习算法可以用于回归、二分类和多分类。在考试中确保你记住这一点(这不仅仅是关于回归模型)。

仍然沿着这个方向,AWS 还内置了其他适用于回归和分类问题的算法;即因子分解机K 最近邻KNN)和XGBoost算法。由于这些算法也可以用于分类目的,我们将在关于分类算法的章节中介绍它们。

重要提示

您在考试期间得到了一个非常重要的提示:线性学习者、因子分解机、K 最近邻和 XGBoost 都适合回归和分类问题。这些算法通常被称为通用算法。

有了这个,我们已经到达了关于回归模型的这一节结束。希望您喜欢它;记得在您参加考试之前查看我们的支持材料。顺便说一句,您可以在日常活动中使用那份参考资料!现在,让我们继续探讨另一个经典的机器学习问题示例:分类模型。

与分类模型一起工作

您在这本书中一直在学习分类模型是什么。然而,现在,我们将讨论一些适合分类问题的算法。请记住,有数百种分类算法,但由于我们正在为 AWS 机器学习专业考试做准备,我们将介绍 AWS 预先构建的算法。

我们已经知道线性学习者做什么(我们知道它适合回归和分类任务),让我们看看其他用于通用目的(包括分类任务)的内置算法。

我们将从因子分解机开始。因子分解机被认为是线性学习者的扩展,优化以在具有高维稀疏数据集的特征之间找到关系。

重要提示

因子分解机的一个非常传统的用例是推荐系统,其中我们通常有很高的数据稀疏度。在考试中,如果您面临一个通用问题(无论是回归还是二元分类任务)且底层数据集是稀疏的,那么从算法角度来看,因子分解机可能是最好的答案。

当我们在回归模型中使用因子分解机时,将使用均方根误差RMSE)来评估模型。另一方面,在二元分类模式下,算法将使用对数损失、准确率和 F1 分数来评估结果。我们将在第八章中更深入地讨论评估指标,评估和优化模型

您应该知道,因子分解机只接受recordIO-protobuf格式的输入数据。这是因为数据稀疏性问题,recordIO-protobuf 被认为在数据处理方面比文本/.csv 格式做得更好。

适用于分类问题的下一个内置算法被称为 K-最近邻,简称 KNN。正如其名所示,该算法将尝试找到输入数据的K个最近点,并返回以下预测之一:

  • 如果是分类任务,则 k 个最近点的最频繁出现的类别

  • 如果是回归任务,则 k 个最近点的标签的平均值

我们称 KNN 为基于索引的算法,因为它计算点之间的距离,为这些点分配索引,然后存储排序后的距离及其索引。有了这种类型的数据结构,KNN 可以轻松选择最接近的 K 个点来进行最终预测。

注意,K 是 KNN 的一个超参数,应该在建模过程中进行优化。

另一个 AWS 内置算法,适用于包括分类在内的通用目的,被称为极端梯度提升,简称XGBoost。这是一个基于集成和决策树的模型。

XGBoost 使用一系列较弱的模型(决策树)来预测目标变量,这可能是一个回归任务、二分类或多分类。这是一个非常流行的算法,并且已被顶尖选手在机器学习竞赛中使用。

XGBoost 在添加新树时使用提升学习策略来纠正先前模型的错误。它被称为“梯度”,因为它使用梯度下降算法来最小化损失。

重要提示

在这个上下文中,术语“较弱”用来描述非常简单的决策树。

虽然 XGBoost 比单个决策树更稳健,但在考试中有一个清晰的决策树及其主要配置的理解是很重要的。顺便说一下,它们是许多集成算法(如 AdaBoost、随机森林、梯度提升和 XGBoost)的基础模型。

决策树是基于规则的算法,以树的形式组织决策,如下面的图所示:

图 7.11 – 决策树模型示例

图 7.11 – 决策树模型示例

它们由根节点(位于树的顶部)、中间或决策节点(位于树的中间)和叶节点(底部节点,没有分支)组成。树的深度由根节点和最后一个叶节点之间的差异给出。例如,在前面的图中,树的深度是 3。

树的深度是此类模型最重要的超参数之一,通常被称为最大深度。换句话说,最大深度控制决策树可以达到的最大深度。

决策树模型另一个非常重要的超参数被称为叶节点中的最小样本数/观测数。它也用于控制树的生长。

决策树有许多其他类型的超参数,但这两个对于控制模型过拟合尤为重要。深度较高或叶子节点观察值非常少的决策树在预测/外推过程中可能会遇到问题。

原因很简单:决策树使用叶子节点中的数据来做出预测,基于每个观察值/目标变量属于该节点的比例(用于分类任务)或平均值(用于回归任务)。因此,节点应该有足够的数据来在训练集之外做出良好的预测。

如果你在考试中遇到术语CART,你应该知道它代表分类和回归树,因为决策树可以用于分类和回归任务。

为了选择在树中分割数据的最佳变量,模型将选择最大化节点间目标变量分离的变量。这项任务可以通过不同的方法执行,例如基尼系数信息增益

预测模型

时间序列,或简称TS,指的是按顺序依赖关系定期收集的数据点。时间序列具有度量、事实和时间单位,如下面的图像所示:

![Figure 7.12 – 时间序列陈述img/B16735_07_012.jpg

图 7.12 – 时间序列陈述

此外,时间序列可以分为单变量多变量。单变量时间序列在一段时间内只有一个变量,而多变量时间序列在一段时间内有两个或更多变量。以下图表显示了我们在前面图像中所示的单变量时间序列:

![Figure 7.13 – 时间序列示例img/B16735_07_013.jpg

图 7.13 – 时间序列示例

时间序列可以按以下方式分解:

  • 观察值水平:序列的平均值

  • 趋势:增加或减少的模式(有时没有趋势)

  • 季节性:在特定时间段的规律性高峰(有时没有季节性)

  • 噪声:我们无法解释的东西

有时,我们也可以在序列中找到一些孤立的高峰,这些高峰在预测模型中无法捕捉到。在这种情况下,我们可能希望将这些高峰视为异常值。以下是对前面图表所示时间序列的分解:

![Figure 7.14 – 时间序列分解img/B16735_07_014.jpg

图 7.14 – 时间序列分解

值得强调的是,我们可以使用加法乘法方法来分解时间序列。加法模型表明,你的时间序列将每个组成部分起来以解释目标变量;也就是说,y(t) = 水平 + 趋势 + 季节性 + 噪声

乘法模型另一方面表明,你的时间序列将每个组成部分起来以解释目标变量;也就是说,y(t) = 水平 * 趋势 * 季节性 * 噪声

在下一节中,我们将更详细地研究时间序列的组成部分。

检查时间序列的平稳性

分解时间序列并理解它们的组成部分如何通过加法和乘法模型相互作用是一项伟大的成就!然而,我们学得越多,我们对自己的疑问就越多。也许你已经意识到,没有趋势和季节性的时间序列比具有所有这些成分的时间序列更容易预测!

这是自然而然的事情。如果你不需要理解趋势和季节性,如果你无法控制噪声,你所要做的就是探索观察到的值并找到它们的回归关系。

我们将具有在一段时间内保持恒定均值和方差的时序称为平稳的。一般来说,具有趋势和季节性的时序不是平稳的。可以通过对序列应用数据转换来将其转换为平稳时序,从而使建模任务变得更容易。这种转换被称为微分

当你探索时间序列时,你可以通过应用假设检验来检查平稳性,例如Dickey-FullerKPSSPhilips-Perron,仅举几例。如果你发现它是非平稳的,那么你可以应用微分来使其成为平稳时间序列。一些算法已经内置了这种能力。

探索,探索,再探索

到目前为止,我确信我无需提醒你,探索任务在数据科学中一直都在发生。这里没有什么不同。当你构建时间序列模型时,你可能想查看数据并检查它是否适合这种类型的建模。

自相关图是你可以用于时间序列分析的工具之一。自相关图允许你检查时间序列中滞后之间的相关性。以下图表展示了这种可视化类型的示例:

图 7.15 – 自相关图

图 7.15 – 自相关图

图 7.15 – 自相关图

记住,如果你在处理单变量时间序列,你的时间序列只有一个变量,因此找到你独特变量的滞后之间的自相关对于理解你是否能构建一个好的模型至关重要。

是的,有时候可能会发生这样的情况,你面前没有时间序列。而且,无论你多么努力,你都无法将这类数据建模为时间序列。这类数据通常被称为白噪声

另一种我们无法预测的序列类型被称为随机游走。随机游走本质上是随机的,但它们依赖于前一时间步。例如,随机游走的下一个点可能是在 0 和 1 之间的随机数,也可能是序列的最后一个点。

重要提示

如果你在考试中遇到这些术语,请记住将它们与时间序列中的随机性联系起来。

有了这些,我们已经涵盖了时间序列建模的主要理论。你还应该知道,目前最流行的用于处理时间序列的算法被称为自回归积分移动平均ARIMA)和指数平滑ETS)。我们不会查看这两个模型的细节。相反,我们将看看 AWS 在时间序列建模方面能为我们提供什么。

理解 DeepAR

DeepAR预测算法是 SageMaker 内置的算法,用于使用循环神经网络RNN)预测一维时间序列。

传统的时序算法,如 ARIMA 和 ETS,是为每个时间序列拟合一个模型而设计的。例如,如果你想预测每个地区的销售额,你可能需要为每个地区创建一个模型,因为每个地区可能有自己独特的销售行为。另一方面,DeepAR 允许你在单个模型中操作多个时间序列,这在更复杂的使用案例中似乎是一个巨大的优势。

DeepAR 的输入数据,正如预期的那样,是一个或多个时间序列。这些时间序列中的每一个都可以与以下内容相关联:

  • 一个由cat字段控制的静态(时间无关性)分类特征向量

  • 一个由dynamic_feat控制的动态(时间依赖性)时间序列向量

    重要提示

    注意,在多个时间序列上训练和进行预测的能力与静态分类特征向量密切相关。在定义 DeepAR 将要训练的时间序列时,你可以设置分类变量来指定每个时间序列属于哪个组。

DeepAR 的两个主要超参数是context_length,它用于控制在训练过程中模型可以看到多远的历史,以及prediction_length,它用于控制模型将输出预测的多远未来。

DeepAR 还可以处理缺失值,在这种情况下,指的是时间序列中存在的缺口。DeepAR 的一个非常有趣的功能是它能够从时间序列中创建派生特征。这些派生特征,由基本时间频率创建,有助于算法学习时间依赖性模式。以下表格显示了 DeepAR 根据其训练的每种类型的时间序列创建的所有派生特征:

图 7.16 – 按时间序列频率提取的 DeepAR 特征

图 7.16 – 按时间序列频率提取的 DeepAR 特征

我们现在已经完成了关于预测模型的这一章节。接下来,我们将查看关于监督学习的最后一个算法;即Object2Vec算法。

Object2Vec

Object2Vec 是 SageMaker 内置算法,它泛化了众所周知的word2vec算法。Object2Vec 用于为高维对象创建嵌入空间。根据定义,这些嵌入空间是原始对象的压缩表示,可用于多种目的,例如特征工程或对象比较:

![图 7.17 – 嵌入空间的视觉示例

![图片/B16735_07_017.jpg]

图 7.17 – 嵌入空间的视觉示例

上一张图展示了我们所说的嵌入空间。神经网络模型的第一层和最后一层只是将输入数据映射到自身(由相同大小的向量表示)。

当我们深入到模型的内部层时,数据被越来越压缩,直到它达到这个架构中间的层,也就是嵌入层。在这一特定层,我们有一个更小的向量,其目的是准确且压缩地表示来自第一层的高维原始向量。

通过这种方式,我们刚刚完成了关于 AWS 中机器学习算法的第一部分。接下来,我们将查看一些无监督算法。

无监督学习

AWS 为以下任务提供了几种无监督学习算法:

  • 聚类:

  • K-means 算法

  • 维度降低:

  • 主成分分析PCA

  • 模式识别:

  • IP 洞察

  • 异常检测:

  • 随机切割森林算法RCF

让我们从讨论聚类以及最流行的聚类算法 K-means 的工作原理开始。

聚类

聚类算法在数据科学中非常流行。基本上,它们旨在识别给定数据集中的组。技术上,我们称这些发现或组为。聚类算法属于非监督学习领域,这意味着它们不需要标签或响应变量来训练。

这真是太棒了,因为以前标记的数据很稀缺。然而,它也有一些限制。主要的一个是,聚类算法为你提供簇,但不提供每个簇的含义。因此,必须有人,作为领域专家,分析每个簇的特性来定义它们的含义。

有许多种聚类方法,例如层次聚类和划分聚类。在每种方法内部,我们会找到几种算法。然而,K-Means可能是最流行的聚类算法,你很可能在考试中会遇到它,所以让我们更详细地看看它。

当我们玩 K-means 时,我们必须要指定我们想要创建的簇的数量。然后,我们必须将数据点分配到每个簇中,以便每个数据点只属于一个簇。这正是我们在聚类过程结束时期望得到的结果!

您作为用户,必须指定您想要创建的簇的数量,并将此数字传递给 K-means。然后,算法将随机初始化每个簇的中心点,这也被称为质心初始化

一旦我们得到了每个簇的质心,我们只需要为每个数据点分配一个簇。为此,我们必须使用邻近度或距离度量!让我们采用距离度量的术语。

距离度量负责计算数据点与质心之间的距离。根据距离度量,数据点将属于最近的簇质心!

最著名且使用最广泛的距离度量称为欧几里得距离,其背后的数学非常简单:想象一下,您的数据集点由两个维度组成,X 和 Y。因此,我们可以将点 a 和 b 考虑如下:

  • a (X=1, Y=1)

  • b (X=2, Y=5)

点 a 和 b 之间的欧几里得距离由以下公式给出,其中 X1 和 Y1 代表点 a 的值,X2 和 Y2 代表点 b 的值:

同样的函数可以通过以下方程进行推广!

一旦我们完成这个过程,并为每个数据点分配了一个簇,我们必须重新计算簇质心。这个过程可以通过不同的方法完成,例如单链平均链完整链

由于这种质心更新,我们必须为每个数据点持续检查最近的簇,并持续更新质心。我们必须迭代地重新执行步骤 1 和 2,直到簇质心收敛或达到允许的最大迭代次数。

好的;让我们回顾一下构成 K-means 方法的组件:

  • 质心初始化、簇分配、质心更新,然后重复最后两个步骤,直到收敛。

  • 算法本身:

  • 为每个簇分配数据点的距离度量:

  • 我们在这里选择了欧几里得距离。

  • 以及一种重新计算簇质心的链接方法:

  • 为了我们的演示,我们将选择平均链接。

根据这些定义,我们可以一步一步地通过我们的真实示例。就像我们的回归模型一样,也有一些支持材料可供您参考。

逐步计算 K-means

在这个例子中,我们将在一个非常小的数据集中模拟 K-means,只有两列(x 和 y)和六个数据点(A、B、C、D、E、F),如下表所示:

图 7.18 – K-means 的输入数据

图 7.18 – K-means 的输入数据

在前面的表中,我们创建了三个簇,其质心如下:(1,1),(2,2),(5,5)。簇的数量(3)是**预先定义的*,每个簇的质心是随机定义的。以下图表显示了我们现在算法所处的阶段:

图 7.19 – 完成第一次迭代前的 K-means 结果

图 7.19 – 在完成第一次迭代前绘制 K-means 结果

在这里,你无法看到点 A、B 和 C,因为它们与聚类中心重叠,但不用担心 – 它们很快就会出现。我们现在必须做的是计算每个数据点到每个聚类中心的距离。然后,我们需要选择每个点最近的聚类:

图 7.20 – 处理迭代 1

图 7.20 – 处理迭代 1

在前面的表中,我们有以下元素:

  • 每一行代表一个数据点。

  • 前六列代表每个聚类的质心轴(x 和 y)。

  • 接下来的三列代表每个数据点到每个聚类质心的距离。

  • 最后一列代表每个数据点最近的聚类。

看数据点 A(第一行),我们可以看到它被分配到聚类 1,因为数据点 A 到聚类 1 的距离是 0(记得我告诉过你们它们是重叠的吗?)。同样的计算发生在所有其他数据点上,以定义每个数据点的聚类。

在我们继续之前,你可能想看看我们是如何计算聚类和数据点之间的距离的。正如我们之前所述,我们使用了欧几里得距离,所以让我们看看它是如何起作用的。为了演示目的,让我们检查一下数据点 A 和聚类 3(图 7.20 的第一行,distance-c3列,值 5,7)之间的距离是如何计算出来的。

首先,我们应用了以下公式中的相同方程:

](https://github.com/OpenDocCN/freelearn-ml-zh/raw/master/docs/aws-cert-ml-spec-mls001-cert-gd/img/image171.jpg)

这里,我们有以下内容:

  • X1 = 数据点 A 的 X = 1

  • Y1 = 数据点 A 的 Y = 1

  • X2 = 第 3 个聚类的 X = 5

  • Y2 = 第 3 个聚类的 Y = 5

逐步应用公式,我们将得到以下结果:

图 7.21 – 逐步计算欧几里得距离

图 7.21 – 逐步计算欧几里得距离

这真是太棒了,不是吗?我们几乎完成了 K-means 的第一次迭代。在迭代 1 的最后一步,我们必须刷新聚类中心。记住:最初,我们随机定义了这些中心,但现在,我们已经将一些数据点分配给每个聚类,这意味着我们应该能够识别出聚类的中心点在哪里。

在这个例子中,我们定义了我们将使用平均链连接方法来刷新聚类中心。这是一个非常简单的步骤,结果如下表所示:

图 7.22 – 第一次迭代后的 K-means 结果

图 7.22 – 第一次迭代后的 K-means 结果

前面的表格显示了我们在处理的数据点(顺便说一句,它们永远不会改变),以及簇 1、2 和 3 的中心。这些中心与图 7.18中显示的初始中心相当不同。这是因为它们使用了平均链接来更新!这种方法得到了每个簇的数据点的所有 x 和 y 值的平均值。例如,让我们看看我们是如何得到(1.5, 3.5)作为簇 2 的中心。

如果你查看图 7.20,你会看到只有两个数据点分配给了簇 2:B 和 E。这些是图像中的第二行和第五行。如果我们取每个点的 x 轴的平均值,那么我们将得到(2 + 1) / 2 = 1.5(2 + 5) / 2 = 3.5

到此为止,我们已经完成了 K-means 的第一次迭代,我们可以查看结果:

图 7.23 – 第一次迭代后的 K-means 结果

图 7.23 – 第一次迭代后的 K-means 结果

现在,我们可以看到几乎所有的数据点,除了数据点 A,因为它仍然与簇 1 的中心重叠。继续前进,我们必须重新执行以下步骤:

  • 重新计算每个数据点与每个簇中心的距离,并在必要时重新分配簇

  • 重新计算簇中心

我们会多次执行这两项任务,直到簇中心收敛并且不再改变,或者我们达到允许的最大迭代次数,这可以作为 K-means 的超参数设置。为了演示目的,经过四次迭代后,我们的簇将看起来如下:

图 7.24 – 第四次迭代后的 K-means 结果

图 7.24 – 第四次迭代后的 K-means 结果

在第四次迭代中,我们的簇中心看起来相当一致,我们可以清楚地看到我们可以根据它们的邻近性将六个数据点分组。

重要提示

在这个例子中,我们只为每个数据点设置了两个维度(维度 x 和 y)。在实际应用中,我们可以看到更多的维度,这就是为什么聚类算法在以更自动化的方式识别数据中的组时扮演着非常重要的角色。

我希望你喜欢从头计算 K-means 的过程!我相信这些知识对你的考试和作为数据科学家的职业生涯都会有所帮助。顺便说一句,我已经告诉你很多次,数据科学家必须持怀疑态度和好奇心,所以你可能想知道为什么我们在这个例子中定义了三个簇而不是两个或四个。你也可能想知道我们如何衡量簇的质量。

你不会认为我不会向你解释这一点,对吧?在下一节中,我们将一起澄清这些点。

定义簇的数量和衡量簇的质量

虽然 K-means 是一个在数据中寻找模式的好算法,但它不会提供每个簇的含义,也不会提供你必须创建以最大化簇质量的簇数量。

在聚类中,簇质量意味着我们希望创建具有高同质性的簇内元素和具有高异质性的簇间元素。换句话说,同一簇的元素应该接近/相似,而不同簇的元素应该很好地分离。

计算簇同质性的一个方法是通过使用一个称为平方误差和的度量,或简称为SSE。这个度量将计算每个数据点与其簇质心的平方差之和。例如,当所有数据点都位于簇质心所在的同一点时,SSE 将为 0。换句话说,我们希望最小化 SSE。以下方程正式定义了 SSE:

现在我们知道了如何检查簇质量,就更容易理解如何为给定的数据集定义适当的簇数量。我们只需要找到几个最小化 SSE 的簇。一个围绕该逻辑工作的非常流行的方法被称为肘部方法

肘部方法建议多次执行聚类算法。在每次执行中,我们将测试不同数量的簇,k。在每次执行后,我们计算与该k数量簇相关的 SSE。最后,我们可以绘制这些结果,并选择 SSE 急剧下降的k数量。

重要提示

添加更多的簇将自然会降低 SSE。在肘部方法中,我们希望找到这种变化变得更为平滑的点。

在前面的例子中,我们决定创建三个簇。以下图表显示了支持这一决策的肘部分析:

图 7.25 – 肘部方法

图 7.25 – 肘部方法

我们可以得出结论,添加超过三个或四个簇将给聚类过程增加不必要的复杂性。

当然,在定义簇的数量时,你应该始终考虑业务背景。例如,如果你正在创建客户细分模型,而你的公司已经为四个客户细分准备了商业团队和业务流程,考虑到前面的图表,将簇设置为四个而不是三个是没有害处的。

最后,你应该知道 AWS 已经将 K-means 算法作为其内置算法列表的一部分实现了。换句话说,你不需要使用外部库或自己带来算法来在 AWS 上使用 K-means。

结论

那真是一个了不起的成就:你刚刚掌握了聚类算法的基础,现在你应该能够自己开展关于这个主题的项目和研究!对于考试,记住聚类属于机器学习的无监督领域,因此不需要有标记的数据。

此外,确保你知道这个领域最流行的算法是如何工作的;那就是 K-means。尽管聚类算法不提供每个组的含义,但它们在寻找数据中的模式方面非常强大,无论是为了建模特定问题还是仅仅为了探索数据。

接下来,我们将继续研究无监督算法,看看 AWS 是如何构建出目前最强大的异常检测算法之一的,这个算法被称为随机切割森林RCF)。

异常检测

在建模和数据探索性分析中,发现数据中的异常情况非常常见。有时,你可能只想在拟合回归模型之前找到数据中的异常并去除它们,而有时,你可能想创建一个将识别异常作为最终目标的模型,例如在欺诈检测系统中。

再次强调,我们可以使用许多不同的方法来找到数据中的异常。只要有些创意,可能性是无限的。然而,有一个特定的算法可以解决这个问题,你在考试中应该一定要了解:随机切割森林RCF)。

RCF 是一种基于无监督决策树的算法,它使用训练数据的随机子样本创建多个决策树(森林)。技术上,它随机化数据,然后根据树的数量创建样本。最后,这些样本被分配到每个树中。

这些树集被用来为数据点分配一个异常分数。这个异常分数定义为将这个点添加到树中后,树的复杂度预期的变化。

RCF 最重要的超参数是num_treesnum_samples_per_tree,分别代表森林中的树的数量和每棵树中的样本数量。

维度降低

另一个 AWS 在其内置算法列表中实现的非监督算法被称为主成分分析,简称PCA。PCA 是一种用于减少给定数据集中变量/维度的数量的技术。

PCA 背后的主要思想是将数据点绘制到另一组坐标上,称为主成分PC),目的是解释数据中的最大方差。根据定义,第一个成分将比第二个成分捕获更多的方差,然后第二个成分将比第三个成分捕获更多的方差,依此类推。

只要不超过你的数据集中的变量数量,你就可以设置你需要的任何主成分。以下图表显示了这些主成分是如何绘制的:

![图 7.26 – 在 PCA 中找到主成分]

![img/B16735_07_026.jpg]

图 7.26 – 在 PCA 中找到主成分

正如我们之前提到的,第一个主成分将以这种方式绘制,以便它能捕捉到数据中的大部分方差。这就是为什么它在先前的图表中接近大多数数据点。

然后,第二个主成分将垂直于第一个,因此它将成为解释数据中方差的第二组件。如果你想创建更多的组件(从而捕获更多的方差),你只需遵循添加垂直组件的相同规则。特征向量特征值是与 PCA 相关的线性代数概念,用于计算主成分。

那么,这里的降维故事是什么呢?如果还不清楚,这些主成分可以用来替换你的原始变量。例如,假设你的数据集中有 10 个变量,你想要将这个数据集减少到三个最能代表其他变量的变量。解决这个问题的潜在方法就是应用 PCA 并提取前三个主成分!

这三个组件能解释你数据集的 100%吗?可能不是,但理想情况下,它们将解释大部分的方差。添加更多的主成分将解释更多的方差,但代价是增加了额外的维度。

使用 AWS 内置的 PCA 算法

在 AWS 中,PCA 以两种不同的模式工作:

  • 常规:对于具有适度观察和特征的集合

  • 随机化:对于具有大量观察和特征的集合

不同之处在于,在随机模式下,它使用了一个近似算法。

当然,PCA 的主要超参数是你想要提取的组件数量,称为num_components

IP 洞察

IP 洞察是一种无监督算法,用于模式识别。本质上,它学习 IPv4 地址的使用模式。

这个算法的操作方式非常直观:它是在实体和 IPv4 地址格式的成对事件上训练的,这样它就能理解它所训练的每个实体的模式。

重要提示

例如,我们可以将“实体”理解为用户 ID 或账户号码。

然后,为了进行预测,它接收一对具有相同数据结构(实体,IPv4 地址)的事件,并返回关于该特定 IP 地址相对于输入实体的异常分数。

重要提示

这个由 IP Insight 返回的异常分数推断出事件的模式有多异常。

我们可能会遇到许多与 IP 洞察相关的应用。例如,你可以创建一个基于你的应用程序登录事件(这是你的实体)训练的 IP 洞察模型。你应该能够通过 API 端点公开这个模型以进行实时预测。

然后,在应用程序的认证过程中,你可以调用你的端点并传递尝试登录的 IP 地址。如果你得到了高分(这意味着这种登录模式看起来异常),在授权访问之前(即使密码是正确的),你可以请求更多信息。

这只是你可以考虑的 IP Insights 的许多应用之一。接下来,我们将讨论文本分析。

文本分析

现代应用使用自然语言处理NLP)进行多种目的,例如文本翻译文档分类网络搜索命名实体识别NER)等。

AWS 为大多数 NLP 用例提供了一套算法。在接下来的几个小节中,我们将查看这些内置的文本分析算法。

Blazing Text 算法

Blazing Text 执行两种不同类型的任务:文本分类,这是一种扩展fastText文本分类器的监督学习方法,以及word2vec,这是一种无监督学习算法。

Blazing Text 实现这两种算法已针对在大数据集上运行进行优化。例如,你可以在几分钟内训练一个在数十亿个单词之上的模型。

Blazing Text 的这种可扩展性是由于以下原因:

  • 它能够利用多核 CPU 和单个 GPU 来加速文本分类

  • 它在处理 word2vec 算法时能够使用多核 CPU 或 GPU,并使用定制的 CUDA 内核进行 GPU 加速。

word2vec 选项支持批量跳字图模式,这允许 Blazing Text 在多个 CPU 上执行分布式训练。

重要注意事项

Blazing Text 执行的分布式训练采用小批量方法将一级 BLAS操作转换为三级 BLAS操作。如果在考试中遇到这些术语,你应该知道它们与 Blazing Text 在 word2vec 方面有关。

仍然在 word2vec 模式下,Blazing Text 支持跳字图连续词袋CBOW)架构。

最后但同样重要的是,请注意以下 Blazing Text 的配置,因为它们很可能出现在你的考试中:

  • 在 word2vec 模式下,只有训练通道可用。

  • Blazing Text 期望一个单独的文本文件,其中包含空格分隔的标记。文件的每一行必须包含一个句子。这意味着在使用 Blazing Text 之前,你通常需要预处理你的数据集。

序列到序列算法

这是一个监督算法,它将输入序列转换为输出序列。这个序列可以是文本句子,甚至是音频记录。

序列到序列最常见的用例是机器翻译、文本摘要和语音到文本。你认为的任何序列到序列问题都可以通过这个算法来处理。

从技术上讲,AWS SageMaker 的 Seq2Seq 使用两种类型的神经网络来创建模型:一个循环神经网络RNN)和一个具有注意力机制的卷积神经网络CNN)。

潜在狄利克雷分配,简称LDA,用于主题建模。主题建模是一种文本分析技术,可以从文本数据集中提取一组主题。LDA 根据文本数据集中单词的概率分布来学习这些主题。

由于这是一个无监督算法,因此不需要设置目标变量。此外,必须事先指定主题数量,并且您将不得不分析每个主题以找到它们的领域意义。

神经主题模型(NTM)算法

就像 LDA 算法一样,神经主题模型NTM)也旨在从数据集中提取主题。然而,LDA 和 NTM 之间的区别在于它们的学习逻辑。虽然 LDA 从文档中单词的概率分布中学习,但 NTM 建立在神经网络之上。

NTM 网络架构有一个瓶颈层,它创建了文档的嵌入表示。这个瓶颈层包含预测文档组成所需的所有必要信息,其系数可以被视为主题。

有了这些,我们已经完成了关于文本分析的这一章节。在下一章,我们将学习图像处理算法。

图像处理

图像处理在机器学习中是一个非常热门的话题。这个想法相当直观:创建可以分析图像并在其上做出推断的模型。通过推断,您可以将其理解为检测图像中的对象、对图像进行分类等等。

AWS 提供了一套内置算法,我们可以使用这些算法来训练图像处理模型。在接下来的几节中,我们将查看这些算法。

图像分类算法

正如其名所示,图像分类算法是使用监督学习对图像进行分类的。换句话说,每个图像都需要一个标签。它支持多标签分类。

它的操作方式很简单:在训练期间,它接收一个图像及其相关的标签。在推理期间,它接收一个图像并返回所有预测的标签。图像分类算法使用 CNN(ResNet)进行训练。它可以从头开始训练模型,或者利用迁移学习预先加载神经网络的前几层。

根据 AWS 的文档,支持.jpg.png文件格式,但推荐格式是MXNet RecordIO

语义分割算法

语义分割算法为创建计算机视觉应用提供了像素级的能力。它将图像的每个像素标记为类别,这对于自动驾驶和医学图像诊断等复杂应用来说是一个重要特征。

在其实现方面,语义分割算法使用MXNet Gluon 框架Gluon CV 工具包。你可以选择以下任何算法来训练模型:

  • 全卷积网络FCN

  • 金字塔场景解析PSP

  • DeepLabV3

所有这些选项都作为编码器-解码器神经网络架构工作。网络的输出被称为分割掩码

目标检测算法

就像图像分类算法一样,目标检测算法的主要目标也是不言而喻的:它在图像中检测和分类对象。它使用监督方法来训练深度神经网络。

在推理过程中,此算法返回识别的对象和关于预测的置信度分数。目标检测算法使用单次多框检测器SSD)并支持两种类型的网络架构:VGGResNet

摘要

这真是一次难忘的旅程!让我们花点时间来强调我们刚刚学到的东西。我们将本章分为四个主要部分:监督学习、无监督学习、文本分析和图像处理。我们所学的所有内容都适合机器学习的这些子领域。

我们研究过的监督学习算法列表包括以下内容:

  • 线性学习器算法

  • 分解机算法

  • XGBoost 算法

  • K-最近邻算法

  • Object2Vec 算法

  • DeepAR 预测算法

记住,你可以使用线性学习器、分解机、XGBoost 和 KNN 来解决多种目的,包括回归和分类问题。在这四个算法中,线性学习器可能是最简单的一个;分解机扩展了线性学习器,适用于稀疏数据集,XGBoost 使用基于决策树的集成方法,而 KNN 是一个基于索引的算法。

其他两个算法,Object2Vec 和 DeepAR,用于特定目的。Object2Vec 用于创建数据的向量表示,而 DeepAR 用于创建预测模型。

我们研究过的无监督学习算法列表包括以下内容:

  • K-means 算法

  • 主成分分析PCA

  • IP 洞察

  • 随机切割森林RCF)算法

K-means 是一个非常流行的算法,用于聚类。PCA 用于降维,IP 洞察用于模式识别,RCF 用于异常检测。

我们接下来更详细地研究了回归模型和 K-means。我们这样做是因为,作为数据科学家,我们认为你应该至少掌握这两个非常流行的算法,这样你就可以自己深入研究其他算法。

然后,我们继续本章的后半部分,其中我们讨论了文本分析和以下算法:

  • Blazing Text 算法

  • 序列到序列算法

  • 潜在狄利克雷分配LDA)算法

  • 神经 主题 模型NTM)算法

最后,我们讨论了图像处理,并查看以下内容:

  • 图像分类算法

  • 语义分割算法

  • 目标检测算法

由于这是关于 AWS 机器学习专业考试非常重要的一章,我们鼓励您访问 AWS 网站并搜索机器学习算法。在那里,您将找到我们刚刚覆盖的算法的最新信息。

这就结束了这个快速复习和本章的内容。在下一章中,我们将探讨 AWS 提供的现有机制,我们可以使用这些机制来优化这些算法。

问题

  1. 您正在一家零售公司担任首席数据科学家。您的团队正在构建一个回归模型,并使用内置的线性学习算法来预测特定产品的最优价格。该模型明显对训练数据过拟合,您怀疑这是由于使用了过多的变量。以下哪种方法最适合解决您的怀疑?

    a) 在训练过程中实施交叉验证过程以减少过拟合。

    b) 应用 L1 正则化和改变线性学习算法的wd超参数。

    c) 应用 L2 正则化和改变线性学习算法的wd超参数。

    d) 应用 L1 和 L2 正则化。

    答案

    C,这个问题涉及到由于使用了过多的特征而导致的过拟合问题。线性学习器中通过wd超参数提供的 L2 正则化将作为一个特征选择器。一些不太重要的特征将因获得非常低的权重而受到惩罚,这在实际操作中相当于消除了变量。

  2. RecordIO-protobuf 是一种优化的数据格式,用于训练 AWS 内置算法,其中 SageMaker 将数据集中的每个观测值转换为二进制表示,作为一组 4 字节的浮点数。RecordIO-protobuf 可以在两种模式下操作:管道模式和文件模式。它们之间有什么区别?

    a) 管道模式接受静态加密,而文件模式则不接受。

    b) 在管道模式下,数据将直接从 S3 流式传输,这有助于优化存储。在文件模式下,数据从 S3 复制到训练实例的存储卷。

    c) 在管道模式下,数据从 S3 复制到训练实例存储卷。在文件模式下,数据将直接从 S3 流式传输,这有助于优化存储。

    d) 在管道模式下,数据将直接从 S3 流式传输,这有助于优化存储。在文件模式下,数据从 S3 复制到另一个临时 S3 存储桶。

    答案

    B,请记住,RecordIO-protobuf 具有管道模式,这允许我们直接从 S3 流式传输数据。

  3. 您是您公司的云管理员。您在创建和管理用户访问以及控制云中的日常活动方面已经做了大量出色的工作。然而,您希望通过识别尝试从异常 IP 地址创建云资源的账户来添加一个额外的安全层。针对这个用例,什么是最快的解决方案(选择所有正确答案)?

    a) 创建一个 IP 洞察模型来识别异常访问。

    b) 创建一个聚类模型来识别应用程序连接中的异常。

    c) 将您的 IP 洞察与 Amazon Guard Duty 的现有规则集成。

    d) 将您的异常检测模型与 Amazon Guard Duty 的现有规则集成。

    答案

    A,C, 记住:您总是可以想出不同的方法来解决问题。然而,利用 SageMaker 的内置算法通常是做事最快的方式。

  4. 您正在为一家大型公司担任数据科学家。您的内部客户之一要求您改进他们在生产中实施的一个回归模型。您已经向模型添加了一些特征,现在您想了解由于这种变化,模型的表现是否有所改善。以下哪个选项最好地描述了您应该使用的评估指标来评估您的更改?

    a) 检查新模型的 R 平方是否优于生产中当前模型的 R 平方。

    b) 检查新模型的调整后的 R 平方是否优于生产中当前模型的 R 平方。

    c) 检查新模型的 R 平方和 RMSE 是否优于生产中当前模型的 R 平方。

    d) 检查新模型的调整后的 R 平方 RMSE 是否优于生产中当前模型的 R 平方。

    答案

    D, 在这种情况下,您已经接触到了回归模型评估的特定行为,即通过添加新特征,您总是会提高 R 平方。您应该使用调整后的 R 平方来了解新特征是否为模型增加了价值。此外,RMSE 将为您提供模型性能的商业视角。尽管选项 b 是正确的,但选项 d 最好地描述了您应该做出的最佳决策。

  5. 以下哪个算法是针对稀疏数据进行优化的?

    a) 因子分解机

    b) XGBoost

    c) 线性学习器

    d) KNN

    答案

    A, 因子分解机是一种通用算法,针对稀疏数据进行了优化。

  6. 以下哪个算法在训练过程中使用基于决策树的集成方法?

    a) 因子分解机

    b) XGBoost

    c) 线性学习器

    d) KNN

    答案

    B, XGBoost 是一个非常流行的算法,它使用决策树的集成来训练模型。XGBoost 使用提升方法,其中决策树试图纠正先前模型的错误。

  7. 以下哪个选项被认为是基于索引的算法?

    a) 因子分解机

    b) XGBoost

    c) 线性学习器

    d) KNN

    答案

    D,我们说 KNN 是一个基于索引的算法,因为它必须计算点之间的距离,为这些点分配索引,然后存储排序后的距离及其索引。有了这种类型的数据结构,KNN 可以轻松选择最接近的 K 个点来进行最终预测。

  8. 你是一家大型零售公司的数据科学家,该公司希望预测其按月度区域销售额。你已经进行了一些探索性工作,并发现每个地区的销售模式不同。你的团队已经决定将此项目作为一个时间序列模型来处理,现在你必须选择最佳方法来创建解决方案。以下哪个选项可能会以最少的努力提供一个良好的解决方案?

    a) 使用 ARIMA 算法来解决这个问题。由于每个地区可能有不同的销售行为,你将不得不为每个地区创建一个独立的模型。

    b) 使用 RNN 算法来解决这个问题。由于神经网络具有鲁棒性,你可以创建一个单一模型来预测任何地区的销售额。

    c) 开发一个 DeepAR 模型,并将与每个时间序列相关联的区域设置为一个静态分类特征的向量。你可以使用 cat 字段来设置此选项。

    d) 开发一个 DeepAR 模型,并将与每个时间序列相关联的区域设置为一个静态分类特征的向量。你可以使用 dynamic_feat 字段来设置此选项。

    答案

    C,选项 a 和 c 可能是正确的。然而,问题指出我们想要的是最省力的解决方案。在这种情况下,设置一个 DeepAR 模型并按区域分离时间序列将是预期的解决方案(选项 c)。我们可以通过将静态分类特征的向量传递到 DeepAR 类模型的 cat 字段来设置这种类型的配置。

  9. 你正在处理一个包含九个数值变量的数据集。你想要创建一个散点图来查看这些变量是否可能被潜在地分组在高度相似性的簇中。你该如何实现这个目标?

    a) 执行 K-means 算法。

    b) 使用 PCA 计算两个主成分PCs)。然后,在散点图中绘制 PC1 和 PC2。

    c) 执行 KNN 算法。

    d) 使用 PCA 计算三个主成分PCs)。然后,在散点图中绘制 PC1、PC2 和 PC3。

    答案

    B,使用 K-means 或 KNN 无法解决这个问题。你必须应用 PCA 来减少特征数量,然后在散点图中绘制结果。由于散点图只接受两个变量,选项 b 是正确的。

  10. 你应该如何预处理你的数据,以便在 100 个文本文件上训练一个 Blazing Text 模型?

    a) 你应该创建一个包含空格分隔标记的文本文件。文件的每一行必须包含一个单独的句子。如果你有多个用于训练的文件,你应该将它们全部连接成一个单一的文件。

    b) 你应该创建一个以空格分隔标记的文本文件。文件的每一行必须包含一个句子。如果你有多个用于训练的文件,你应该对每个文件应用相同的转换。

    c) 你应该创建一个以逗号分隔标记的文本文件。文件的每一行必须包含一个句子。如果你有多个用于训练的文件,你应该将它们全部连接成一个单一的文件。

    d) 你应该创建一个以逗号分隔标记的文本文件。文件的每一行必须包含一个句子。如果你有多个用于训练的文件,你应该对每个文件应用相同的转换。

    答案

    选项 a 是正确的。你应该向 Blazing Text 提供一个包含空格分隔标记的单个文件,其中文件的每一行必须包含一个句子。

第八章: 评估和优化模型

现在是时候学习如何评估和优化机器学习模型了。在建模过程中,甚至在模型完成后,你可能想要了解你的模型表现如何。每种类型的模型都有其自己的指标集,可以用来评估性能,这正是我们将在本章中研究的。

除了模型评估之外,作为数据科学家,你可能还需要通过调整算法的超参数来提高你的模型性能。我们将探讨这个建模任务的某些细微差别。

在本章中,我们将涵盖以下主题:

  • 介绍模型评估

  • 评估分类模型

  • 评估回归模型

  • 模型优化

好的,让我们开始吧!

介绍模型评估

有几种不同的场景,我们可能想要评估模型性能,以下是一些例子。

  • 你正在创建一个模型并测试不同的方法和/或算法。因此,你需要比较这些模型以选择最佳模型。

  • 你刚刚完成了你的模型,你需要记录你的工作,这包括在建模阶段指定你达到的模型性能指标。

  • 你的模型正在生产环境中运行,你需要跟踪其性能。如果你遇到模型漂移,那么你可能想要重新训练模型。

    重要提示

    术语模型漂移用来指代模型退化的问题。当你构建机器学习模型时,你必须使用数据来训练算法。这组数据被称为训练数据,它反映了特定时间点的业务规则。如果这些业务规则随时间变化,你的模型可能无法适应这种变化。这是因为它是基于另一个数据集训练的,该数据集反映了另一个业务场景。为了解决这个问题,你必须重新训练模型,以便它可以考虑新业务场景的规则。强化学习系统可能不会遇到这个问题,因为它们可以自行适应新数据。

我们通过设计测试方法来进行模型评估。我们之前已经了解过保留验证和交叉验证。然而,这两种测试方法都有相同的要求:它们需要一个指标来评估性能。

这个指标是特定于问题域的,例如,对于回归模型、分类模型、聚类、自然语言处理等都有特定的指标。因此,在设计你的测试方法时,你必须考虑你正在构建哪种类型的模型,以便定义评估指标。

在以下章节中,我们将探讨你评估模型时应该了解的最重要指标和概念。

评估分类模型

分类模型是你可能会遇到的最传统的模型类别之一,无论是在考试中还是在作为数据科学家的旅程中。在分类模型评估期间你可能想要生成的一个重要工具被称为混淆矩阵

混淆矩阵比较你的模型预测与每个评估类别的真实值。图 8.1展示了在二元分类问题中混淆矩阵的样子:

图 8.1 – 一个混淆矩阵

图 8.1 – 一个混淆矩阵

我们在混淆矩阵中找到了以下组成部分:

  • TP:这是正确阳性案例的数量。在这里,我们需要计算被预测为真且确实为真的案例数量。例如,在一个欺诈检测系统中,这将是被正确预测为欺诈的欺诈交易数量。

  • TN:这是正确阴性案例的数量。在这里,我们需要计算被预测为假且确实为假的案例数量。例如,在一个欺诈检测系统中,这将是被正确预测为非欺诈的非欺诈交易数量。

  • FN:这是错误阴性案例的数量。在这里,我们需要计算被预测为假但实际上是真的案例数量。例如,在一个欺诈检测系统中,这将是被错误预测为非欺诈的欺诈交易数量。

  • FP:这是错误阳性案例的数量。在这里,我们需要计算被预测为真但实际上是假的案例数量。例如,在一个欺诈检测系统中,这将是被错误预测为欺诈的非欺诈交易数量。

在一个完美的场景中,你的混淆矩阵将只有正确阳性和正确阴性案例,这意味着你的模型准确率为 100%。在实践中,如果发生这种情况,你应该持怀疑态度而不是高兴,因为预期你的模型将包含错误。如果你的模型不包含错误,你很可能是过度拟合问题,所以请小心。

一旦预期到错误阴性和错误阳性,你能做的最多就是优先考虑其中之一。例如,你可以通过增加错误阳性来减少错误阴性的数量,反之亦然。这被称为精确度与召回率的权衡。让我们接下来看看这些指标。

从混淆矩阵中提取指标

我们可以从混淆矩阵中提取的最简单指标被称为准确率。准确率是通过将正确阳性和正确阴性的数量除以总案例数量来计算的。在图 8.2中,我们为了演示的目的填写了混淆矩阵的所有组成部分:

图 8.2 – 一个填充了一些示例的混淆矩阵

图 8.2 – 填充了一些示例的混淆矩阵

根据图 8.2,准确率将是(100 + 90) / 210,等于 0.90。当使用准确率指标时,会出现一个常见问题,这与每个类别的平衡有关。高度不平衡的类别问题,例如 99%的正例和 1%的负例,将影响准确率分数并使其变得无用。

例如,如果你的训练数据有 99%的正例(多数类),你的模型很可能会正确分类大多数正例,但在负例(少数类)的分类上表现不佳。准确率将非常高(由于正例分类的正确性),无论少数类分类的结果如何。

关键在于在高度不平衡的问题上,我们通常对正确分类少数类而不是多数类更感兴趣。例如,在大多数欺诈检测系统中就是这种情况,少数类对应于欺诈案例。对于不平衡问题,你应该寻找其他类型的指标,我们将在下一节中介绍。

从混淆矩阵中我们可以提取的一个重要指标被称为召回率,它是真实正例数与真实正例数加上假负例数的比值。换句话说,召回率由真实正例数和总体正例数给出。召回率也被称为灵敏度

根据图 8.2,召回率由 100 / 112 给出,等于 0.89。另一方面,精确度是由真实正例数与真实正例数加上假正例数的比值给出的。换句话说,精确度是由真实正例数和总体预测正例数给出的。精确度也被称为阳性预测值

根据图 8.2,精确度由 100 / 108 给出,等于 0.93。一般来说,我们可以通过降低召回率来提高精确度,反之亦然。还有一个模型评估的伪指标,我们可以在这个精确度与召回率的权衡中玩转。它被称为精确度-召回率曲线

精确度-召回率曲线通过使用不同的概率阈值来总结精确度与召回率的权衡。例如,默认阈值是 0.5,其中任何高于 0.5 的预测将被视为真;否则,它是假的。你可以根据你的需求更改默认阈值,以便你可以优先考虑召回率或精确度。图 8.3显示了精确度-召回率曲线的一个示例:

图 8.3 – 精确度-召回率曲线

图 8.3 – 精确度-召回率曲线

正如你在图 8.3中看到的,提高精确率会减少召回量,反之亦然。图 8.3显示了梯度提升模型(由橙色线表示)的每个阈值与无技能模型(由蓝色虚线表示)的精确率/召回率进行比较。一个完美的模型将曲线近似到点(1,1),在图表的右上角形成一个平方角。

我们可以在混淆矩阵之上进行的另一种视觉分析被称为受试者工作特征ROC)曲线。ROC 曲线根据不同的阈值总结了真正例率假正例率之间的权衡,就像在精确率-召回率曲线中一样。

你已经了解了真正例率,或称为灵敏度,这与我们在精确率-召回率曲线中刚刚学习的内容相同。ROC 曲线的另一个维度是假正例率,它是假正例数除以假正例数加上真正例数。

在文献中,你可能会发现假正例率被称为倒置的特异性,表示为1 – 特异性。特异性给出的是真正例数除以真正例数加上假正例数。此外,假正例率或倒置的特异性是相同的。图 8.4显示了 ROC 曲线的形状:

图 8.4 – ROC 曲线

图 8.4 – ROC 曲线

一个完美的模型将曲线近似到点(0,1),在图表的左上角形成一个平方角。橙色线代表梯度提升分类器的真正例率和假正例率之间的权衡。虚线蓝色线代表一个无技能模型,它无法正确预测类别。

总结一下,对于相当平衡的数据集,你可以使用 ROC 曲线,而对于适度到不平衡的数据集,则可以使用精确率-召回率曲线。

总结精确率和召回率

有时,我们可能想要使用一个总结精确率和召回率的度量,而不是优先考虑其中一个。两个非常流行的度量可以用来总结精确率和召回率:F1 分数曲线下面积AUC)。

F1 分数,也称为F 度量,计算精确率和召回率的调和平均值。AUC 总结了精确率-召回率曲线下的近似面积。

这就带我们来到了分类度量标准部分的结尾。现在让我们来看看回归模型的评估度量标准。

评估回归模型

回归模型与分类模型相当不同,因为模型的输出是一个连续的数字。因此,围绕回归模型的度量旨在监控实际值和预测值之间的差异。

检查预测值(yhat)与其实际值(y)之间差异的最简单方法是通过执行简单的减法操作,其中误差将等于yhat – y的绝对值。这个指标被称为平均绝对误差MAE)。

由于我们通常必须评估每个预测的误差,i,我们必须取误差的平均值。以下公式显示了如何正式定义这个误差:

公式图片

有时候,你可能想要对较大的误差进行惩罚,而不是较小的误差。为了实现这一点,你可以使用另一个指标,被称为平均平方误差MSE)。MSE 将每个误差平方并返回平均值。

通过平方误差,MSE 将对较大的误差进行惩罚。以下公式显示了 MSE 是如何正式定义的:

图片

MSE 存在一个潜在的解释问题。由于它必须计算平方误差,从业务角度来看,解释最终结果可能很困难。均方根误差RMSE)通过取 MSE 的平方根来解决这个问题。以下是 RMSE 的方程式:

公式图片

RMSE 可能是回归模型中最常用的指标,因为它既可以惩罚较大的误差,同时仍然容易解释。

探索其他回归指标

除了我们刚刚学到的那些之外,还有很多适合回归问题的指标。我们在这里可能无法涵盖它们中的大多数,但还有一些额外的指标可能对你来说很重要。

其中一个指标被称为平均绝对百分比误差MAPE)。正如其名称所暗示的,MAPE 将计算每个预测的绝对百分比误差,然后取平均值。以下公式显示了该指标是如何计算的:

图片

MAPE 在预测模型中得到广泛应用,因为它很容易解释,并且提供了关于预测值(从百分比的角度)与实际值之间距离(或接近程度)的良好感觉。

我们现在已经完成了关于回归指标的这一部分。接下来,我们将讨论模型优化。

模型优化

正如你所知,为了衡量你的模型性能和记录你的工作,理解评估指标非常重要。同样,当我们想要优化我们当前的模型时,评估指标在定义我们想要挑战的基线性能中也起着非常重要的作用。

模型优化的过程包括为特定数据分布找到机器学习算法的最佳配置(也称为超参数)。我们不希望找到过度拟合训练数据的超参数,就像我们不希望找到欠拟合训练数据的超参数一样。

你在第一章《机器学习基础》中学习了过拟合和欠拟合。在同一章中,你也学习了如何避免这两种建模问题。

在本节中,我们将了解一些你可以用来找到特定算法和数据集最佳配置的技术。你可以将这些模型优化技术与其他方法(如交叉验证)结合使用,以找到你模型的最佳超参数集,避免拟合问题。

重要提示

总是记住,你不想优化你的算法以适应底层的训练数据,而是要适应训练数据背后的数据分布。这样,你的模型将在训练数据以及生产数据(即在训练过程中从未暴露给模型的那些数据)上工作。只在训练数据上工作的机器学习模型是无用的。这就是为什么将模型调整技术(如我们接下来将要学习的)与采样技术(如交叉验证)结合起来,在创建一个好的模型时至关重要。

网格搜索

网格搜索可能是模型优化中最受欢迎的方法。它包括测试算法的不同组合并选择最佳组合。在这里,有两个重要点我们需要注意:

  • 如何定义最佳模型?

  • 我们应该测试多少种组合?

最佳模型是根据评估指标定义的。换句话说,你必须首先定义你将使用哪个指标来评估模型性能。其次,你必须定义你将如何评估模型。通常,我们使用交叉验证在多个从未用于训练的数据集上评估模型。

在组合数量方面,这是在玩网格搜索时最具挑战性的部分。一个算法的每个超参数可能有多个或有时是无限的可能值。如果你考虑到一个算法通常会有多个超参数,这将成为一个二次成本函数,其中要测试的唯一组合数(也称为测试模型)由超参数 a 的值乘以超参数 b 的值乘以超参数 i 的值给出。图 8.5展示了你可以如何设置决策树模型的网格搜索配置:

图 8.5 – 网格搜索配置

图 8.5 – 网格搜索配置

图 8.5中,有三个超参数:标准最大深度最小叶子节点样本数。每个超参数都有一个用于测试的值列表:分别为 2、3 和 3 个值。这意味着,在网格搜索过程结束时,我们将测试 18 个模型(2 * 3 * 3),其中只有最佳模型将被选中。

如您可能已经注意到,这三个超参数的所有不同组合都将被测试,例如,考虑以下内容:

  • 标准差 = Gini,最大深度 = 2,最小叶子样本数 = 10

  • 标准差 = Gini,最大深度 = 5,最小叶子样本数 = 10

  • 标准差 = Gini,最大深度 = 10,最小叶子样本数 = 10

您可能还想知道的其他问题可能包括以下内容:

  • 考虑到某个特定的算法可能有几个超参数,我应该调整哪些?

  • 考虑到某个特定的超参数可能接受无限值,我应该测试哪些值?

这些是很好的问题,网格搜索不会直接给出答案。相反,这更接近于一个经验过程,您必须测试足够多的内容以达到您的目标性能。

重要提示

当然,网格搜索不能保证您能达到目标性能。这取决于算法和训练数据。

然而,一个常见的做法是使用线性空间对数空间来定义测试值,您可以在其中手动设置要测试的超参数的界限和测试值的数量。然后,中间值将通过线性或对数函数绘制。

如您所想象,网格搜索可能需要很长时间才能运行。已经提出了许多替代方法来解决这个问题。随机搜索就是其中之一,其中测试值的列表是从搜索空间中随机选择的。

在整个行业中迅速得到广泛采用的另一种方法是称为贝叶斯优化。算法优化,如梯度下降,试图通过计算成本函数的导数来找到所谓的全局最小值。全局最小值是您找到具有最低相关成本算法配置的点。

当计算导数不是一种选择时,贝叶斯优化是有用的。因此,我们可以使用贝叶斯定理,一种概率方法,通过使用最少的步骤来找到全局最小值。

在实际应用中,贝叶斯优化将从整个搜索空间开始测试,以找到最有希望的优化超参数集。然后,它将在全局最小值可能存在的特定位置进行更多测试。

摘要

在本章中,您学习了模型评估的主要指标。我们首先从分类问题的指标开始,然后转向回归问题的指标。

在分类指标方面,您已经了解了著名的混淆矩阵,这可能是对分类模型进行模型评估最重要的工具。

除了了解什么是真正例、真反例、假正例和假反例外,我们还学习了如何将这些组件组合起来以提取其他指标,例如准确率、精确率、召回率、F1 分数和 AUC。

我们进一步深入学习了 ROC 曲线以及精确度-召回率曲线。我们了解到,我们可以使用 ROC 曲线来评估相对平衡的数据集,而使用精确度-召回率曲线来评估适度到不平衡的数据集。

顺便说一句,当你处理不平衡数据集时,请记住使用准确率可能不是一个好主意。

在回归指标方面,我们了解到最流行且最可能在AWS 机器学习专业考试中出现的指标是 MAE、MSE、RMSE 和 MAPE。在参加考试之前,确保你了解它们的基本知识。

最后,你学习了超参数优化的方法,其中网格搜索和贝叶斯优化是主要方法。在下一章中,我们将探讨 SageMaker,并学习如何将其用于建模。但首先,让我们花点时间练习这些关于模型评估和模型优化的问题。

问题

  1. 你正在一家制药公司担任数据科学家,与其他团队成员合作创建一个机器学习模型,用于在图像检查中分类某些类型的疾病。公司希望优先考虑正例的确定性率,即使他们必须错误地返回假阴性。你会使用哪种类型的指标来优化底层模型?

    a. 召回率

    b. 精确度

    c. R-squared

    d. RMSE

    答案

    在这个场景中,公司更倾向于以将一些正例错误分类为负例为代价,提高正确预测正例的概率。技术上,他们更倾向于提高精确度,而牺牲召回率。

  2. 你正在一家制药公司担任数据科学家,与其他团队成员合作创建一个机器学习模型,用于在图像检查中分类某些类型的疾病。公司希望优先考虑捕获正例,即使他们必须错误地返回假阳性。你会使用哪种类型的指标来优化底层模型?

    a. 召回率

    b. 精确度

    c. R-squared

    d. RMSE

    答案

    在这个场景中,公司更倾向于找到大多数正例,而以将一些负例错误分类为正例为代价。技术上,他们更倾向于提高召回率,而牺牲精确度。

  3. 你正在一个欺诈识别系统中工作,其中一个组件是分类模型。你想检查模型的表现。以下哪些指标可以使用,为什么?

    a. 准确度。由于欺诈系统数据集自然是不平衡的,这个指标有助于考虑正负类的确定性。

    b. 精确度。由于欺诈系统数据集自然是不平衡的,这个指标有助于考虑正负类的确定性。

    c. 召回率。由于欺诈系统数据集自然不平衡,这个指标有助于考虑正负类的积极性。

    d. F1 分数。由于欺诈系统数据集自然不平衡,这个指标有助于考虑正负类的积极性。

    答案

    选项“d”是唯一一个与所提出指标的解释相匹配并提供对问题有效度量的选项。由于不平衡问题,准确性不能用于这个问题。精确度和召回率可以潜在地一起使用,以提供对问题的质量视图,但在答案列表中没有这样的选项。

  4. 你正在构建一个机器学习模型来预测房价。你将这个问题作为一个回归模型来处理。以下哪个指标不适用于回归模型?(选择所有正确答案。)

    a. 召回率

    b. 精确度

    c. MAPE

    d. RMSE

    答案

    召回率和精确度适用于分类问题;这就是它们是正确答案的原因。另一方面,MAPE 和 RMSE 适用于回归模型。

  5. 以下哪个指标有助于我们在回归模型上惩罚较大误差?

    a. 召回率

    b. 精确度

    c. MAPE

    d. RMSE

    答案

    RMSE 计算每个预测的平方误差。然后,它取 MSE 的平方根。通过计算平方误差,RMSE 会对较大误差进行惩罚,而较小误差则不会。

  6. 你正在为一家金融服务公司担任数据科学家,并创建了一个回归模型来预测信用利用率。如果你决定在模型中包含更多特征,R-squared 和调整后的 R-squared 会发生什么变化?

    a. 调整后的 R-squared 会增加,而 R-squared 可能增加或减少。

    b. R-squared 会减少,而调整后的 R-squared 可能增加或减少。

    c. R-squared 会增加,而调整后的 R-squared 可能增加或减少。

    d. 调整后的 R-squared 会减少,而 R-squared 可能增加或减少。

    答案

    由于额外信息将帮助模型捕捉到数据中的更多变异性,因此 R-squared 会增加。然而,调整后的 R-squared 可能增加或减少,这取决于添加额外变量的收益。

  7. 以下哪个指标将计算错误百分比而不是绝对误差?

    a. 召回率

    b. 精确度

    c. MAPE

    d. RMSE

    答案

    MAPE 适用于回归模型,并且将以百分比数字计算误差。

  8. 你是公司的首席数据科学家。你的团队想要优化一个在生产中不再表现良好的模型。团队已经决定使用网格搜索来重新训练超参数;然而,这个过程花费了很长时间并且没有完成。你可以采取什么方法来加快调整过程,同时最大限度地提高找到更好模型的机会?

    a) 减少搜索空间以加快训练过程。

    b) 使用贝叶斯优化而不是网格搜索。

    c) 增加搜索空间以加快训练过程。

    d) 以上皆非。

    答案

    减少网格搜索的搜索空间将有助于加快调整过程,但你将测试 fewer models。这将减少你找到最佳模型的机会。增加搜索空间将增加调整所需的时间。选项 "b" 是最可重用的,因为贝叶斯优化可以专注于最重要的搜索空间,从而可能减少处理时间并增加你找到最佳模型的机会。

  9. 你正在使用网格搜索调整机器学习模型。在调整过程中,你获得了良好的性能指标。然而,当你将模型在生产环境中执行时,模型性能不可接受。你必须解决问题。以下哪些选项是此问题的有效原因?(选择所有正确答案。)

    a) 你正在训练数据中调整和评估模型,这导致了过度拟合。

    b) 生产数据与训练数据不具有相同的分布。

    c) 你在训练过程中没有使用交叉验证。

    d) 你没有调整正确的超参数。

    答案

    你不能在同一个数据集上调整和测试模型,以免过度拟合。这就是为什么选项 "a" 是正确的。如果生产数据不遵循训练数据的相同分布,则模型将无法工作,因此选项 "b" 也是正确的。选项 "c" 是无效的,因为交叉验证不是模型评估的强制性要求。如果发现在训练数据中发现不良结果,而不是在生产数据中,则选项 "d" 将是正确的。

  10. 你在一家全球金融公司工作。你的团队创建了一个二元分类模型来识别欺诈交易。该模型已投入生产,并自动标记欺诈交易并将它们发送进行进一步筛选。操作团队抱怨这个模型阻止了太多的交易,他们更希望标记更少的交易。根据前面的场景,操作团队有什么期望?

    a) 他们希望将模型阈值校准在 0.5。

    b) 他们希望优先考虑精确度而不是召回率。

    b) 他们希望优先考虑召回率而不是精确度。

    b) 他们希望使用 F-measure。

    答案

    我们总是需要将模型的使用与业务目标和能力相匹配。在这种情况下,模型正在标记大量潜在的欺诈交易,但并没有足够的人力资源来评估所有这些被阻止的交易。此外,更有意义的是将模型“校准”到实际业务场景中,在那里它将标记更少(但更有可能)的欺诈案例以进行进一步筛选。

第九章:Amazon SageMaker 建模

在上一章中,我们学习了多种模型优化和评估技术的方法。我们还学习了各种存储数据、处理数据和将不同的统计方法应用于数据的方式。那么,我们如何现在构建一个管道呢?嗯,我们可以读取数据、处理数据,并在处理后的数据上构建机器学习模型。但如果我的第一个机器学习模型表现不佳怎么办?我能微调我的模型吗?答案是是的;你可以使用 Amazon SageMaker 执行几乎所有操作。在本章中,我们将使用 Amazon SageMaker 带您了解以下主题:

  • 理解 Amazon SageMaker 的不同实例

  • 在 Amazon SageMaker 的 Jupyter Notebook 中清理和准备数据

  • 在 Amazon SageMaker 中进行模型训练

  • 使用 SageMaker 内置的机器学习算法

  • 在 SageMaker 中编写自定义训练和推理代码

技术要求

你可以从 GitHub 下载本章示例中使用的数据,链接为github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide/tree/master/Chapter-9

在 Amazon SageMaker 中创建笔记本

如果你从事机器学习工作,那么你需要执行诸如存储数据、处理数据、准备数据用于模型训练、模型训练以及将模型部署用于推理等操作。这些操作并不容易,每个阶段都需要机器来完成这些任务。使用 Amazon SageMaker,执行这些步骤时生活变得更加简单。

什么是 Amazon SageMaker?

SageMaker 提供训练实例来使用数据训练模型,并提供端点实例来使用模型进行推理。它还提供笔记本实例,运行 Jupyter Notebook,以清理和理解数据。如果你对你的清理过程满意,那么你应该将它们存储在 S3 中,作为训练的预置部分。你可以启动训练实例来消耗这些训练数据并生成机器学习模型。机器学习模型可以存储在 S3 中,端点实例可以消耗模型为最终用户提供结果。

如果你将其绘制成框图,那么它将看起来类似于图 9.1

图 9.1 – Amazon SageMaker 实例不同层的图示

图 9.1 – Amazon SageMaker 实例不同层的图示

现在,让我们来看看 Amazon SageMaker 控制台,并更好地了解它。一旦你登录到你的 AWS 账户并进入 Amazon SageMaker,你会看到类似于图 9.2的内容:

图 9.2 – 快速查看 SageMaker 控制台

图 9.2 – 快速查看 SageMaker 控制台

文档分为三个不同的部分,包括笔记本训练推理,这些部分在图 9.2中进行了扩展,以便我们能够深入理解。

笔记本有三个不同的选项可供使用:

  • 笔记本实例:这有助于我们创建、打开、启动和停止笔记本实例。这些实例负责运行 Jupyter 笔记本。它们允许我们根据用例的工作负载选择实例类型。最佳实践是使用笔记本实例来编排处理大型数据集的数据管道。例如,从笔记本实例调用 AWS Glue 进行 ETL 服务或 Amazon EMR 运行 Spark 应用程序。如果你被要求在 AWS 外部创建一个安全的笔记本实例,那么你需要注意端点安全、网络安全、启动机器、管理实例上的存储以及管理实例上运行的 Jupyter Notebook 应用程序。用户不需要使用 SageMaker 管理任何这些。

  • pip installconda install。然而,一旦笔记本实例终止,自定义设置就会丢失。为了避免这种情况,你可以通过/home/ec2-user/anaconda3/envs/提供的脚本来自定义笔记本实例,并根据需要自定义特定环境。

  • Git 仓库:AWS CodeCommit、GitHub 或任何其他 Git 服务器都可以与笔记本实例关联,以便持久化你的笔记本。如果提供了访问权限,则其他开发者可以使用相同的笔记本进行协作并以源控制方式保存。Git 仓库可以通过此选项单独添加,或者可以在创建笔记本实例时与之关联。

如你在图 9.2中看到的,训练提供了算法训练作业超参数调整作业。让我们了解它们的用法:

  • 算法:这是决定在清洗后的数据上运行算法的第一步。你可以选择一个自定义算法,或者根据用例创建一个自定义算法。否则,你可以在清洗后的数据上运行 SageMaker 算法。

  • 训练作业:你可以通过 API 调用从笔记本实例创建训练作业。你可以设置实例数量,输入数据源详细信息,执行检查点配置,以及输出数据配置。Amazon SageMaker 管理训练实例,并将模型工件作为输出存储在指定的位置。既可以实现增量训练(即,为了获得更好的结果而定期训练模型),也可以实现托管 Spot 训练(即,为了降低成本)。

  • 超参数调整工作:通常,在训练过程之前,算法的超参数被设置好。在训练过程中,我们让算法找出这些参数的最佳值。通过超参数调整,我们可以获得具有最佳超参数值的最佳模型。这可以通过控制台或通过 API 调用完成。同样,也可以从笔记本实例中执行。

推理提供了许多服务,并且每天都在不断发展:

  • 编译工作:如果你的模型使用 Keras、MXNet、ONNX、PyTorch、TFLite、TensorFlow 或 XGBoost 等机器学习框架进行训练,并且你的模型工件存储在 S3 桶中,那么你可以选择目标设备目标平台。目标设备用于部署你的模型,例如 AWS SageMaker 机器学习实例或 AWS IoT Greengrass 设备。目标平台用于确定你希望模型运行的操作系统、架构和加速器。你还可以将编译模块存储在你的 S3 桶中,以供将来使用。这实际上有助于你在跨平台模型部署中。

  • 模型包:这些用于创建可部署的 SageMaker 模型。你可以创建自己的算法,使用模型包 API 打包它,并将其发布到 AWS Marketplace。

  • 模型:模型是通过模型工件创建的。它们类似于带有变量的数学方程式;也就是说,你输入变量的值,得到一个输出。这些模型存储在 S3 中,并将由端点用于推理。

  • VariantWeight API 可以使端点用旧模型处理 80%的请求,用新模型处理 20%的请求。这是数据变化迅速且模型需要定期训练和调整的最常见生产场景。另一个可能的用例是使用实时数据测试模型结果,然后可以将一定比例的请求路由到新模型,并监控结果以验证模型在实时未见数据上的准确性。

  • 端点:这些用于创建一个 URL,模型可以通过该 URL 暴露并请求模型结果作为响应。

  • InputFilterJoinSourceOutputFilter API 可以用来关联输入记录与输出结果。

现在,我们已经对 Amazon SageMaker 有了概述。让我们在下一节中将我们的知识付诸实践。

重要注意事项

Amazon SageMaker 控制台在不断变化。有可能在你阅读这本书的时候,控制台的外观可能有所不同。

在 Amazon SageMaker 笔记本实例上动手实践

在本节中,第一步是创建一个 Jupyter Notebook,这需要一个笔记本实例。让我们首先创建一个笔记本实例,如下所示:

  1. 登录您的 AWS 账户。

  2. 导航到 服务 > Amazon SageMaker

  3. 在左侧导航面板中,点击 笔记本实例,然后点击 创建笔记本实例 按钮。

  4. 提供一个 notebookinstance 并保留 ml.t2.medium 设置。在 IAM 角色创建新角色 中。您将被要求指定存储桶名称。为了本例的目的,它被选为任何存储桶。

  5. 在角色成功创建后,您应该看到类似于 图 9.3 的内容:![图 9.3 – Amazon SageMaker 角色创建 图片

    图 9.3 – Amazon SageMaker 角色创建

  6. 将其他所有设置保留为默认值,然后点击 创建笔记本实例 按钮。

  7. 一旦实例处于 InService 状态,选择实例。点击 操作 下拉菜单并选择 打开 Jupyter。这将打开您的 Jupyter Notebook。

  8. 现在,我们已经准备好在新建的实例上运行我们的 Jupyter Notebook。我们将执行 探索性数据分析 (EDA) 并绘制不同类型的图表来可视化数据。一旦我们熟悉了 Jupyter Notebook,我们将构建一些模型来预测波士顿的房价。我们将应用之前章节中学到的算法,并将它们进行比较,以找到根据我们的数据提供最佳预测的最佳模型。让我们开始吧。

  9. 在 Jupyter Notebook 中,点击 新建 并选择 终端。在命令提示符中运行以下命令以将代码下载到实例:

    sh-4.2$ cd ~/SageMaker/
    sh-4.2$ git clone https://github.com/PacktPublishing/AWS-Certified-Machine-Learning-Specialty-MLS-C01-Certification-Guide.git
    
  10. 一旦 Git 仓库被克隆到 SageMaker 笔记本实例,在命令提示符中输入 exit 以退出。现在,您的代码已准备好执行。

  11. 在 Jupyter Notebook 的 文件 部分导航到 Chapter-9,如图 9.4 所示:![图 9.4 – Jupyter Notebook 图片

    图 9.4 – Jupyter Notebook

  12. 点击 1. 中的第一个笔记本 Boston-House-Price-SageMaker-Notebook-Instance-Example.ipynb。它将提示您选择笔记本的内核。请选择 conda_python3,如图 9.5 所示:![图 9.5 – Jupyter Notebook 内核选择 图片

    图 9.5 – Jupyter Notebook 内核选择

  13. 从笔记本中导航到 内核 > 重启 & 清除输出。点击播放图标依次运行单元格。请确保您已运行每个单独的单元格并检查每个执行/运行的输出。

  14. 您可以通过添加和删除单元格来实验,以便熟悉 Jupyter Notebook 的操作。在其中一个段落中,有一个 bash 命令允许您从笔记本中安装 xgboost 库。

  15. 最后一个单元格解释了我们是怎样比较不同建模技术的不同分数来得出数学结论的。图 9.6 清楚地显示了预测波士顿房价的最佳模型是 XGBoost:![图 9.6 – 比较模型 图片

    图 9.6 – 比较模型

  16. 一旦您完成此笔记本的执行,请随时从 SageMaker 控制台关闭内核并停止您的笔记本实例。这是节省成本的最佳实践。

在下一节的实际操作中,我们将熟悉 Amazon SageMaker 的训练和推理实例。我们还将使用 Amazon SageMaker API 使此过程更简单。我们将使用与之前示例相同的笔记本实例。

亲身体验 Amazon SageMaker 的训练和推理实例

在本节中,我们将学习如何训练模型并将模型托管以生成预测结果。让我们通过使用之前示例中的笔记本实例来深入了解:

  1. console.aws.amazon.com/sagemaker/home?region=us-east-1#/notebook-instances 登录您的 AWS 账户。

  2. 点击 InService,在新标签页中打开它,如图 图 9.7 所示:![图 9.7 – InService 实例

    ![图片 B16735_09_07.jpg]

    图 9.7 – InService 实例

  3. 在 Jupyter Notebook 主页中导航到名为 SageMaker 示例的标签页。

  4. 选择 k_nearest_neighbors_covtype.ipynb 笔记本。点击 使用 并创建一个副本。

  5. 当您运行以下段落,如图 n 图 9.8 所示时,您还可以在 SageMaker 主页的 训练 > 训练作业 中检查一个训练作业:![图 9.8 – SageMaker fit API 调用

    ![图片 B16735_09_08.jpg]

    图 9.8 – SageMaker fit API 调用

  6. 训练作业看起来类似于 图 9.9。它在后端启动一个 ECS 容器,并使用在先前的示例中创建的 IAM 执行角色为此请求运行训练作业:![图 9.9 – 训练 obs

    ![图片 B16735_09_09.jpg]

    图 9.9 – 训练 obs

  7. 如果您进入并检查 CloudWatch 中的日志,它会为您提供有关容器及其执行步骤的更多详细信息。作为一名机器学习工程师,进入并检查 CloudWatch 的 Algorithm 指标是值得的。

  8. 现在,如果您在笔记本中运行以下段落,如图 图 9.10 所示,那么它将创建一个端点配置和一个端点,其中部署了早期训练作业中的模型。

  9. 我已将实例类型更改为节省成本。这是将托管您的模型的实例或机器。请明智地选择您的实例。我们将在下一节中学习如何选择实例类型。我还已更改 endpoint_name 以便易于识别:![图 9.10 – 使用端点详细信息创建预测对象

    ![图片 B16735_09_010.jpg]

    图 9.10 – 使用端点详细信息创建预测对象

  10. 导航到 推理 > 端点。这将显示由上一段执行创建的端点。此端点具有配置,可以通过 推理 > 端点配置 进行导航和跟踪。

  11. 如果您在笔记本中查看推理部分,您会注意到它使用测试数据来预测结果。它使用 SageMaker API 的预测器对象进行预测。预测器对象包含端点详情、模型名称和实例类型。

  12. 端点的 API 调用发生在推理部分,并且通过创建笔记本实例时使用的 IAM 角色进行身份验证。相同的 API 调用可以通过 CloudWatch 调用指标进行追踪。

  13. 最后,在笔记本中运行delete_endpoint方法将删除端点。要删除端点配置,请导航到推理 > 端点配置并选择屏幕上的配置。点击操作 > 删除 > 删除

  14. 现在,请随意关闭内核并从 SageMaker 控制台停止您的笔记本实例。这是节省成本的最佳实践。

在本节中,我们学习了如何使用笔记本实例、训练实例、推理端点和端点配置来清理我们的数据、训练模型以及从它们生成预测结果。在下一节中,我们将学习模型调整。

模型调整

第八章,“评估和优化模型”,您学习了关于模型调整的许多重要概念。现在,让我们从实际的角度来探讨这个话题。

为了在 SageMaker 上调整模型,我们必须调用create_hyper_parameter_tuning_job并传递以下主要参数:

  • HyperParameterTuningJobName: 这是调整作业的名称。这对于跟踪代表您的调整作业已启动的训练作业很有用。

  • HyperParameterTuningJobConfig: 在这里,您可以配置您的调整选项。例如,您想要调整哪些参数,它们的值范围,优化的类型(例如随机搜索或贝叶斯搜索),您想要启动的最大训练作业数量,等等。

  • TrainingJobDefinition: 在这里,您可以配置您的训练作业。例如,数据通道、输出位置、资源配置、评估指标和停止条件。

在 SageMaker 中,我们想要用来评估模型并选择最佳模型的主要指标被称为目标指标

在以下示例中,我们正在为基于决策树的算法配置HyperParameterTuningJobConfig。我们想要检查max_depth超参数的最佳配置,该参数负责控制树的深度。

IntegerParameterRanges中,我们必须指定以下内容:

  • 超参数名称

  • 我们想要测试的最小值

  • 我们想要测试的最大值

    重要注意事项

    每种超参数类型必须适合参数范围部分之一,例如分类、连续或整数参数。

ResourceLimits 中,我们指定了要运行的训练作业数量以及并行作业的数量。请记住,调优过程的目标是执行具有不同超参数设置的多个训练作业,以便从中选择最佳的一个用于最终模型。这就是为什么我们必须指定这些训练作业执行规则。

我们然后在 Strategy 中设置我们的搜索策略,最后在 HyperParameterTuningJobObjective 中设置目标函数:

tuning_job_config = {
    "ParameterRanges": {
      "CategoricalParameterRanges": [],
      "ContinuousParameterRanges": [],
      "IntegerParameterRanges": [
        {
          "MaxValue": "10",
          "MinValue": "1",
          "Name": "max_depth"
        }
      ]
    },
    "ResourceLimits": {
      "MaxNumberOfTrainingJobs": 10,
      "MaxParallelTrainingJobs": 2
    },
    "Strategy": "Bayesian",
    "HyperParameterTuningJobObjective": {
      "MetricName": "validation:auc",
      "Type": "Maximize"
    }
  }

我们需要设置的第二个重要配置是 TrainingJobDefinition。在这里,我们必须指定将要执行的训练作业的所有详细信息。最重要的设置之一是 TrainingImage 设置,它指的是将启动以执行训练过程的容器。正如预期的那样,这个容器必须实现你的训练算法。

这里,我们提供了一个内置算法的示例,eXtreme Gradient Boosting,以便你可以按照以下方式设置训练镜像:

training_image = sagemaker.image_uris.retrieve('xgboost', region, '1.0-1')

然后,你可以继续设置你的训练定义:

training_job_definition = {
    "AlgorithmSpecification": {
      "TrainingImage": training_image,
      "TrainingInputMode": "File"
    },

接下来,我们必须指定数据输入配置,这通常称为数据通道。在下面的代码部分,我们正在设置两个数据通道 – 训练和验证:

    "InputDataConfig": [
      {
        "ChannelName": "train",
        "CompressionType": "None",
        "ContentType": "csv",
        "DataSource": {
          "S3DataSource": {
            "S3DataDistributionType": "FullyReplicated",
            "S3DataType": "S3Prefix",
            "S3Uri": s3_input_train
          }
        }
      },
      {
        "ChannelName": "validation",
        "CompressionType": "None",
        "ContentType": "csv",
        "DataSource": {
          "S3DataSource": {
            "S3DataDistributionType": "FullyReplicated",
            "S3DataType": "S3Prefix",
            "S3Uri": s3_input_validation
          }
        }
      }
    ],

我们还需要指定结果将存储的位置:

    "OutputDataConfig": {
      "S3OutputPath": "s3://{}/{}/output".format(bucket,prefix)
    },

最后,我们设置了资源配置、角色、静态参数和停止条件。在下面的代码部分,我们想要使用两个类型为 ml.c4.2xlarge 且具有 10 GB 存储的实例:

    "ResourceConfig": {
      "InstanceCount": 2,
      "InstanceType": "ml.c4.2xlarge",
      "VolumeSizeInGB": 10
    },
    "RoleArn": <<your_role_name>>,
    "StaticHyperParameters": {
      "eval_metric": "auc",
      "num_round": "100",
      "objective": "binary:logistic",
      "rate_drop": "0.3",
      "tweedie_variance_power": "1.4"
    },
    "StoppingCondition": {
      "MaxRuntimeInSeconds": 43200
    }
}

重要提示

请注意,我们在这个配置文件中使用了其他变量,bucketprefix,分别应该替换为你的存储桶名称和前缀键(如果需要)。我们还引用了 s3_input_trains3_input_validation,这两个变量指向 S3 中的训练和验证数据集。

一旦你设置了配置,你就可以启动调优过程:

smclient.create_hyper_parameter_tuning_job(
     HyperParameterTuningJobName = "my-tuning-example",
     HyperParameterTuningJobConfig = tuning_job_config,
     TrainingJobDefinition = training_job_definition
)

接下来,让我们了解一下如何跟踪此过程的执行。

跟踪训练作业和选择最佳模型

一旦你开始了调优过程,你可能还想检查两个额外的步骤:跟踪调优过程和选择最佳模型(即具有最佳超参数集的模型)。

为了找到你的训练作业,你应该前往 SageMaker 控制台,导航到 超参数训练作业。然后,你会找到一个已执行调优作业的列表,包括你的作业:

![图 9.11 – 找到你的调优作业

![img/B16735_09_011.jpg]

图 9.11 – 找到你的调优作业

如果你通过点击其名称访问你的调优作业,你将找到一个摘要页面,其中包含有关调优过程的最相关信息。在 训练作业 选项卡下,你会看到所有已执行的训练作业:

![图 9.12 – 调优过程中的训练作业摘要

![img/B16735_09_012.jpg]

图 9.12 – 调优过程中训练作业的总结

最后,如果你点击最佳训练作业标签页,你将找到适合你模型的最佳超参数集,包括一个方便的按钮,可以根据刚刚找到的最佳超参数创建一个新模型:

图 9.13 – 寻找最佳超参数集

]

图 9.13 – 寻找最佳超参数集

如您所见,SageMaker 非常直观,一旦你了解了模型优化的主要概念,使用 SageMaker 应该会更容易。到目前为止,我们已经了解了如何根据我们的特定需求使用 SageMaker。在下一节中,我们将探讨如何为各种用例选择实例类型以及笔记本的安全性。

在 Amazon SageMaker 中选择实例类型

SageMaker 是一种按使用付费的模式。它没有最低费用。

当我们考虑 SageMaker 上的实例时,一切始于一个 EC2 实例。这个实例负责你所有的处理。这是一个托管的 EC2 实例。这些实例不会出现在 EC2 控制台中,也不能通过 SSH 访问。实例类型以 ml 开头。

SageMaker 提供以下系列的实例:

  • t 系列族:这是一个可扩展 CPU 系列。使用这个系列,你得到正常的 CPU 和内存比例。这意味着如果你有一个长时间运行的训练作业,那么随着时间的推移,由于你花费了 CPU 信用额度,你的性能会下降。如果你有非常小的作业,那么它们是成本效益的。例如,如果你想启动一个笔记本实例来运行训练作业,那么这个系列是最相关和成本效益的。

  • m 系列族:在之前的系列中,我们看到了由于它们的可扩展性,CPU 信用额度消耗得更快。如果你有一个需要恒定吞吐量的长时间运行的机器学习作业,那么这就是正确的系列。它提供了与 t 系列类似的 CPU 和内存比例。

  • r 系列族:这是一个内存优化的系列族。我们何时需要这个? 好吧,想象一个需要将数据加载到内存中并对数据进行一些数据工程用例。在这种情况下,你需要更多的内存,你的工作将是内存优化的。

  • c 系列族:c 系列实例是计算优化的。这是需要更高计算能力和较少内存来存储数据的工作的要求。如果你参考以下表格,C5.2x large 有 8 个 vCPU 和 16 GiB 内存,这使得它具有较少内存的计算优化。例如,一个用例需要在较少的记录上进行测试,并且它很擅长计算,那么这个实例系列就是从巨大的数据框中获取一些样本记录并测试你的算法的最佳选择。

  • p系列:这是一个支持加速计算作业(如训练和推理)的 GPU 系列。值得注意的是,p系列实例非常适合处理大型、分布式训练作业,这导致训练时间减少。因此,这变得具有成本效益。P3/P3dn GPU 计算实例的每秒计算能力可达 1 petaFLOP,配备高达 256 GB 的 GPU 内存和 100 Gbps(千兆比特)的联网速度,使用 8x NVIDIA v100 GPU。它们高度优化于训练,并不完全用于推理。

  • g系列:对于成本效益高、小规模训练作业,g系列 GPU 实例是理想的。G4 具有 GPU 实例中最低的推理成本。它使用 T4 NVIDIA GPU。G4 GPU 计算实例的算力可达 520 万亿次,配备 8x NVIDIA T4 GPU。这个实例系列最适合简单网络。

在以下表格中,每个系列都选取了 2x 大型实例类型,以便于比较 CPU 和内存比率:

![Table 9.1 – A table showing the CPU and memory ratio of different instance types]

![img/B16735_09_Table_1.jpg]

表 9.1 – 一个显示不同实例类型 CPU 和内存比率的表格

重要提示

为了便于记忆,你可以将 T 视为 Tiny(小型),M 视为 Medium(中型),C 视为 Compute(计算),P 和 G 视为 GPU。CPU 系列实例类型是 T、M、R 和 C。GPU 系列实例类型是 P 和 G。

选择训练作业的正确实例类型

没有决定所需实例类型的经验法则。它根据数据的大小、网络的复杂性、机器学习算法以及时间、成本等其他因素而变化。提出正确的问题将节省金钱并使其具有成本效益。

如果决定因素是实例大小,那么将问题分类为 CPU 或 GPU 是正确的步骤。一旦这样做,那么考虑是否可以多 GPU 或多 CPU 就很好了。这将解决你的分布式训练问题。这也解决了你的实例数量因素。如果是计算密集型,那么检查内存需求也是明智的。

下一个决定因素是实例系列。这里正确的问题应该是,“它是为了时间和成本优化的吗?”在前一步中,我们已经确定了要解决的问题是在 CPU 还是 GPU 上,这缩小了选择过程。现在,让我们了解推理作业。

选择推理作业的正确实例类型

在生产中,机器学习的成本和复杂性主要在于推理。通常,推理在实时运行单个输入。它们通常计算/内存密集度较低。由于它们一直运行并服务于最终用户请求或作为应用程序的一部分集成,因此它们必须高度可用。

您可以根据工作负载选择我们最近了解到的任何实例类型。除此之外,AWS 还提供Inf1Elastic Inference类型的实例用于推理。Elastic Inference 允许您将 GPU 实例的一部分附加到任何 CPU 实例上。

让我们看看一个示例,其中应用程序与推理作业集成,那么应用程序对 CPU 和内存的需求与推理作业不同。对于这些用例,您需要选择正确的实例类型和大小。在这种情况下,在您的应用程序集群和推理集群之间保持分离是好的。这可能需要一些管理。如果这种管理对您的需求来说是个问题,那么选择弹性推理,其中应用程序和推理作业可以放置在一起。这意味着您可以在同一集群上托管多个模型,并且您可以在内存中的不同加速器上加载所有这些不同的模型,并且可以同时处理并发请求。

在决定生产环境中的实例类型和家族之前,始终建议您在较低的环境中运行一些示例。在下一节中,我们将深入了解并理解保护我们的 Amazon SageMaker 笔记本的不同方法。

保护 SageMaker 笔记本

如果您正在阅读本章的这一部分,那么您已经学习了如何使用笔记本实例,应该选择哪种类型的训练实例,以及如何配置和使用端点。现在,让我们学习如何保护这些实例。以下方面将有助于保护实例:

  • 加密:当我们说或想到通过加密来保护时,这完全是关于数据。但这意味着什么?这意味着使用加密保护静态数据,使用加密保护传输中的数据,并使用 KMS 通过 TLS 1.2 加密更好地进行角色分离和互联网流量隐私。可以使用 AWS 管理的 KMS 密钥启动加密卷的 SageMaker 实例。这有助于您默认保护 Jupyter Notebook 服务器。

  • 当您调用CreateNotebookInstanceUpdateNotebookInstance时,将RootAccess字段设置为Disabled。数据科学家将能够访问他们的用户空间并安装 Python 包。然而,他们不能 sudo 进入 root 用户并更改操作系统。

  • IAM 角色:在启动笔记本实例时,创建一个 IAM 角色用于执行或使用现有的角色进行执行是必要的。这用于启动与角色关联的实例配置文件的服务管理 EC2 实例。此角色将根据附加到该角色的策略限制 API 调用。

  • VPC 连接:当您启动 SageMaker 笔记本实例时,默认情况下,它将在 SageMaker 服务账户中创建,该账户拥有服务管理的 VPC,并且默认情况下将通过互联网网关访问互联网,该网关由服务管理。如果您只处理 AWS 相关的服务,那么建议您在您的 VPC 私有子网中启动 SageMaker 笔记本实例,并使用一个精心定制的安全组。您可以通过连接到该 VPC 的 VPC 端点从该笔记本实例调用或使用 AWS 服务。最佳实践是通过端点策略来控制它们,以实现更好的 API 控制。这确保了数据流出您 VPC 和安全环境的外部限制。为了捕获所有网络流量,您可以开启 VPC 流量日志,这些日志可以通过 CloudWatch 进行监控和跟踪。

  • 在调用 CreateTrainingJobCreateHyperParameterTuningJobCreateModel 时,将 EnableNetworkIsolation 参数设置为 True。网络隔离可以与 VPC 一起使用,这确保了容器不能进行任何出站网络调用。

  • 将私有网络连接到您的 VPC:您可以在您的 VPC 私有子网中启动您的 SageMaker 笔记本实例。这样可以通过与私有网络通信来访问您的私有网络数据,这可以通过使用 Amazon VPN 或 AWS Direct Connect 将您的私有网络连接到您的 VPC 来实现。

在本节中,我们学习了多种保护我们的 SageMaker 笔记本的方法。在下一节中,我们将学习如何使用 Lambda 函数创建 SageMaker 管道。

使用 Lambda 函数创建替代管道

事实上,SageMaker 是一个很棒的平台,您可以使用它来创建训练和推理管道。然而,我们总是可以与不同的服务合作,提出类似的解决方案。我们接下来将要了解的一种服务被称为 Lambda 函数

AWS Lambda 是一种无服务器计算服务,您可以在其中将一个函数作为服务运行。换句话说,您可以将精力集中在仅编写您的函数上。然后,您只需告诉 AWS 如何运行它(即环境和服务配置),所有必要的资源都将配置以运行您的代码,并在完成后取消配置。

第六章 数据处理 AWS 服务 中,您探讨了 Lambda 函数如何与许多不同的服务集成,例如 Kinesis 和 AWS Batch。事实上,AWS 在将 Lambda 与 140 个服务(且列表持续增加)集成方面做得非常好。这意味着当您与特定的 AWS 服务合作时,您会记得它很可能与 Lambda 集成。

这很重要,因为 Lambda 函数真的可以扩大你创建可扩展和集成架构的可能性。例如,你可以在文件上传到 S3 时触发 Lambda 函数,以便在将其加载到 Redshift 之前预处理数据。或者,你可以创建一个 API,在每个端点执行时触发 Lambda 函数。再次强调,这个强大的服务可能性无限。

还有用处的是,你知道你可以用不同的编程语言编写你的函数,例如 Node.js、Python、Go、Java 等。你的函数不一定要由另一个 AWS 服务触发,也就是说,你可以手动触发它,例如用于你的网页或移动应用程序。

当涉及到部署时,你可以将你的函数作为 ZIP 文件或容器镜像上传。虽然这不适合自动化部署过程,但直接在 AWS Lambda 控制台中编码也是可能的。

就像任何其他服务一样,这个服务也有一些你应该知道的缺点:

  • 为你的函数分配的内存:这是从 128 MB 到 10,240 MB(AWS 最近已将此限制从 3 GB 增加到 10 GB,如前所述)。

  • 函数超时:这是最多 900 秒(15 分钟)。

  • 函数层:这是最多 5 层。

  • 爆发并发:这取决于地区,从 500 到 3,000。

  • 部署包大小:这是 250 MB 解压后的大小,包括层。

  • 容器镜像代码包大小:这是 10 GB。

  • /tmp 目录的可用空间:这是 512 MB。

在尝试 Lambda 函数之前,请确保这些限制适合你的用例。将 Lambda 函数与 SageMaker 的替代管道范围更接近,Lambda 的一种潜在用途是为我们的模型创建推理管道。

如你所知,SageMaker 有一个非常方便的 .deploy() 方法,它将为模型推理创建端点。这样,你可以调用它来传递输入数据,以便接收预测结果。在这里,我们可以通过使用 API 网关和 Lambda 函数来创建这个推理端点。

如果你不需要推理端点,只想进行预测并将结果存储在某个地方(批量方式),那么我们需要的只是一个 Lambda 函数,它能够获取输入数据,实例化模型对象,进行预测,并将结果存储在适当的位置。当然,它是通过考虑我们之前讨论的所有限制来做到这一点的。

好的,现在我们已经对 Lambda 和一些用例有了很好的了解,让我们来看看我们应该在考试中注意的最重要配置。

创建和配置 Lambda 函数

首先,你应该知道你可以用不同的方式创建 Lambda 函数,例如通过 AWS CLI(Lambda API 参考)、AWS Lambda 控制台,甚至是部署框架(例如,无服务器框架)。

无服务器框架通常是供应商和编程语言无关的。换句话说,它们通常允许你从一系列云提供商和编程语言中选择你想要部署无服务器基础设施的位置。

重要提示

无服务器架构的概念并不仅限于 AWS。实际上,许多云提供商提供与其他 AWS Lambda 函数类似的服务。这就是为什么构建了这些无服务器框架:帮助开发者和工程师将他们的服务部署到他们想要的地方,包括 AWS。这可能在你的考试中不会出现,但它绝对是你应该知道的事情,这样你就可以意识到作为数据科学家或数据工程师解决挑战的不同方式。

由于我们想要通过 AWS 机器学习专业考试,因此在这里我们采取了遍历 AWS Lambda 控制台的方法。这样做是为了让你更熟悉他们的界面和最重要的配置选项。

当你导航到 Lambda 控制台并请求一个新的 Lambda 函数时,AWS 将为你提供一些起始选项:

  • 从零开始:如果你想要从头开始创建你的函数。

  • 使用蓝图:如果你想要从示例代码和配置预设的常见用例中创建你的函数。

  • 容器镜像:如果你想要选择一个容器镜像来部署你的函数。

  • 浏览无服务器应用程序存储库:如果你想要从 AWS 无服务器应用程序存储库部署一个示例 Lambda 应用程序。

从零开始,下一步是设置你的 Lambda 配置。AWS 将这些配置分为基本和高级设置。在基本配置中,你将设置你的函数名称、运行时环境和权限。图 9.14 展示了这些配置:

![图 9.14 – 从 AWS Lambda 控制台创建新的 Lambda 函数]

![图片 B16735_09_014.jpg]

![图 9.14 – 从 AWS Lambda 控制台创建新的 Lambda 函数]

在这里,我们有一个在考试期间你应该记住的非常重要的配置:执行角色。你的 Lambda 函数可能需要访问其他 AWS 资源的权限,例如 S3、Redshift 等。执行角色授予你的 Lambda 函数所需的权限,以便它可以根据需要访问资源。

你必须记住,你的 VPC 和安全组配置也会影响你的 Lambda 函数的运行方式。例如,如果你想创建一个需要互联网访问来下载内容的函数,那么你必须在这个有互联网访问的 VPC 中部署这个函数。同样的逻辑也适用于其他资源,例如访问关系型数据库、Kinesis、Redshift 等。

此外,为了正确配置 Lambda 函数,我们至少需要编写其代码,设置执行角色,并确保 VPC 和安全组配置符合我们的需求。接下来,让我们看看其他配置。

完成你的配置并部署 Lambda 函数

一旦你在 AWS 控制台中创建了 Lambda,你可以在部署函数之前设置额外的配置。其中之一就是事件触发器。如我们之前提到的,你的 Lambda 函数可以从各种服务触发,甚至可以手动触发。

重要提示

一个非常常见的触发器示例是事件桥接。这是一个 AWS 服务,你可以在这里安排你的函数执行。

根据你选择的触发器类型,你的函数将能够访问不同的事件元数据。例如,如果你的函数是由 S3 上的PUT事件触发的(例如,有人上传文件到特定的 S3 存储桶),那么你的函数将接收到与该事件相关的元数据,例如存储桶名称和对象键。其他类型的触发器将提供不同类型的事件元数据!

你可以通过属于你函数入口点签名的 event 参数访问这些元数据。不够清楚吗?好吧,让我们看看你的函数代码应该如何声明,如下所示:

def lambda_handler(event, context):
TODO   

在这里,lambda_handler 是代表你的函数入口点的方法。当它被触发时,这个方法将被调用,并且它将通过 event 参数接收与事件触发相关的事件元数据。这就是你如何访问与触发你的函数的底层事件相关的信息!event 参数是一个类似 JSON 的对象。

如果你想要测试你的函数,但又不想直接从底层事件触发它,那没问题;你可以使用测试事件。它们通过准备一个将被传递给函数的 JSON 对象来模拟底层事件。

图 9.15 展示了一个非常直观的例子。假设你创建了一个函数,当用户上传文件到 S3 时会触发该函数,现在你想要测试你的函数。你可以上传一个文件到 S3(这将强制触发器)或者创建一个测试事件。

通过创建一个测试事件,你可以准备一个模拟 S3-put 事件的 JSON 对象,然后将此对象传递给你的函数:

图 9.15 – 从 Lambda 控制台创建测试事件

图 9.15 – 从 Lambda 控制台创建测试事件

你还可以设置的一种配置类型是环境变量,这些变量将在你的函数中可用。图 9.16 展示了如何在 Lambda 函数中添加环境变量:

图 9.16 – 向 Lambda 函数添加环境变量

图 9.16 – 向 Lambda 函数添加环境变量

您可以随时返回这些基本配置进行必要的调整。图 9.17显示了基本配置部分的内容:

图 9.17 – 修改 Lambda 函数的基本配置

图 9.17 – 修改 Lambda 函数的基本配置

图 9.17 – 修改 Lambda 函数的基本配置

在监控方面,Lambda 函数默认会生成一个CloudWatch日志流和标准指标。您可以通过浏览 Lambda 函数监控部分并点击“在 CloudWatch 中查看日志”来访问日志信息。

在 CloudWatch 中,每个 Lambda 函数都将有一个日志组,在该日志组内部有许多日志流。日志流存储相关函数的执行日志。换句话说,日志流是一系列共享相同来源的日志,在这种情况下,来源是您的 Lambda 函数。日志组是一组共享相同保留、监控和访问控制设置的日志流。

我们即将结束本节,但还没有结束关于 Lambda 函数的主题。正如我们之前提到的,这项 AWS 服务有很多用例,并与许多其他服务集成。在下一节中,我们将探讨另一个 AWS 服务,它将帮助我们编排 Lambda 函数的执行。这些被称为AWS Step Functions

与 Step Functions 一起工作

Step Functions 是 AWS 的一项服务,允许您创建工作流程以编排 Lambda 函数的执行。这样,您可以按事件序列将它们连接起来,这些序列被称为步骤。这些步骤被分组在一个状态机中。

Step Functions 集成了重试功能,这样您就可以配置您的管道仅在特定步骤成功后继续执行。您设置这些重试配置的方式是创建一个重试策略

重要提示

就像 AWS 的大多数服务一样,AWS Step Functions 也与其他服务集成,而不仅仅是 AWS Lambda。

创建状态机相对简单。您只需导航到 AWS Step Functions 控制台,然后创建一个新的状态机。在“创建状态机”页面上,您可以指定您是否想从头开始创建状态机、从模板创建,或者只是运行一个示例项目。

AWS 将帮助您创建状态机,因此即使您选择从头开始创建,您也会找到用于各种任务的代码片段,例如 AWS Lambda 调用、SNS 主题发布、运行 Athena 查询等。

为了演示,我们将创建一个非常简单但仍然有用的示例,说明如何使用带有重试选项激活的 Step Functions 执行 Lambda 函数:

{
  "Comment": "A very handy example of how to call a lamnbda function with retry option",
  "StartAt": "Invoke Lambda function",
  "States": {
    "Invoke Lambda function": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:your-function-identification",
        "Payload": {
          "Input": {
            "env": "STAGE"
          }
        }
      },
      "Retry": [
        {
          "ErrorEquals": ["States.ALL"],
          "IntervalSeconds": 60,
          "MaxAttempts": 5,
          "BackoffRate": 2.0
        }
      ],
      "Next": "Example"
     },
    "Example": {
      "Type": "Pass",
      "Result": "Just to show you how to configure other steps",
      "End": true
    }
  }
}

在前面的示例中,我们创建了一个包含两个步骤的状态机:

  • 调用 Lambda 函数:这将启动底层 Lambda 的执行。

  • 示例:这是一个简单的传递任务,只是为了向您展示如何在管道中连接第二个步骤。

在第一步中,我们还设置了一个重试策略,如果出现任何失败,它将尝试重新执行此任务。我们设置间隔(以秒为单位)以再次尝试,并在此显示尝试次数。图 9.18显示了状态机:

图 9.18 – 状态机

图 9.18 – 状态机

我们现在已经到达了这个部分和这一章的结尾。接下来,让我们总结一下我们学到了什么。

摘要

在本章中,我们学习了如何使用 SageMaker 创建笔记本实例和训练实例。随着我们的学习,我们学习了如何使用 SageMaker 进行超参数调整作业。由于我们资产在 AWS 的安全性是至关重要的,我们学习了各种保护 SageMaker 实例的方法。通过动手实践,我们创建了步骤函数,并使用 AWS Lambda 编排我们的管道。

每天都有 AWS 产品在不断发展,帮助我们解决 IT 问题。记住所有产品名称并不容易。唯一的学习方式是通过实践。当您解决问题或构建产品时,请专注于您产品的不同技术领域。这些领域可以是 AWS 服务,例如,安排作业、日志记录、跟踪、监控指标、自动扩展等。

计算时间、存储和网络是基础。建议您为每个服务练习一些示例。参考 AWS 文档以澄清任何疑问也是最佳选择。始终重要的是以经济高效的方式设计您的解决方案,因此探索使用这些服务的经济高效方式与构建解决方案同样重要。祝大家一切顺利!

问题

  1. 以下哪些模型是监督算法?选择两个选项。

    A. 聚类

    B. 分类

    C. 关联规则挖掘

    D. 回归

  2. 您希望将您的 Amazon SageMaker 机器学习模型和端点转换为面向客户的应用程序。您决定将这些放在一个可以通过浏览器访问的单个 Web 服务器上。然而,您意识到 Web 服务器本身不具有可扩展性;如果它收到大量流量,可能会耗尽 CPU 或内存。您如何使这种方法更具可扩展性和安全性?选择三个答案。

    A. 创建 IAM 角色,以便 Web 服务器可以访问 SageMaker 端点。

    B. 部署负载均衡器并设置自动扩展。

    C. 将所有客户都设置为 IAM 用户,以便他们可以访问 SageMaker。

    D. 保持 Web 服务器的操作系统和语言运行时安全更新。

  3. 对于前述情况,哪个 AWS 服务更适合自动化服务器和操作系统维护、容量配置和自动扩展?

    A. AWS Lambda

    B. AWS Fargate

    C. AWS ELB

  4. Amazon SageMaker 是一项完全托管的服务,它使您能够快速轻松地将基于机器学习的模型集成到您的应用程序中。它还提供笔记本、训练和端点实例等服务,以帮助您完成任务。

    A. 正确

    B. 错误

  5. 从以下陈述中选择三个正确的:

    A. 笔记本实例清理和理解数据。

    B. 训练实例使用数据来训练模型。

    C. 端点实例使用模型进行推理。

    D. 笔记本实例清理、理解和构建模型。

    E. 训练实例用于预测结果。

  6. 创建笔记本的第一步是什么?

    A. 给它一个名字。

    B. 选择一个核。

    C. 以段落格式开始编写代码。

  7. 线性学习者和 XGBoost 算法可用于监督学习模型,如回归和分类。

    A. 正确

    B. 错误

  8. 关于超参数调整的以下哪个陈述是正确的?

    A. 超参数调整是提高您模型的一种保证方法。

    B. 超参数调整不需要任何输入值。

    C. 超参数调整使用回归来选择最佳测试值。

    D. 超参数调整是一个无监督的机器学习回归问题。

答案

1. B 和 D

2. A, B, 和 D

3. A

4. A

5. A, B, 和 C

6. B

7. A

8. C

posted @ 2025-09-03 09:53  绝不原创的飞龙  阅读(2)  评论(0)    收藏  举报