IBM-沃森机器学习实用指南-全-

IBM 沃森机器学习实用指南(全)

原文:annas-archive.org/md5/3fc635d5a04dce9753f56936972c2a89

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

本书是使用 Python 在 IBM Cloud 上精通机器学习的完整指南。你将学习如何构建完整的机器学习解决方案,重点关注数据表示和特征提取的作用。

本书从监督学习和无监督学习概念开始,包括 IBM Cloud 和 Watson 机器学习服务的概述。你将通过实际案例学习如何运行各种技术,如 k-means 聚类、KNN、时间序列预测、视觉识别和文本到语音在 IBM Cloud 上的应用。你将学习如何在 Watson Studio 中创建 Spark 管道。本书还将指导你在 IBM Cloud 上使用 TensorFlow 进行深度学习和神经网络原理。你将学习如何使用 NLP 技术构建聊天机器人。随后,你将涵盖三个强大的案例研究——面部表情分类平台、岩性分类的自动化分类和多生物识别身份验证平台——以熟悉这些方法。

在本书结束时,你将能够很好地构建在 IBM Cloud 上的高效机器学习解决方案。你还将配备实际案例,以便从手头的数据中提取见解。

本书面向对象

本书旨在针对数据科学家和机器学习工程师,他们希望通过实际案例了解 IBM Cloud 及其机器学习服务。

本书涵盖内容

第一章,IBM Cloud 简介,简要介绍了 IBM 云平台和机器学习服务。此外,本章提供了如何在 IBM Cloud 上设置数据科学和机器学习开发环境的详细说明。最后,它通过加载和可视化数据的示例结束。

第二章,特征提取 – 一系列技巧,提供了从实际数据中提取和选择特征的实际操作指南,强调实际机器学习系统都是关于适当的特征工程。本章展示了向机器学习算法提供数据的最佳实践。此外,它还展示了如何移除对机器学习系统性能产生负面影响的冗余数据。本章还介绍了从不同来源组合数据的策略。

第三章,《为您的数据选择监督机器学习模型》,是整本书的骨架。它提供了机器学习范式的导览,重点关注著名的方法和算法。本章首先提供了模型评估、模型选择和算法选择在机器学习中的实际背景。然后它涵盖了监督学习,并讨论了回归问题的机器学习算法。到本章结束时,你应该能够为手头的数据选择合适的监督机器学习模型。

第四章,《实现无监督算法》,是始于第二章《特征提取——一袋技巧》的机器学习范式的导览的后续章节。本章涵盖了无监督学习和半监督学习。此外,它讨论了著名的聚类算法,并在讨论在线学习与批量学习之前结束。

第五章,《在 IBM Cloud 上进行机器学习练习》,提供了精心设计的几个示例,以揭示 Python 作为首选机器学习编程语言的力量以及 IBM Watson Studio 平台上的机器学习服务的能力。本章将使你能够练习适当的特征工程。此外,你将能够在云中运行监督(分类)和无监督(聚类)技术。此外,本章将指导你实现时间序列预测算法。最后,它以视觉识别示例结束。

第六章,《使用 Spark 与 IBM Watson Studio》,提供了在 IBM Watson Studio 中创建 Spark 机器学习管道的指南。

第七章,《在 IBM Cloud 上使用 TensorFlow 进行深度学习》,介绍了 IBM Cloud 上的深度学习和神经网络。还将提供 TensorFlow 在云上的使用概述。本章旨在平衡理论与实际应用。

第八章,《在 IBM Cloud 上创建面部表情平台》,涵盖了一个完整的基于云的面部表情分类解决方案,使用深度学习。它使用 TensorFlow 和 Watson Studio 上的机器学习服务实现了一个简单而高效的神经网络模型。本章演示了一个复杂机器学习任务的端到端解决方案。

第九章, 《使用机器学习自动分类岩相形成*》,展示了一个基于云的机器学习系统,该系统根据井日志测量值来识别岩相。这是钻井应用中的关键步骤。首先,我们将从介绍问题和数据集开始。然后我们将解释此类情况所需的后期处理类型。最后,使用 Watson 平台上的机器学习服务构建完整的解决方案。

第十章, 《构建基于云的多生物特征身份认证平台*》,指导读者如何使用生物特征特性构建一个完整的基于云的人类识别系统。本章首先介绍了问题和数据集。然后解释了每种生物特征所需的后期处理类型。此外,你还将学习如何提取有意义的特征。学习和识别将随后进行。最后,你将练习多模态数据融合。

第十一章,结论,总结了本书,概述了所涵盖的内容。本章还简要介绍了与在云上开发机器学习系统相关的某些实际考虑因素。最后,本书通过讨论读者可能考虑的不同途径来提高他们的技能来结束。

为了充分利用本书

基本的 Python 知识和有限的机器学习理解将有所帮助。

下载示例代码文件

您可以从www.packt.com的账户下载本书的示例代码文件。如果您在其他地方购买了此书,您可以访问www.packt.com/support并注册,以便将文件直接通过电子邮件发送给您。

您可以通过以下步骤下载代码文件:

  1. www.packt.com上登录或注册。

  2. 选择支持选项卡。

  3. 点击代码下载与勘误。

  4. 在搜索框中输入书名,并遵循屏幕上的说明。

下载文件后,请确保您使用最新版本解压缩或提取文件夹:

  • Windows 上的 WinRAR/7-Zip

  • Mac 上的 Zipeg/iZip/UnRarX

  • Linux 上的 7-Zip/PeaZip

本书代码包也托管在 GitHub 上,地址为github.com/PacktPublishing/Hands-On-Machine-Learning-with-IBM-Watson。如果代码有更新,它将在现有的 GitHub 仓库中更新。

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

下载彩色图像

我们还提供了一份包含本书中使用的截图/图表彩色图像的 PDF 文件。您可以从这里下载:www.packtpub.com/sites/default/files/downloads/9781789611854_ColorImages.pdf

使用的约定

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

CodeInText:表示文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 昵称。以下是一个示例:“我们在这个项目中使用的文件(combine.csv)是一个逗号分隔的文本文件,包含参加 NFL 选秀联合会的球员的统计数据。”

代码块设置如下:

df_data_2.createOrReplaceTempView("station")
sqlDF = spark.sql("SELECT * FROM station where VALUE > 200")
sqlDF.show()

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

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

粗体:表示新术语、重要单词或屏幕上看到的单词。例如,菜单或对话框中的单词在文本中显示如下。以下是一个示例:“如果您点击蓝色云注册/登录链接,您可以使用 IBM ID 创建一个免费账户或登录(一旦您设置了付费或免费账户)。”

警告或重要注意事项显示如下。

小贴士和技巧显示如下。

联系我们

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

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

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

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

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

评论

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

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

第一部分:引言和基础

这部分内容是关于 IBM 云和机器学习的介绍。本书的这一部分将帮助您设置即将到来的项目所需的开发环境和必要 API。

本节将涵盖以下章节:

  • 第一章,IBM 云简介

  • 第二章,特征提取 – 一系列技巧

  • 第三章,为您的数据提供监督机器学习模型

  • 第四章,实现无监督算法

第一章:IBM 云简介

在本章中,我们将简要介绍 IBM 云平台及其提供的服务,例如机器学习ML)。此外,本章还将提供如何在 IBM 云上设置数据科学和机器学习开发环境的详细说明。最后,我们将通过一个涉及加载数据和可视化的项目示例来结束。

我们将把第一章分解为以下部分:

  • 理解 IBM 云

  • IBM 云和 Watson 机器学习服务

  • 设置环境

  • 数据可视化教程

理解 IBM 云

我们能对 IBM 云环境说些什么?是什么让它独一无二且如此令人兴奋?首先,IBM 云平台(以前称为Bluemix)实际上将平台即服务PaaS)与基础设施即服务IaaS)相结合,此外,还提供了一组或目录的云服务,您可以将这些服务与 PaaS 和 IaaS 集成,以高效构建个人、企业甚至全球创新的应用程序。

在 IBM 云(从开发者角度)的一些其他关键点包括以下内容:

  • 您可以在所谓的无边界云中开发,这意味着您可以将私有服务连接到 IBM 提供的公共 IBM 云服务

  • 您可以期待看到越来越多的服务和运行时框架被添加并可供您使用

  • 您可以使用 IBM Watson 工具和服务,从想法的起点开始,到开发沙盒,再到全球分布式环境,而无需进行重大投资

  • 您可以从 IBM、开源社区和第三方开发者那里测试和采用广泛的云服务和能力

  • 您可以根据需求或工作负载需求的变化实时控制资源

我们可以做很多事情。

先决条件

作为基于云的环境,IBM 云没有需要担心的先决条件,这使得将其启动和运行变得相当容易。您真正需要的是一台网络浏览器(请参阅文档以获取推荐的版本)和合理的互联网连接。

可选,但推荐的是IBM Cloud Developer Toolset。IBM 将其宣传为与您的应用程序、容器、基础设施和其他服务交互的统一方式。在此安装中,您将获得独立的 IBM Cloud命令行界面CLI),以及 Git、Docker、Helm、kubectl 和 curl 等工具,以及以下 IBM Cloud 插件:

  • IBM Cloud Developer Tools 插件

  • IBM Cloud Functions 插件

  • IBM Cloud Container Registry 插件

  • IBM Cloud Kubernetes Service 插件

  • sdk-gen 插件

如果您想安装 IBM Cloud CLI 以及为 IBM Cloud 应用程序开发推荐的其他插件和工具,请遵循此处在线描述的方法:console.bluemix.net/docs/cli/index.html#overview

访问 IBM 云

让我们开始吧!要访问 IBM 云,您可以访问www.ibm.com/cloud,您将到达云注册/登录页面,如下面的屏幕截图所示:

图片

如果您点击蓝色云注册/登录链接,您可以使用 IBM ID 创建免费账户或登录(一旦您设置了付费或免费账户)。

在您的 ID 经过验证后,您将到达 IBM 云主页面或控制台,如下面的屏幕截图所示:

图片

IBM 云控制台是您用来管理所有 IBM 云资源的用户界面。当您访问控制台时,您可以管理您的账户、登录、访问文档、访问目录、查看定价信息、获取支持或检查 IBM 云组件的状态。

登录后,菜单栏包含一个导航菜单图标和根据您的账户类型提供的其他链接。

从控制台,您可以执行以下任务:

  • 使用导航菜单图标访问仪表板上的所有现有资源。

  • 使用“目录”链接创建新资源。

  • 使用“文档”链接访问有关 IBM 云的有用信息。

  • 从“支持”菜单中,您可以访问有关 IBM 云新功能的信息、支持中心、添加和查看工单的选项以及状态页面。

  • 从“管理”菜单中,您可以访问您的账户、计费和使用信息,以及安全选项。

  • 按下键盘上的正斜杠键(/*)将光标导航到搜索字段。

云资源

通过 IBM 云仪表板或控制台,您可以查看和使用IBM 云资源和 Cloud Foundry服务实例。我们将在后面的章节中深入了解这些内容,但到目前为止,您可以将资源视为任何可以创建、管理和包含在资源组内的东西。一些例子包括应用程序、服务实例、容器集群、存储卷和虚拟服务器。

在以下屏幕截图中,您将看到控制台的上半部分:

图片

而不是在这里向您展示所有功能和特性的完整列表,我们将专注于有助于启动我们的机器学习项目开发的云领域。IBM 云提供了整洁的开发者仪表板(可通过控制台页面左上角的导航菜单图标访问),每个仪表板都专注于不同的兴趣领域(如沃森、安全或金融)或数字渠道(如移动或 Web 应用)。

开发者仪表板的菜单列表如下截图所示:

图片

每个开发者仪表板都提供适用于仪表板关注区域的启动套件,提供一致、直观的工作流程,这有助于您在几分钟内创建一个可工作的应用程序解决方案。

IBM 云和 Watson 机器学习服务

从提供的启动套件列表中选择 Watson 会打开“使用 Watson 构建”页面,其上半部分如下截图所示:

图片

此页面分为几个部分,即概述、启动套件、Watson 服务、开发者资源和应用程序。如果您点击 Watson 服务,然后浏览服务,当前提供的 Watson 相关服务将作为面板呈现,如下截图所示:

图片

在此阶段,我们需要找到一个我们想要使用的服务实例。要选择服务提供,您可以点击您感兴趣的面板(例如,机器学习)。为了确保这是您想要的服务,您可以点击“详情”并阅读服务描述,包括其功能列表和其他相关信息(如下截图所示),然后点击“创建”:

图片

想要更多细节?别忘了点击页面上的“查看文档”链接。

设置环境

要构建基于 Watson 的项目,您需要访问 IBM Watson Studio。

您将从云仪表板菜单(使用前面 访问 IBM 云 部分提供的 URL)访问 IBM Watson Studio。

IBM Watson Studio 是一个集成环境,旨在使开发、训练和管理模型以及部署人工智能应用程序变得容易。您可以使用 Watson Studio 中的神经网络模型器和深度学习实验来解决最具有挑战性和计算密集型的问题,清晰且轻松。您需要您的 IBM ID 来设置此环境。

目前 Watson Studio 有三个版本,分别是 CloudDesktopLocal,每个版本都提供基于您想要执行工作的地方的解决方案:

  • Watson Studio Cloud:您的模型存储在 IBM 公共云中

  • Watson Studio Desktop:您的模型存储在您的桌面上

  • Watson Studio Local:您的模型存储在您的私有局域网或私有 IBM 云上

在本书中,我们将首先关注 Watson Studio Cloud。

Watson Studio Cloud

一旦设置完成,您会发现 Watson Studio Cloud 格式与其他我们合作过的 IBM 网站(例如 IBM Watson Analytics 和云控制台)类似:

图片

所有版本的 Watson Studio 都为您提供了通过协作处理数据来解决业务问题的环境和工具。您可以选择您需要的工具来分析和可视化数据、清洗和塑形数据、摄取流数据,或者创建、训练和部署机器学习模型。

Watson Studio 架构和布局

Watson Studio 的架构围绕项目概念展开。项目是您组织资源并处理数据的地方。项目中最重要的资源包括协作者(您的用户,按安全角色分类)、数据资产(这些指向项目中要使用的数据)以及各种分析资产和工具(您从中提取数据洞察的地方)。

提供了一些有趣的工具,我们将在本书的后续部分详细介绍,例如 Streams Designer、Data Refinery、RStudio 等。您还可以从 IBM Watson 社区引入数据和数据分析资产。

您会发现 Watson Studio 的主页面或主页(有时被称为面板而不是页面)组织得很好,分为以下部分:

  • 一个“入门”部分(如前一个截图所示),您可以点击面板创建(新的)项目或目录。

  • 一个“最后或最近更新的项目”部分,您可以查看您有权访问的项目链接或通过点击“新建项目”创建新项目:

图片

  • 一个“您的目录”部分,您可以查看您有权访问的目录链接;您也可以创建一个新的:

图片

目录是您组织资产(例如,您的数据、数据连接和分析)以及协作者的地方。

  • 一个 Watson 服务部分,您可以查看您正在使用或使用过的活跃服务和工具列表,或者添加新的服务:

图片

  • 其他部分包括“社区新内容”部分:

图片

  • 您还可以查看“有用的链接”:

图片

Watson Studio 简化了服务实例的管理、与队友协作,以及设计、训练和部署模型。本主题是关于在 Watson Studio 中设置机器学习环境。

要在不使用 Watson Studio 的情况下设置 Watson Machine Learning,请参阅此链接:dataplatform.cloud.ibm.com/docs/content/analyze-data/ml-setup.html

建立上下文

在我们设置项目之前需要做的是问自己:我们是要创建一个新项目还是重用现有项目?接下来,我们是要创建一个新的 Watson Machine Learning 服务实例还是重用已经拥有的一个?

设置新项目

简而言之,为了回顾我们已经讨论过的内容,为了设置我们的第一个新项目,我们需要点击主页标题区域中的 IBM Watson 链接,导航到 IBM Watson Studio 主面板。然后我们将执行以下步骤:

  1. 点击“新建项目”。

  2. 选择项目类型:

    • 如果您想使用实验训练复杂的神经网络,请选择深度学习项目

    • 对于所有其他机器学习工作,选择模型器项目类型

  3. 如果您还没有任何所需的服务,例如 Watson 机器学习和 IBM 云对象存储,将创建新的服务实例。

到目前为止,我们本可以进一步探讨 IBM Watson Studio 的每个管理区域,但本书的目标更注重结果导向和动手实践,因此,也许下一步最好的做法是查看一个小而具体的项目,我们将在下一节中这样做。

与 IBM Watson 机器学习和 IBM Watson Studio 相关的有用关键词可以在网上查看dataplatform.cloud.ibm.com/docs/content/analyze-data/ml-terminology.html

数据可视化教程

让我们从简单的项目开始吧!

和往常一样,你开始任何项目都是从陈述项目目标开始的。在这个项目中,目标是使用一个简单的文本文件(TripRuns.csv),该文件包含来自专业驾驶服务组织的成果,来展示如何使用 IBM Watson Studio 轻松创建一个简单的可视化分析仪表板。

使用分析仪表板,您可以构建复杂的分析结果可视化,基于这些结果在仪表板上传达见解,然后轻松与他人共享仪表板。Cognos 仪表板嵌入式使用 IBM Cognos Analytics 的仪表板功能。您可以通过访问以下 URL 了解更多关于如何使用仪表板的信息:www.ibm.com/support/knowledgecenter/en/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.ug_ca_dshb.doc/wa_dashboard_discoveryset_intro.html

现在我们已经明确地陈述了项目目标,并铭记在心,我们需要遵循以下逐步指导:

  1. 点击“新建项目”。

  2. 接下来,点击“创建项目”页面。选择一个项目启动器(所需服务将自动提供。您可以在以后添加其他资产和服务)。对于这个示例项目,我们将通过点击“创建项目”,如图所示来选择业务分析:

  1. 接下来,您需要从下拉列表中选择一个区域,您的项目实例将驻留其中(我选择了美国南部):

  1. 点击“选择”后,如下面的截图所示的“新项目”页面允许您在点击“创建”之前提供适当的项目详细信息:

图片

在“名称”和“描述”下输入名称和描述。对于此示例项目,您可以保留项目、选项和存储以及 Cognos 仪表板嵌入式信息,如前面的截图所示。

一旦创建项目,我们将有一个工作空间,我们可以组织项目将使用的资产。有许多资产(数据、协作者和分析工具),但我们需要从数据开始。要将数据加载到我们的项目工作空间中,我们可以使用直接数据库连接器,或者简单地拖放文件到着陆区(您也可以浏览到您的文件)。

对于我们的简单示例,我们使用文本文件作为数据源,因此您可以在项目工作空间页面右上角点击查找并添加数据图标,如下面的截图所示:

图片

从那里,您可以在页面上点击“加载”,浏览以定位并选择您要在项目中使用的文件(我们的文件是TripRuns.csv)。文件加载后,然后点击“文件”,您应该会看到文件列出并准备好使用:

图片

现在我们有一些数据可以处理,我们可以点击菜单选择“添加到项目”,然后选择“仪表板”:

图片

在您选择仪表板后,您需要在“名称”和“描述”下提供名称和描述,然后点击保存:

图片

在 IBM Watson 为您的新项目设置仪表板后,您可以自定义它,从其一般布局开始。您可以从选择预格式化的模板开始:

图片

一旦您选择了模板(我选择了标签页和自由格式),您将发现自己处于仪表板画布上(如下面的截图所示),在那里我们可以设计您的仪表板:

图片

接下来,点击页面左上角“所选来源”附近的加号图标:

图片

点击加号图标后,您可以选择我们之前添加到项目中的TripRuns.csv数据资产:

图片

如果您想知道什么是连接,那将是您定义任何以直接连接到数据库或其他形式的数据资产的地方。连接资产包含创建数据源连接所需的信息。您创建到 IBM(或其他)云服务和本地数据库的连接。

在选择我们的数据资产后,它应该会显示出来,如下面的截图所示。现在我们准备开始构建我们的仪表板:

截图

当你悬停在数据资产旁边的眼睛图标上时,你会注意到 Watson Studio 会给你一个选项,只需点击眼睛图标就可以快速查看数据资产。当处理多个数据资产时,这非常有用,如下面的截图所示:

截图

既然我们已经准备好继续,我们只需点击我们的数据资产名称(而不是眼睛图标),然后点击页面右下角的带有标题“选择”的按钮。仪表板画布页面再次显示。请注意,页面分为两个部分,如下面的截图所示:

截图

右边是绘图空间或画布,左边是菜单面板,它由三个图标组成:选择来源、可视化、和部件。我们已经设置了我们的数据源,所以让我们点击可视化。可视化选择器会显示出来,在那里你可以选择你想要在分析仪表板上使用的可视化类型:

截图

为了使这个例子简单,我们只是通过点击条形图标选择了条形作为可视化类型。一个构建你的可视化模板将被添加到你的画布上,如下面的截图所示:

截图

从那里,我们可以将数据列拖放到所需的可视化参数中,例如条形和长度。请注意,必需的参数由红色星号标注。

与大多数 Watson 可视化界面一样,当你添加或删除参数值时,可视化会实时更新:

截图

一旦你对你的可视化满意,你可以点击保存图标(位于仪表板操作栏上)来保存你的仪表板。你创建的仪表板会列在项目“资产”页面上的仪表板部分。

从仪表板操作栏,你可以执行以下任务:

  • 将仪表板作为 JSON 文件下载

  • 创建一个永久仪表板 URL 与他人分享

  • 撤销/重做在仪表板上执行的操作

  • 保存仪表板

  • 添加/删除小部件连接

  • 更改仪表板属性,例如颜色

  • 查看仪表板详细信息,例如名称和描述,或者选择与项目关联的多个服务中的一个 Cognos Dashboard 嵌入式服务实例

  • 在社区中查找资源,例如,有用的数据集

摘要

在本章中,我们首先介绍了 IBM 云环境以及如何首次访问它。此外,我们使用 IBM Watson 控制台来说明如何创建项目。

最后,我们回顾了添加新的数据集资产到项目以及用我们的数据在几分钟内创建一个简单的分析仪表板等任务,无需任何编程。

在下一章,我们将探讨特征提取。

第二章:特征提取 - 一系列技巧

在本章中,我们将提供从实际数据中提取和选择特征的实际操作指南,重点是实际机器学习系统都是关于适当的特征工程。本章将专注于教你向机器学习算法提供数据的最佳实践。此外,它将向你展示如何移除可能对机器学习系统性能产生负面影响的数据冗余。最后,它将向你展示一些从不同来源组合数据的策略。

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

  • 预处理

  • 维度缩减

  • 数据融合

  • 一系列技巧

预处理

预处理是什么意思?

除了选择你想要用于特定机器学习项目的特定数据集之外,你还需要预处理这些数据。这通常涉及格式化、清理和采样(或分析)。我们不会深入探讨每个任务的定义,并假设读者已经理解了它们的意义和目的。我们可以这样说,格式化是将数据源以易于在项目中理解和消费的形式呈现的方式。清理主要关注移除不需要的数据,而采样则是为了性能原因减少数据的总体大小。

尽管内心深处我是一个开发者,渴望通过编写脚本或从开源库中选择函数来承担这些任务,但让我们来探索 Watson Studio 为我们提供实现这些目标的功能。

数据精炼器

作为预处理的一部分,Watson Studio 为你提供了精炼数据的能力。在线文档中将精炼数据描述为数据的清理和塑形。

当你在 Watson Studio 中使用精炼器功能操作数据时,你构建了一个被称为定制数据精炼流程的东西。我们可以通过以下步骤尝试数据精炼器提供的一些功能和函数(从一些设置开始):

  1. 要创建一个项目,你点击 Watson Studio 我的项目页面右侧的“新建项目”,如下面的截图所示:

图片

  1. 接下来,选择一个项目启动器。我们将选择数据工程,如下面的截图所示(根据你的选择,你可能需要在此步骤中选择或配置所需的服务;对于我们的选择,不需要额外的服务):

图片

  1. 在新建项目屏幕上,你可以为项目添加名称和描述,如下面的截图所示:

图片

在这一点上,您需要选择是否限制您可以添加为协作者的人员(在本例中,我们将使用默认设置),并且当您添加需要这些服务的资产时,可能会提示您添加服务(在本例中,不需要额外的服务,但作为参考信息,您也可以在通过设置页面创建项目后添加其他服务)。

  1. 接下来,点击“创建”,如图所示:

点击“创建”后,Watson Studio 将为您准备项目,显示如图所示的对话框:

最后(通常只需要一分钟左右),您的新项目将打开,准备就绪,您就可以开始享受开发它的乐趣了!

数据

当然,每个项目都需要数据,所以下一步是将数据添加到我们的项目中。当您添加数据时,它被视为数据资产,默认情况下,所有项目的协作者都可以自动访问数据。按照以下步骤将数据文件添加到您的项目中:

  1. 从项目的“资产”页面,点击“查找并添加数据”图标,如图所示:

  1. 接下来,点击“加载”,然后浏览找到文件,或者如图所示将其拖动到“加载”面板上:

您必须留在该页面上,直到加载完成。如果您想停止加载文件,可以取消正在进行的加载过程。请注意,在文件加载时,实际上并没有任何进度指示器,所以请给它几分钟时间!!

我们在这个项目中使用的文件(combine.csv)是一个逗号分隔的文本文件,其中包含参加 NFL 选秀训练营的球员的统计数据。

  1. 您添加的文件将保存在与您的项目关联的对象存储中,并在项目的“资产”页面上列出为数据资产(如前图所示)。从那里,您必须选择特定的文件,然后点击“添加为数据资产”。此时,您将被提示点击“应用”,如图所示:

现在,我们已经准备好在我们的项目中使用这个文件:

添加精炼器

让我们按照以下步骤添加精炼器:

  1. 要访问 IBM Watson Studio 数据精炼器,您可以点击“添加到项目”,如图所示:

  1. 然后,选择“数据精炼流程”,如图所示:

  1. 在你调用精炼器之后,你需要通过点击数据资产(文件)来添加我们的数据文件,然后点击页面右下角的“添加”。一旦数据被读入精炼器(如下面的截图所示),你就可以开始处理它:

图片

通过使用命令精炼数据

而不是使用脚本处理或精炼你的数据,你可以使用命令(也称为操作)来预处理数据。为此,你可以先输入一个命令(或操作名称),让 Watson Studio 的自动完成功能帮助你找到正确的操作和语法(无需编程!)。

注意,当你悬停在任何操作或函数名称上时,你会看到完成该命令的描述和详细信息。

当你准备好时,你可以点击“应用”将操作添加到你的数据精炼流程中。

例如,你可能想要对数据列进行排序或重新排序。如果你开始输入 arra,你会看到以下结果:

图片

如果你然后点击选择 arrange() 函数,你可以点击括号(())并从你的数据文件中选择一个列,如下面的截图所示:

图片

当你准备好时,点击“应用”按钮将命令添加到数据精炼流程中,如下面的截图所示:

图片

在不保存数据精炼器的情况下(稍后将有更多关于此的信息),Watson Studio 将显示应用命令到你的数据的效果,如下面的截图所示:

图片

有许多命令可供添加到数据精炼流程中。每个命令都将作为流程中的一个步骤添加。如果你点击“步骤”(如下面的截图所示),你可以查看和编辑为流程定义的每个步骤;如果你愿意,甚至可以删除它们。在我们的案例中,我已经添加了三个步骤:第一个是对数据进行排序(排列),第二个是将第一列从字符串转换为整数,第三个是过滤出 2011 年之前的记录,如下面的截图所示:

图片

在任何时候,你可以通过点击以下截图所示的“保存数据精炼流程”和“运行数据精炼流程”图标来保存并运行数据精炼流程:

图片

再次强调,有命令可以执行大多数机器学习项目中所需的几乎所有预处理任务,例如grouprenamesample_nsummarize。也许最重要的是,数据精炼提供了对许多dplyr R 库操作、函数和逻辑运算符的脚本支持。例如,sample_fracsample_n由数据精炼支持,并且对于生成原始数据源的样本数据集非常有用。

我们可以使用以下命令将我们的原始文件(combine_.csv)创建一个数据精炼流程以生成样本:

Sample_n(199, replace=TRUE)

以下命令将生成以下输出:

图片

这将自动读取我们的原始文件,并根据指定的行数(在我们的案例中为 99)创建一个随机数据样本。replace参数表示,如果输出文件名已经存在数据集,则它将被覆盖。

在保存并运行数据精炼流程后,我们将看到我们的结果摘要(以及我们之前的运行列表),如下面的截图所示:

图片

我们可以看到,我们已经从原始数据中创建了一个样本文件,命名为combine.csv_sharped_199.csv,如下面的截图所示:

图片

维度缩减

维度缩减通常用于减少机器学习项目中要考虑的变量数量。它通常用于文件中的数据列具有超过可接受数量的缺失值、方差低或性质极端变化的情况。在尝试通过删除这些不需要的列来缩减数据源之前,您需要确信这是正确的事情要做。换句话说,您想确保您缩减的数据不会在剩余数据中造成偏差。对数据进行概要分析是确定特定列或列的维度缩减是否合适的绝佳方法。数据 概要分析是一种用于检查数据以确定其准确性和完整性的技术。这是检查数据源以揭示数据中的错误部分的过程。

您可以创建有效的脚本来完成这项任务,并且正如预期的那样,有许多包和库可供您下载和使用。然而,再次强调,Watson Studio 可以轻松地为我们完成这项工作。

我们可以通过创建数据资产概要来收集我们所需的信息来描述我们的数据源,而无需编写脚本或进行编程。Watson Studio 默认创建的数据资产概要包括生成的元数据和关于数据文件文本内容的统计信息。

要为您的数据创建一个概要,您可以访问资产的概要页面并点击创建概要。

当数据发生变化时,您可以更新任何现有的概要。

点击创建配置文件后,结果将显示,如下面的截图所示:

图片

您可以花一两分钟的时间滚动查看生成的配置文件,查看各种统计数据,例如列和行的总数。您可以通过列或数据点、值频率、唯一值、最小/最大值、平均值等进行搜索。

数据融合

数据融合不是数据分析实践,而是描述了来自不同来源的数据集成。幸运的是,您会发现您可以使用 Watson Studio 轻松收集和组合数据源。

使用 Watson Studio,您可以为您所有的数据源设置一个目录,以便您可以轻松地查找和共享数据(以及其他资产)。目录是在环境或组织内定义的私有空间。它是组织跨多个数据科学项目资源的一种方式——例如数据资产和分析资产——并且可以用来管理用户对每个这些资产的访问权限。

这个功能特别令人兴奋的是,您可以在单个目录中组织和控制许多不同类型的资产,包括以下内容:

  • 文件中的数据

  • 连接数据

  • 连接本身

  • 文件夹

  • 许多其他分析资产(我们将在本书的后面部分进行实验)

目录设置

创建目录很简单。让我们通过以下步骤创建一个目录:

  1. 首先,点击目录,然后查看所有目录,然后新建目录,如下面的截图所示:

图片

  1. 然后,提供一些基本信息,例如为新目录命名和描述,然后点击创建,如下面的截图所示:

图片

几乎瞬间,全新的目录就会被创建并准备好使用,如下面的截图所示:

图片

  1. 要将一些资产添加到目录中,您可以点击页面右上角的“添加到目录”并选择您想要添加的资产类型(本地文件、连接资产或连接),如下面的截图所示:

图片

  1. 在这里,我们只需将一些本地文件添加到我们的目录中。一旦我们点击本地文件,就会显示“从本地文件添加数据资产”页面(如下面的截图所示),您可以在其中浏览并选择要添加的文件:

图片

  1. 一旦您将所有文件添加到该页面,就必须点击添加,如下面的截图所示:

图片

再次,经过短暂的暂停后,目录将被更新、组织并准备好使用,如下面的截图所示:

图片

  1. 一旦您创建和更新了您的目录,您可以通过点击“访问控制”,如图所示,来管理谁可以访问目录,以及他们如何访问它:

图片

Watson Studio 目录允许协作者快速轻松地查找、预览、评分和消费目录中的每个资产。我们将在本书的后面部分更详细地探讨目录。

推荐资产

Watson Studio 目录的另一个酷特性是,Watson Studio 实际上使用Watson Machine Learning根据您查看、创建和添加到项目的资产的共同属性来推导出一个您尚未访问的资产列表,例如标签、资产分类、属性分类器、数据类型、资产所有者和资产类型。您访问和编目越多资产,建议就越好。我们将在本书的后续章节中更深入地探讨这个功能!

一系列技巧

您在处理数据时的越有序,您可能获得的(任何项目)结果就越一致、越好。为机器学习算法准备数据的过程(选择、预处理和转换)可以使用 IBM Watson Studio 完成,几乎不需要编程或脚本,通过利用数据精炼和目录功能,您在开始时所做的工 作可以反复使用,几乎不需要重新工作。

这里有一些临别的建议:

  • 抽出时间为您资产添加描述,并始终使用描述性的名称

  • 有效地管理您的数据资产:立即删除多余的副本或测试版本,并保持您的目录整洁

  • 严格遵守配置文件功能,以更好地了解您的资产

  • 通过管理项目和资产协作者来控制谁可以访问您的资产

摘要

在本章中,我们直接跳到了使用 IBM Watson Studio 的各种功能来完成各种数据预处理和设置目标,例如使用内置的 R 库进行数据预处理、降维和数据融合。然后我们提供了一些建议,以节省您在准备机器学习项目时的时间。

在下一章中,我们将探讨机器学习范式,并关注各种方法和算法。本章将从机器学习中的模型评估、模型选择和算法选择的实际背景开始,然后涵盖监督学习。

第三章:为您的数据提供监督式机器学习模型

本章(连同前两章)是整本书的骨架。它提供了机器学习范式的概览——通过 IBM Cloud 和 IBM Watson 平台提供的特性和功能,重点关注知名方法和算法。我们将从为模型评估、模型选择和机器学习中的算法选择提供一个相对实用的背景开始本章。接下来,我们将探讨 IBM Cloud 平台如何帮助简化并加速整个过程。

此外,本章还将讨论用于分类和回归问题的机器学习算法,并再次使用 IBM Cloud 平台来探讨这些主题。到本章结束时,读者不仅应该能够理解选择适当分类技术估计量所涉及的概念,而且能够使用 IBM Cloud 构建和部署针对现有数据的基线机器学习模型。

我们将本章分为以下几个部分:

  • 模型选择

  • 测试模型

  • 分类

  • 回归

  • 测试预测能力

模型选择

机器学习变得越来越普遍,了解根据您的数据和目标选择哪种机器学习算法(或模型类型)很重要,如果您对这个过程相对较新,可能会感到有些令人畏惧。

将模型拟合到训练数据是一回事,但您如何知道您选择的模型(技术)或算法能否很好地泛化到所有数据并创建最佳预测?过多的训练或过拟合并不能解决这个问题;实际上,在这种情况下,模型在新数据上表现不佳是典型的。

再次强调,IBM Cloud 平台提供了强大且实用的工具来协助您完成这个过程。

云提供了机器学习服务(IBM Watson Machine Learning)。该服务提供了一种使用持续学习系统管理您开发的机器学习模型的能力,以及包括在线、批量流和流模式在内的简单部署方法。

您可以点击以下链接了解更多关于 IBM Watson Machine Learning 的信息:console.bluemix.net/catalog/services/machine-learning

此外,IBM Watson Studio 中提供的模型构建器(包括教程和示例数据集,说明如何在不编写代码的情况下训练不同类型的机器学习模型)可以通过引导您完成可能繁琐的模型选择任务(甚至评估和部署)来快速入门。

在本章的后面部分,我们将引用提供的数据资产来展示读者理解选择模型类型、训练模型和评估模型性能的过程。

IBM Watson Studio 模型构建器

IBM Watson Studio 中的模型构建器是一个图形工具,它实际上会引导您一步一步地构建您的第一个机器学习模型。模型构建器使用以下工作流程:

  1. 上传数据以进行训练

  2. 选择机器学习技术和算法

  3. 训练和评估模型

  4. 测试和部署模型

模型构建器(目前)专注于创建三种基本的机器学习模型技术(这对于大多数机器学习项目的入门通常已经足够)。此外,对于每种类型的模型,您可以在模型内部选择多个算法来实现。这些被称为模型技术。

构建机器学习解决方案的部分焦虑在于选择合适的 ML 算法。如果您不确定,或者为了节省时间,至少在您的前几次尝试中,您可能希望利用模型构建器自动根据您提供的训练数据为您选择算法的选项。模型技术包括以下内容:

  • 二元分类器:将数据分类到两个类别

  • 多类分类器:将数据分类到多个类别

  • 回归:从连续值集中预测一个值

使用模型构建器

让我们现在逐步了解一些使用模型构建器的初始示例:

  1. 要使用模型构建器,您需要将 Watson 机器学习服务作为资产添加到新的或现有项目中(这被称为将服务与项目关联)。为此,您可以在项目内部点击“添加到项目”,然后选择 WATSON MACHINE LEARNING 服务作为资产类型,如下截图所示:

图片

  1. 一旦您将此服务添加到项目中,您就可以通过点击“模型”下的“新建 Watson 机器学习模型”来创建和添加新模型。

图片

  1. 在“新建模型”页面(如下截图所示),您必须提供您新模型的基本详细信息如下:
  • 名称:您新模型的名称。

  • 描述:对您的模型的描述。

  • 机器学习服务:模型将使用的服务(还有其他服务,但目前我们将选择 IBM Watson 机器学习服务:Machine Learning-bg)。

  • 选择模型类型:在这个初次尝试中,我们希望模型构建器帮助我们选择模型类型和算法,因此您可以选择自动模式。

  • 选择运行时:选择运行环境(目前只需使用默认的 Spark Scala 2.11 选项)。运行环境是内存、空间和 CPU 的组合,这可能会影响定价和成本。您可以在网上查看各种运行环境的详细信息(dataplatform.cloud.ibm.com/docs/content/wsj/console/environment-runtimes.html)。

  1. 最后,您可以点击创建:

图片

Scala 已经获得了很大的流行度,并被大量公司广泛使用。Scala 和 Spark 被 Facebook、Pinterest、Netflix、Conviva 和 TripAdvisor 用于大数据和机器学习应用。IBM 云平台将 Scala 作为其默认选项之一。

如果您错过了或跳过了关联机器学习服务的步骤,当您点击“创建”时,您将看到以下消息:

图片

  1. 如果您看到此消息,您需要点击“关联机器学习服务实例”链接,选择一个服务,然后点击“重新加载”,才能继续创建模型。

训练数据

到此为止,我们需要为我们的模型选择一些训练数据。因此,从选择数据资产页面,我们需要找到我们的特定数据资产(文件),点击其左侧的选择单选按钮,然后点击“下一步”:

图片

作为备注,选择数据资产页面通过如点击预览数据等特性,使确定用于训练模型的数据资产变得容易。

图片

通过悬停在任何列出的资产上,然后点击它(点击预览日期),沃森将为您检索并加载数据以供您审查。

您不能在此处修改或精炼数据,但您可以滚动浏览以确保这是您想要用于训练模型的资产数据。如果您满意并希望将此数据用于模型,您可以点击“使用此数据”:

图片

到此为止,是时候选择三种模型技术中的一种了。首先,您选择您想要预测的内容(数据文件中的列,称为标签列,模型需要预测其值)以及用于确定预测的列。这些是模型应特征化的数据资产中的数据列,或称为特征列。

然后,您可以使用模型构建器建议的技术(换句话说,算法)或选择您自己的:

图片

使用模型构建器的一个明显优势是您可以在购买之前轻松尝试,换句话说,如果您不确定要选择哪种建模技术,您有机会快速使用并评估每个选项,投入最小。在前面的例子中,我选择了一个非常简单的尝试:我想让模型根据选定的年份(或 NFL 赛季)的体重预测球员的身高。

查看提供的模型技术选项,多类分类是将实例分类到三个或更多类别的过程;二分类是将实例分类到两个类别之一,回归将处理大量类别。

猜测要使用的技术

在这个例子中,高度的可能值可能不止两个,因此我们可能会选择多类分类甚至回归。再次强调,由于模型构建者可以快速处理这个问题,所以尝试两者并评估结果会更好。

接下来,如果您指明了手动方法(或选择了手动模式)来构建模型,您将必须点击页面右上角的添加估计器以选择一个或多个特定的估计器。选择正确的模型估计器通常比选择技术更难。不同的估计器更适合不同类型的数据和解决不同的问题。

正如我们将在本章后面看到的那样,模型构建器允许您为同一模型选择多个估计器并在每个估计器上训练,这样您就可以在同一页面上轻松比较和对比每个估计器的性能结果。

使用模型构建者,根据所选的分类技术,您将有一系列估计器可供选择(如下面的截图所示)。例如,我们选择了多类分类,因此您可以选择以下估计器之一:

  • 决策树分类器

  • 随机预测分类器

  • 简单贝叶斯

在这里,我们将选择随机森林分类器估计器并点击添加:

图片

点击添加后,然后点击下一步,模型将基于所选的数据、技术和估计器进行训练。然后结果将发布到选择模型页面(如下面的截图所示),在那里您可以点击保存以保存模型结果以供评估:

图片

一个由模型构建器创建的沃森机器学习模型(创建于模型构建器)成为一项资产,并在 IBM Watson Studio 项目页面上列出(如上图所示),以便以后参考、改进和重用。

值得注意的是,学习如何选择分类技术(算法)和估计器的方法是通过模型构建者的实验。换句话说,使用更广泛的分类和特征选择术语,模型构建者现在使其足够有效和高效,可以测试各种方法来验证假设,轻松评估结果,然后将最佳拟合(关于模型性能和准确性的评估将在本章后面的部分和整本书中详细讨论)作为持续学习模型,用于新的和未见过的数据。

我们将在本章后面通过一些实验更详细地了解这个过程。

部署

将预测模型部署以便在常规决策中利用通常是一个相对复杂的过程,因为存在各种挑战,而且让我们面对现实——从未部署的预测模型永远不会增加价值。

当你使用 IBM Watson Studio 模型构建器创建模型时,你可以在训练后直接从模型构建器部署模型。更好的是,在你部署模型后,你可以为你的模型设置一个持续学习和评估的过程。

当你部署一个模型时,你将其保存到与你的 Watson 机器学习服务关联的模型存储库中,然后你可以使用部署的模型对数据进行评分并构建应用程序。

模型构建器部署步骤

要部署我们的预测模型,我们可以使用以下步骤:

  1. 在模型页面上,点击添加部署。

  2. 在部署模型页面上,选择在线部署类型并输入部署名称和描述。

  3. 点击部署。

  4. 当模型部署完成后,从 ACTION 菜单(如下截图所示圆圈处)点击查看:

部署详情窗口出现,显示三个标签页:概览、实施和测试(如下截图所示):

测试模型

现在是查看如何在 IBM Watson Studio 中测试模型预测的好时机。为此,你可以点击测试:

默认生成的测试格式显示一个输入表单,你可以使用它来输入数据值。稍后,你会看到如果你有一个外部进程生成测试数据,你可以使用输入格式图标来使用 JSON 数据文件格式并粘贴你的数据测试值:

现在(停留在测试标签页),保留默认格式(输入表单)并为重要列输入一些值(输入数据表单使用数据集的样本记录填充)。要测试模型,更改值并点击预测:

  1. 对于年份,请输入 2016

  2. 对于位置,请输入 QB

  3. 对于重量,请输入 225

  4. 点击预测

一旦你的模型测试完成,IBM Watson Studio 会显示该列预测能力的图形评分(百分比)。在以下示例中,字段 5 和 6 分别是位置重量,我们可以通过模型性能评分看到它们的预测能力:

因此,根据前面的输出,我们可能可以得出结论,在我们的 NFL 球员统计文件中,球员的位置是球员身高的一个很好的指标。

如果你想这样做,可以点击输出格式图标(如下截图所示圆圈处)并将性能信息转换为原始输出(查看原始输出):

以这种方式(使用 Watson Studio 部署)部署你的模型时,部署是一次性的事件。换句话说,你输入数据,在数据上训练模型,然后查看性能结果并得出结论。

这对于探索和研究目的来说是有用的,但现实情况下,你可能会希望保留并随着新数据的可用而持续训练模型。为此,你可以使用 IBM Watson Machine Learning 的持续学习系统,该系统提供对模型性能的自动监控(在本章下一节中简要讨论),重新训练和重新部署,以确保模型预测的质量。

持续学习和模型评估

尽管我们不会在本章中深入探讨这个主题,但 IBM Watson Studio 确实提供了一个简单的方法来完成这项任务,使用你在模型构建器中开发并部署的模型。这种方法确实需要选择一个 Spark 服务或环境选项,并建立一个反馈数据存储作为项目资源,这是结果模型性能指标将被保留(保存)的地方。

这些资源可以通过以下截图所示的“配置性能监控”页面进行配置:

图片

一旦你建立了(反馈)数据存储,你就可以使用 Watson Studio 和模型构建器轻松定义作为持续学习过程一部分的指标和触发器,并定期审查更新的模型性能指标,使用图表控件切换指标或以图表或表格的形式查看结果。

分类

分类是机器学习和统计学中的一个关键概念。我们已经展示了模型构建器提供了二元和多元分类技术(以及回归)。在本章的早期部分,我们使用了模型构建器并随意选择了一种分类技术,只是为了展示使用该工具构建、训练和部署模型是多么容易。在本节中,我们将更详细地研究每种技术,并考虑在给定我们的训练数据的情况下,哪种选择最有意义。

二元分类

二元分类(也称为二项式分类)是根据分类规则将给定集合的元素分为两组的过程。产品文档提供了一个很好的示例练习,你可以用它来了解何时二元分类可能是你模型的最佳选择。示例是训练一个模型来预测客户是否可能从户外用品店购买帐篷,基于训练数据样本。如果你继续下载样本数据并检查列,你可以理解二元分类是如何工作的。让我们分析这个练习。

我们想要构建一个模型,该模型可以预测给定客户是否可能购买特定产品;在这种情况下,是帐篷。假设我们再次使用模型构建器创建一个新的模型,加载提供的样本数据,并设置基本模型细节。

流程如下:

  1. 定义一个标签列。在这个例子中,选择的是IS_TENT。此列指示客户是否购买了帐篷。

  2. 定义特征列。特征列是数据中的列,包含机器学习模型将基于其预测的属性。在这份历史数据中,有以下四个特征列:

  • GENDER: 客户性别

  • AGE: 客户年龄

  • MARITAL_STATUS: 已婚单身,或未指定

  • PROFESSION: 客户职业的一般类别,例如酒店业或销售,或简单地其他

  1. 将构建类型设置为自动(这将导致模型构建者自动选择一个算法来实现您指定的机器学习技术)。

  2. 点击创建并添加训练数据。

要训练模型,您将指定前面的标签和特征列,然后选择机器学习技术:二元分类。模型保存后,将自动打开模型详细信息页面。要查看模型构建者使用了哪个算法,您可以转到模型详细信息页面上的概述信息中的摘要表(如下面的截图所示),然后单击模型构建者详细信息行中的“查看”:

这将揭示以下详细信息以供审查:

您可以看到,在选择了二元分类后,模型构建者选择了 LogisticRegression 作为其最佳估计量选择。当因变量是二元的(二分类)时,逻辑回归是通常的选择。在我们的案例中,因变量是我们的标签列,IS_TENT

考虑到我们的数据和目标,结论是选择了二元分类作为技术,因为我们想将数据分类到定义好的类别中(例如,考虑训练数据中的记录如何分组:男性,已婚,从事销售;男性,单身,作为专业人士;等等)。使用的估计量(逻辑回归)被选择,因为,再次,因变量是二元的(购买或不购买)。

将样本数据值与所选技术和估计量对齐,这些选择的推理应该开始变得有意义。继续与数据和模型构建者进行实验以进一步熟悉这些概念是个好主意。

多类分类

多类分类(也称为多项式分类)是将预排列集的元素分类到三个或更多组中的任务。再次,产品文档提供了很好的例子:训练一个模型来预测户外设备店中最有可能引起客户兴趣的产品类别。

在上一节中,示例使用了相同的数据,但本例用例旨在确定产品类别(组)作为结果,而不是特定的购买决策。本例中构建的模型将预测哪个产品线最有可能引起特定客户的兴趣。

在逐步通过示例过程时,我们将拥有相同的训练数据和相同的特征列(与先前的示例相同),但不同的标签列:PRODUCT_LINE。此外,在本例中,而不是选择自动(Automatic),请选择手动(Manual),这样您就可以选择模型使用的特定算法。

因此,为了训练此模型,您将指定先前的标签和特征列,然后选择机器学习技术:多类分类(Multiclass Classification)。在这个练习中的另一个不同之处在于,我们希望为模型添加两个估计器(算法选择),以便我们可以比较每个性能:

  1. 点击“添加估计器”(Add Estimators)以查看模型构建器中可用于多类分类技术的可用估计器(算法)。

  2. 点击标有“朴素贝叶斯”(Naive Bayes)的卡片,然后点击“添加”(Add)。

  3. 再次点击“添加估计器”(Add Estimators)。

  4. 点击标有“随机森林分类器”(Random Forest Classifier)的卡片,然后点击“添加”(Add):

图片

模型构建器的一个整洁功能是,在训练完成后,您可以看到对两种算法选择的评估(如下面的屏幕截图所示):

图片

在前面的屏幕截图中,您可以看到使用朴素贝叶斯进行模型性能评估被评为差(Poor),而使用随机森林分类的模型性能被评为优秀(Excellent)。请考虑以下内容,正如我在本章中已经提到的,以及产品文档中甚至明确指出的。

“为了找到给定机器学习问题的最佳解决方案,有时您必须对训练数据、模型设计和/或使用的算法进行实验。使用模型构建器,您可以轻松比较不同算法使用的结果(以更好地了解最佳选择应该是什么)。”

这是一条非常好且实用的建议,尤其是对于那些相对较新的机器学习初学者来说。

现在,让我们继续本章的最后一个主题:回归。

回归

回归本质上是一种统计方法,用于寻找变量之间的关系。在机器学习中,这用于根据从数据集中获得的变量关系预测事件的结果。

正如我们在先前的模型训练选项中看到的那样,产品文档为我们提供了一个非常好的示例练习,我们可以用它来说明机器学习的回归方法:训练一个模型来预测客户在户外装备店旅行可能花费的金额。

再次,我们将回顾完成此练习所需的适当步骤。对于这个练习,我们将选择以下内容:

  • PURCHASE_AMOUNT(这是客户每次访问商店所花费的平均金额)作为我们的标签列

  • GENDER(性别)、AGE(年龄)、MARITAL_STATUS(婚姻状况)和PROFESSION(职业)作为我们的特征列

接下来,与前面章节的练习一样,我们再次点击手动,这样我们就可以选择模型使用的特定算法(而不是让模型构建器为我们选择),然后执行以下步骤:

  1. 对于选择技术选项(如下面的截图所示),选择回归。

  2. 添加名为梯度提升树回归估计器。以下截图显示了我们在本练习模型构建中选择的参数:

截图

  1. 一旦设置了上述详细信息,您就可以点击下一步,开始使用所选技术和估计器用样本数据训练模型。训练完成后,您可以点击保存。当然,在模型保存后,模型详情页面会自动打开:

截图

  1. 按照常规做法,为了验证模型构建者使用的算法,您可以再次访问模型详情页面上的概述信息中的摘要表(如下面的截图所示),然后点击模型构建者详情行中的查看:

截图

测试预测能力

模型构建器的另一个有用功能是它为您提供了轻松测试已部署模型预测能力的能力,而无需进行任何编程。

要从部署详情页面测试已部署的模型,请执行以下步骤:

  1. 首先,在部署详情页面的测试区域,将有一个简单的输入表单(如下面的截图所示),您可以在其中为特征列输入一些值:GENDER(性别)、AGE(年龄)、MARITAL_STATUS(婚姻状况)和PROFESSION(职业)(您可以忽略表单中的其他字段):

截图

  1. 接下来,点击预测,根据您刚刚输入的值和构建的模型创建一个预测。这将是对具有输入属性的顾客在商店购物时可能花费的金额的预测。以下截图显示了测试结果。预测的花费金额为$118.81:

截图

如文档所述,您可以从训练文件中获取额外的值组合并将它们输入到输入数据表单中,以进行额外的测试。

摘要

在本章中,我们讨论了模型选择的重要性;具体来说,是选择分类技术和相关估计器。我们看到了如何使用 IBM 云平台和 Watson Studio 以高效和有效的方式探索各种技术和估计器的性能。通过这个简单的探索过程,你可以有信心地认为你选定的模型与数据很好地匹配。我们还看到了如何使用 Watson Studio 来构建、部署和测试模型,并为其配置持续学习。

在下一章中,我们将讨论监督学习和无监督学习之间的区别,同时也会探讨半监督学习。此外,我们还将研究聚类算法的概念,并比较在线学习和批量学习。

第四章:实施无监督算法

在第三章《为您的数据构建监督机器学习模型》中,我们专注于监督机器学习算法。本章将在前几章的基础上继续探讨 IBM Cloud 提供的机器学习范式。本章将涵盖监督无监督以及半监督学习。

监督学习问题通常被分为回归分类问题,我们看到了使用 IBM Watson Studio 及其模型构建器功能如何帮助解决这类问题的方法。

相反,无监督学习允许我们在对结果可能一无所知或知之甚少的情况下解决问题。在这里,在这些类型的问题中,我们可以尝试通过根据数据内部变量之间的关系进行聚类(数据),从数据本身推导出结构,即使我们不一定知道这些变量的影响。

本章将专注于无监督机器学习及其相关概念。

此外,本章将讨论一些常见的聚类算法。最后,本章将通过讨论在线学习与批量学习概念来总结。

我们将本章分为以下区域:

  • 无监督学习

  • 半监督学习

  • 异常检测

  • 在线和/或批量学习

无监督学习

正如我们在上一章中讨论的,监督学习是利用一个将输入映射到输出的函数的机器学习过程,基于示例输入-输出对,从包含一组训练样本的标记训练数据中推断出一个函数。

再次,在上章中,我们看到了在使用模型构建器时,我们可以为预测模型设置一个标签列来进行预测。回想一下,在一个例子中,我们选择了训练数据中的IS_TENT列作为模型预测的列。

现在,在本章的这一部分,我们想要检查没有在数据中定义标签数据或换句话说,无监督学习问题的场景。重申一下,在这些情况下,我们没有基于先前预测结果的可用的反馈(或标签);我们期望在不指示或设置期望标签的情况下解决这些案例。

要进一步了解无监督学习究竟是什么,您可以点击以下链接:www.datasciencecentral.com/profiles/blogs/what-is-unsupervised-learning

为什么不总是使用监督学习(和标记数据)呢?为了理解为什么你可能会发现自己使用无监督学习模型,考虑这样一个事实:通常更容易找到未标记的数据(更便宜),而润色未标记数据并添加标签通常需要领域专家,并且本身可能是一个复杂的过程。

实现无监督学习目标的一种方法是通过使用聚类算法。聚类仅使用数据来确定模式、异常(关于异常将在本章后面的部分中详细介绍)或数据中的相似性。

聚类通过识别不同簇内相似的数据以及跨簇不相似的数据来组织数据。

聚类在统计数据分析领域很受欢迎,因为不同的簇揭示了数据中对象的不同细节,这与分类或回归不同,在分类或回归中,你有一些关于结果的前期信息。

一种流行的聚类算法是K-means 聚类算法。该算法用于根据属性或特征将对象分类或分组到K 个组(表明了该方法名称的由来)。

在此方法中,K将是一个正整数,它简单地表示数据被分类到的簇或不同组数,而不使用标记或目标字段。K-means 试图在数据输入字段集中揭示模式,而不是预测结果。

在本章下一节中,我们将查看一个工作示例,展示如何在 Watson Studio 中使用 K-means 算法从数据中创建簇,以产生预测,而不了解预测因子可能是什么。

Watson Studio,机器学习流,和 KMeans

Watson Studio 中的编辑器在构建模型时提供了一个非常酷的图形视图,通过组合代表对象或动作的各种类型的节点来表示。流编辑器有三个调色板可供选择:SPSS 模型器节点、Spark ML 算法节点和神经网络节点。在这个例子中,我们将创建一个 SPSS 模型器流。

注意:SPSS 是社会科学统计软件包的缩写,研究人员使用它来进行统计分析。这项技术于 2009 年被 IBM 收购。当前版本(2015)被称为 IBM SPSS Statistics。

入门

到目前为止,我们知道你需要创建一个 Watson 项目并将其中的数据包含或添加进去。因为我们之前已经做过,所以我们将跳过这一部分,进入如何使用 Watson Studio 提供的流编辑器。

创建 SPSS 模型流

让我们通过以下步骤创建一个 SPSS 模型流:

  1. 要创建一个 SPSS 模型流,首先我们必须转到“添加到项目”:

图片

  1. 然后,我们可以使用“资产”标签(如下面的截图所示)并点击模型器流图标:

图片

  1. 接下来,输入流程的名称和描述,然后选择 IBM SPSS Modeler 运行时(位于左下角),然后点击创建按钮(位于右下角):

图片

  1. 现在我们准备使用以下流程编辑器画布创建我们的机器学习模型流:

图片

流程编辑器面板使您能够使用机器学习、人工智能AI)和统计建模方法从数据中提取新信息,而无需编程。

  1. 现在我们准备添加我们的数据,因此我们可以将数据资产节点(位于导入下)拖放到画布上:

图片

  1. 一旦您有一个数据资产节点,您可以双击它,选择更改数据资产,选择您首选的(训练)文件,然后点击确定。如果您现在右键单击节点,您可以选择预览(如下截图所示)以查看您的数据(只读模式):

图片

  1. 要生成数据的概要,您可以添加数据审计节点(位于输出下),通过将其拖放到画布上,连接到数据资产节点,然后点击 VCR 类型的运行图标:

图片

您可以看到数据审计节点显示了它在数据资产节点中自动找到的 25 个字段。再次提醒,如果您双击数据审计节点,您将能够查看和更新各种参数,例如节点的名称(您可以在流程中拥有多个数据审计节点),以及输出摘要中包含的内容(图表、基本和/或高级统计信息等):

图片

数据审计节点的输出提供了您数据的详细概要。您可以更改参数,重新运行您的流程,并重新检查结果,以便熟悉输出:

图片

上一张截图的底部页面如下:

图片

额外的节点工作

在实际构建分类模型之前,应该注意的是,在面板上有很多节点可供使用,可以帮助或实际执行您需要执行的大多数操作或流程,而无需编写任何代码!

如果您花点时间查看左侧的面板(称为节点面板),您将看到可供您在处理数据时使用的不同类型的节点。这些节点被组织成以下六个基本类别:

  • 记录操作:这可以用于在记录(行)级别执行选择、追加和排序等操作。

  • 字段操作:这些节点在数据准备阶段非常有用。您可以过滤数据、重命名特征,并选择属性的类型。

  • 图示:本节中的节点将帮助您进行基本的数据探索,并理解特征之间的分布或关系。

  • 建模:这些节点为不同类型的问题提供不同的建模算法。

  • 输出:这些节点有助于理解您的数据和模型。您可以将结果以表格格式显示或获取模型评估参数的报告。

  • 导出:在处理和建模之后,此节点将帮助您将数据从流程编辑器导出到您的 DSX 项目

让我们尝试一个。它们基本上都是用相同的方式实现的:将选定的节点拖放到画布上,然后右键单击以执行进一步操作,如打开、预览或运行。

例如,让我们看看在字段操作下找到的过滤器节点。以下截图显示了添加到画布并连接到我们的数据资产节点的过滤器节点:

图片

您可以使用过滤器节点重命名列,如下截图所示:

图片

您还可以从原始数据资产节点中过滤掉或仅保留选定的数据字段:

图片

当您对数据满意后,可以使用类型节点设置一个变量作为模型的目标变量。这将帮助模型区分输入和目标特征。例如,您可以执行以下任务:

  1. 将类型节点拖放到画布上。

  2. 将类型节点连接到过滤器节点。

  3. 右键单击类型节点,然后点击打开以打开节点。

  4. 点击读取值,然后选择列名 class,将变量的角色更改为目标,最后点击保存:

图片

  1. 要查看目标变量(我们的设置为类别)的分布情况,您可以使用分布节点(来自节点面板的图示部分)。再次,只需将节点拖放到画布上,打开并提供如下信息:绘图(在字段(离散)下选择类别字段)和颜色(离散)(使用类别),然后点击保存。运行流程后,输出看起来如下:

图片

在此数据中,我们看到慢性病例(ckd)比非慢性病例(notckd)更多。这是我们在画布上显示的当前流程:

图片

训练和测试

在 SPSS 模型器流程中另一个有用的功能是能够轻松地将数据分为训练集和测试集。这可以通过分区节点实现。为了训练、测试和验证模型构建的阶段,使用分区节点生成一个分区字段,将数据分割成单独的子集或样本。

使用样本生成模型,并使用另一个样本进行测试,这将为您提供一个很好的提示,了解模型将如何推广到与当前数据相对应的更大的数据集:

图片

如果我们在流程中添加一个分区节点,打开它并根据前面的截图调整设置,我们是在指示模型师在我们的数据中添加一个新的字段(PartionMyData),这将指定记录分割(基于 75/25)。要查看此节点的结果,我们可以在流程中添加一个表格节点,并设置以下参数:

图片

前面的截图表明,我们想要查询我们的数据,并基于我们的派生字段中的值等于1_Training生成一个表格;换句话说,所有分区节点指定的作为我们的训练数据成员的记录。我们的流程现在看起来如下所示:

图片

现在运行流程将生成以下表格:

图片

SPSS 流程和 K-means

如我们本章前面提到的,一种流行的聚类算法是K-means 聚类算法。再次强调,在没有标签或目标字段的情况下,K-means 不是试图预测结果,而是试图通过在数据输入字段集中对数据点进行分组和/或聚类来发现数据中的模式和结构。

使用我们在本章中一直在使用的样本数据,假设我们不知道一个人是否有慢性肾病,并希望使用 K-means 算法构建一个无监督模型,看看我们是否可以识别出慢性肾病的任何模式。

我们将在我们的流程中选择 K-Means 节点来完成这个任务。

K-Means 节点提供了一种聚类分析方法,您可以在以下链接中参考 IBM SPSS Modeller 15 文档中的第第十一章public.dhe.ibm.com/software/analytics/spss/documentation/modeler/15.0/en/ModelingNodes.pdf

让我们看看以下步骤,了解如何了解 K-means 算法:

  1. 从左侧,在建模下,我们可以选择 K-Means 节点并将其拖放到画布上。

  2. 接下来,将节点连接到类型节点,如图所示:

图片

注意,我已经断开了之前使用的分区节点。

  1. 一旦我们添加了 K-Class 节点,右键单击并打开它以更改其设置(在画布的右侧)。具体来说,在构建选项下,我们将根据我们想要将数据组织成两组(或聚类)的想法,将聚类数设置为2:那些患有慢性肾病的人和那些没有慢性肾病的人。所有其他设置都可以保持默认。最后,点击保存。

  2. 现在,在你运行流程之后,一个金色 K-Means 节点将出现在画布上(如下一张截图所示),你可以右键单击并选择查看模型:

  1. SPSS 可视化提供了交互式表格和图表,以帮助评估预测模型。这些可视化提供了一套单一的全面输出,因此你不需要创建多个图表和表格来确定模型的性能。根据算法的不同,你将看到一系列与你的特定数据集和模型相关的可视化。以下是我们 K-means 模型的输出:

输出包括关于聚类质量(如前一张截图所示)以及预测因子重要性(如下一张截图所示)的信息:

聚类质量评估是一个复杂的话题,超出了本章的范围,然而 IBM Watson Studio 提供了典型的聚类质量细节,例如聚类大小图表,这是一个按降序显示聚类相对大小的水平条形图。将鼠标悬停在条形图上会显示基于 K-Means 模型的该聚类中实例总数的精确百分比。所有聚类信息都应在各种项目选项和结果的基础上进行审查和评估。

最后(尽管生成了其他信息可视化),它显示了基本的模型信息(如下所示):

SPSS 模型流的一个令人惊叹的特性是,你可以在同一个画布内构建多个不同的模型!

实际上,修改节点、重新运行(流程)然后重新评估结果以确定最佳算法和参数是如此容易,以至于你应该假设多次迭代是过程的一部分。

导出模型结果

一旦你对你的模型感到满意,你可以使用另一个名为数据资产导出节点的便捷节点来导出结果。与其他节点一样,你可以将其拖放到画布上,连接到金色 K-Means 节点,并打开它来编辑其设置:

对于节点设置,你实际上需要做的只是在你点击的以下截图中的数据资产导出设置下的目标路径部分输入一个文件名(我已经输入了Lovely):

你也可以在“如果数据集已经存在”部分下选择“替换数据集”作为选项。

现在,当你运行流程时,数据将被导出到你的项目存储中,你可以在项目的“资产”标签页中查看和访问它:

图片

半监督学习

半监督学习是机器学习过程和技术的另一类,它也利用未标记的数据进行训练(就像无监督学习一样),但通常情况下,模型会使用一小部分标记数据和大量未标记数据。这通常被称为部分标记数据

半监督学习介于无监督学习(没有任何标记的训练数据)和监督学习(具有完全标记的训练数据)之间。

半监督学习程序确实试图使用某些标准假设来帮助他们利用未标记的数据。这些标准假设包括连续性、集群和流形。

不深入描述这些假设,粗略的定义如下:

  • 连续性:这个假设意味着接近的数据点也倾向于共享一个标签。

  • 集群:这个假设表明,倾向于形成离散集群的数据,同一集群中的点最终会共享一个标签。

  • 流形:这个假设认为数据大致位于一个被称为流形的低维空间中,原始数据维度较低,并且在这个假设下,尝试使用标记和未标记的数据来理解流形以降低维度。

异常检测

异常也被称为异常值、新颖性、噪声、偏差和例外,通常定义为在数据池或集中识别出罕见的项目、事件或观察结果,这些项目、事件或观察结果由于与大多数数据显著不同而引起怀疑。

为什么应该如此重视异常及其检测?

因为数据中的异常几乎总是转化为某种问题,比如欺诈、缺陷、医疗问题或文本中的错误。

异常检测是一种用于识别不符合预期行为的异常模式的技术,称为异常值。为了定位异常,你需要理解它们可能落入几个广泛的类别。

通常,我们将异常视为点、上下文或集体性质。点异常可能就是你所猜测的:一个与其它数据非常不同的单个数据点。上下文异常是指看似良好的数据仅在特定上下文中才是好的。集体异常是指将数据集视为异常。

基于机器学习的方法

当然,有许多基于机器学习的一般接受的方法用于异常检测过程。这些目前包括以下内容:

  • 基于密度的异常检测:这种方法基于 KNN 算法;使用依赖于数据类型(分类或数值)的评分方法评估最近的数据点集。

  • 基于聚类的异常检测:在无监督学习领域,对于异常检测来说,聚类是最受欢迎的概念之一。

  • 基于支持向量机的异常检测:此算法使用训练集来学习软边界,以便聚类正常数据实例,然后使用测试实例,它调整自己以定位超出学习区域的不规则性。

在线或批量学习

将在线和批量机器学习概念视为基本上是执行从新数据块中更新预测值的多重迭代与首先处理所有可用数据然后设置预测值之间的区别:

  • 在线机器学习:这是一种机器学习技术,其中数据以顺序方式提供,并用于在每一步或迭代中简化对未来数据的最佳预测器。

  • 批量学习:批量机器学习是一种方法,它通过一次在整个训练数据集上学习来生成最佳预测器。

摘要

在本章中,我们首先提供了无监督学习、半监督学习、异常检测的简要描述,最后是在线和批量学习。

在下一章中,我们将使用 Python 作为编程语言,在笔记本上创建我们将要学习的内容。我们还将学习如何使用 Watson Studio 创建各种机器学习项目。

第二部分:IBM 云中机器学习的工具和成分

在本书的这一部分,你将了解开发可在云中运行的实用机器学习算法所需工具和成分。

本节将涵盖以下章节:

  • 第五章,在 IBM 云上进行机器学习练习

  • 第六章,在 IBM Watson Studio 中使用 Spark

  • 第七章,在 IBM 云上使用 TensorFlow 进行深度学习

第五章:IBM Cloud 上的机器学习练习

在本章中,我们将通过使用 IBM Cloud 平台进行几个机器学习(ML)练习,来揭示 Python 语言作为机器学习编程语言的选择之优势,并查看 IBM Watson Studio 提供的机器学习服务。

本章将使您能够理解适当的特征工程实践,并展示在 IBM Cloud 中使用 IBM Watson Studio 运行监督(分类)和无监督(聚类)算法的能力。

通过简单的实践示例,本章将指导您使用 IBM Watson Studio 实现各种机器学习项目的步骤。

我们将本章内容分为以下几个部分:

  • Watson Studio 和 Python

  • 数据清洗和准备

  • K-means 聚类示例

  • K-最近邻示例

  • 时间序列预测示例

Watson Studio 和 Python

如前所述,Python 可能(目前确实如此)是预测建模和数据科学项目中最常选择的编程或脚本语言。这类计算领域的一个重大进步是 Jupyter 笔记本(以前称为 IPython)技术。

Jupyter Notebook 是一个基于网络的交互式计算环境,您可以在其中运行小块代码来处理数据,并立即查看该代码的结果。笔记本包括您处理数据所需的所有构建块:

  • 数据

  • 处理数据的代码计算

  • 代码计算结果的可视化(结果可视化)

  • 文本和丰富媒体以增强您的理解

此外,保存的笔记本记录了您如何处理数据,因此您可以更轻松地了解具体做了什么,一致地重现这些计算,甚至与他人共享您的发现以进行协作。

设置环境

使用 IBM Watson Studio,创建 Python、Scala 或 R 笔记本的过程相当直接。这些笔记本可以用来分析、清洗和转换数据,以及执行数值模拟、统计分析、数据可视化和机器学习等任务。

为了让我们开始本章的示例项目,我们需要采取以下步骤在 IBM Watson Studio 中创建一个新项目并添加一个笔记本:

  1. 首先,点击“新建项目”,然后从“创建项目”页面(如下所示),找到深度学习并点击“创建项目”:

图片

  1. 接下来,选择机器学习服务运行的区域,然后点击“选择”:

图片

  1. 在“新建项目”页面(如下所示)上命名您的项目,然后点击创建

图片

  1. 现在我们已经创建了一个机器学习项目,我们准备创建一个笔记本。笔记本被认为是项目资产,可以用于和共享。要在项目内创建笔记本,您点击“添加到项目”:

图片

  1. 一旦您点击“添加到项目”,您需要选择一个资产类型。在之前的示例中,我们选择了 DATA 和 DASHBOARD 资产类型;这里我们将选择 NOTEBOOK:

图片

  1. 就像创建项目一样,一旦您选择 NOTEBOOK 作为资产类型,您需要在“名称”和“描述”选项下为新笔记本提供名称和描述:

图片

  1. 此外,在页面左下角,您需要为笔记本选择一种语言。请注意,默认为 Python 3.5:

图片

  1. 由于我们将在示例中使用 Python,我们可以简单地点击“创建笔记本”。请注意,IBM Watson Studio 笔记本(目前)支持以下运行时语言。一旦您点击“创建笔记本”,笔记本实例将被创建并初始化以供使用:

图片

尝试一下

一旦您的笔记本实例化,您就可以运行 Python 命令和代码了。注意以下截图中的几个要点。例如,我们在笔记本的第一个单元中输入了一段 Python 代码,该代码使用 for 循环迭代并打印数据列。另一件要注意的事情是我们点击了“查找并添加数据”,并添加了一个新文件(winemag-data-130k-v2.csv)作为资产,如以下截图所示:

图片

为了简化操作,我们可以在文件名下方的链接“插入代码”处点击,选择“插入 pandas DataFrame”。结果是,相应的Python模块(pandas 是为 Python 编程语言编写的用于数据操作和分析的软件库)会自动为我们导入,并自动定义一个 Python DataFrame。这可以在下面的截图中的笔记本单元(In [9])中看到:

图片

最后一条代码 df_data_1.head() 生成的输出显示在笔记本单元 Out [9] 中:

图片

现在我们已经将数据资产(一个 CSV 文件)加载到我们的 Watson Studio 项目中,并通过 DataFrame 对象访问。

数据清洗和准备

数据清洗和准备的一个常见描述是将原始数据转换成数据科学家和分析师可以更容易地通过机器学习算法运行的形式,以努力发现洞察或基于该数据进行预测。

这个过程可能会因为诸如缺失或不完整记录或简单地在一个数据源中找到无关的信息列等问题而变得复杂。

在前面的示例截图中,我们可以看到 DataFrame 对象包括国家、描述、指定、分数、价格、省份等列。

作为一项旨在展示我们如何轻松地在 Watson Studio 中使用 Python 准备数据的练习,让我们假设我们想要从 DataFrame 中删除一个或多个列。为了完成这个任务,我们使用以下 Python 语句:

to_drop = ['points']
df_data_1.drop(to_drop, inplace=True, axis=1)
df_data_1.head()

前面的简单 Python 命令定义了要从 DataFrame 中删除的列名,即分数,然后从df_data_1 DataFrame 中删除该列:

图片

在 IBM Watson Studio 中,使用本章前面创建的笔记本,我们可以输入并运行前面的命令,然后使用head()函数,以验证我们指定的列实际上已被删除。

尽管前面的演示很简单,并没有开始触及数据清洗和准备过程,但它确实展示了在 Watson Studio 中轻松使用 Python 访问和操作数据的能力。

而不是继续进行更多的基本数据处理,我们将转向查看一些更复杂的内容。

使用 Python 进行 K-means 聚类

回顾第四章,“在 IBM Cloud 上的机器学习练习”,k-means 聚类是一种无监督机器学习方法——一个常用于在未标记数据中找到组的算法。再次强调,由于这里的目的是展示您如何使用 Python 在 Watson Studio 中应用这种方法,我们不会深入探讨 k-means 是如何工作的细节,而是将展示算法的一个工作示例,使用 Watson Studio 作为概念验证。

在线和其他地方有大量示例演示了使用 Python 实现 k-means 逻辑。在这里,我们将使用一个简单易懂的示例,并使用可用的 Python 模块,如matplotlibpandasscipy

我们使用 IBM Watson Studio 和笔记本(我们在本章的各个部分中创建的)进行的练习将:

  1. 为二维数据集创建一个 DataFrame

  2. 为三个簇和四个簇找到质心

  3. 添加一个图形用户界面GUI)来显示结果

组内最代表性的点称为质心。它被定义为簇中数据点值的平均值。每个簇应包含离它最近的数据点

Python 代码

首先,我们可以看一下 Python 代码:

  1. 此步骤引用了pandas并定义了我们的二维 DataFrame。请注意,数据仅仅是两个数字列表,分别定义为xy
from pandas import DataFrame
Data = {'x': [25,34,22,27,33,33,31,22,35,34,67,54,57,43,50,57,59,52,65,47,49,48,35,33,44,45,38,43,51,46],
        'y': [79,51,53,78,59,74,73,57,69,75,51,32,40,47,53,36,35,58,59,50,25,20,14,12,20,5,29,27,8,7]
      }
df = DataFrame(Data,columns=['x','y'])
print (df)

最后一条命令(print(df))被添加,以便如果您运行代码,您将看到输出,它应该与定义的数据集相匹配。

  1. 下一个步骤是我们将使用sklearn Python 模块来找到三个和四个簇的中心,然后使用matplotlib模块创建一些图表来可视化算法的结果。

Scikit-learn 通过 Python 中的一致接口提供了一系列监督和无监督学习算法。该库建立在 SciPy(科学 Python)的基础上。Matplotlib是 Python 的绘图库及其数值数学扩展 NumPy(维基百科,2019 年)。

  1. 一旦使用输入数据的列创建 DataFrame,下一块 Python 代码也导入了上述两个 Python 模块,并指定使用KMeans算法创建的簇的数量,最后使用matplotlib生成一些散点图:
from pandas import DataFrame
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
Data = {'x': [25,34,22,27,33,33,31,22,35,34,67,54,57,43,50,57,59,52,65,47,49,48,35,33,44,45,38,43,51,46],
        'y': [79,51,53,78,59,74,73,57,69,75,51,32,40,47,53,36,35,58,59,50,25,20,14,12,20,5,29,27,8,7]
       }
df = DataFrame(Data,columns=['x','y'])
kmeans = KMeans(n_clusters=3).fit(df)
centroids = kmeans.cluster_centers_
print(centroids)
plt.scatter(df['x'], df['y'], c= kmeans.labels_.astype(float), s=50, alpha=0.5)
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=50)
plt.show()

上一段 Python 代码的输出生成以下结果:

图片

观察结果

注意,每个三个簇的中心(红色)代表属于该簇的所有观察值的平均值。正如你可能看到的,属于给定簇的观察值与该簇的中心更近,与其他簇的中心相比。

在 Watson 中实现

再次,我们不再纠结于前一个输出的解释,而是看看我们如何能够使用 IBM Watson Studio 实现相同的练习。我们可以使用本章前面创建的笔记本,但让我们创建一个新的(遵循我们之前使用的相同程序)。

一旦笔记本打开并准备就绪,我们可以运行我们刚才审查的 Python 代码。首先将原始代码块粘贴到第一个笔记本单元中,然后点击运行:

图片

重复此步骤,但使用以下代码块:

图片

这会产生以下输出:

图片

保存你的工作

一旦你对结果满意,你应该通过点击文件然后保存来保存你的笔记本。此外,一个很棒的功能是能够以各种格式下载笔记本,这样你就可以与他人分享,他们可能没有访问 Watson Studio 的权限。我们将在下一节中进一步讨论这个问题。

现在,尝试导航到文件 | 下载为 | Python (.py),这将保存笔记本中的所有 Python 代码块作为标准的 Python 代码文件,可以在其他 Python 环境中共享和运行:

图片

K 最近邻

由于之前的算法(KMeans)是一种无监督学习方法,因此k 近邻KNN)算法是一种基本简单易懂的监督机器学习方法。KNN 算法的概念通常被描述为通过识别数据的最邻近邻居来进行数据分类,或者,我最喜欢的类比,你可以通过识别或分类数据与谁关联最多或找到其最近邻来进行识别或分类。

Python 代码

正如我们之前所述,我们的目标是展示如何在 IBM Watson Studio 中实现各种类型的机器学习算法,而不是提供每个算法背后的理论;除此之外,与上一节保持一致,我们将利用现有的样本 Python 脚本来展示 Watson Studio 平台提供的功能性和特性,而不是尝试创建一个新的解决方案。

在这个实现的例子中,我们必须做以下事情:

  • 找到与需要分类的新数据样本距离最近的一定数量的训练样本

  • 确保新数据样本的标签(分类)由那些(训练样本)邻居定义

  • 为要确定的邻居数量设置一个固定的用户定义的常量

  • 使用新样本的最近邻的多数投票来计算分类

在 Watson 中实现

再次,按照本章前面使用的步骤,我们可以在 IBM Watson Studio 中打开我们的机器学习项目并创建一个新的笔记本。从那里,我们可以将样本 Python 代码粘贴到笔记本中的单元格中,然后按运行来测试每个单元格的代码。

正如我们所看到的,你可以在笔记本中使用多个单元格来分割代码的功能块。使用菜单栏,你还可以剪切和粘贴单元格,拆分和合并单元格,以及将单元格在笔记本中上下移动。为了清晰起见,还有一个额外的实用功能,可以显示笔记本中每个 Python 命令的行号。你可以通过点击菜单栏上的“编辑”或“查看”下适当菜单选择来实现这一点:

你可能想要拆分单元格以显示中间单元格的输出,或者将单元格合并到一个单元格中并显示合并后的输出。例如,在下一个屏幕截图中,你可以看到两个单元格,每个单元格后面都跟着它们各自的输出:

以下屏幕截图显示了这两个单元格合并为一个,后面跟着合并后的输出:

使用菜单选项,你可以创建一个非常组织良好、功能强大且易于分享的解决方案。在下一节中,我们将使用 Watson Studio 中的 Markdown 标签来创建一个更有价值的解决方案。

探索 Markdown 文本

Markdown是一种易于使用的标记语言,它用于纯文本,以在不使用正式文本编辑器或使用HTML标签的情况下添加格式化元素(标题、项目符号列表、URL 等)到纯文本中。Markdown 不依赖于设备,并努力在所有设备类型上以一致的方式显示写作格式,以在 Notebook 解决方案中创造视觉兴趣。

让我们完成最新的示例案例。我们假设所有示例 Python 代码都已粘贴到 Notebook 的单元格中,并且我们已经运行了解决方案的全部内容。

现在,假设我们想要将此解决方案保存并与其他不熟悉我们的项目和思维过程的人分享?我们可以做的是在我们的 Notebook 中插入额外的单元格,而不是将代码粘贴到它们中,我们可以添加注释和其他信息作为解释性文本,以便其他人更容易理解我们所创建的内容。例如,看看下面的截图:

让我们通过以下步骤来查看这是如何完成的:

  1. 我们可以点击 Notebook 中的第一个单元格,然后点击“插入”,接着点击“在上方插入单元格”。接下来点击新的单元格,并将单元格的格式(单元格格式)更改为 Markdown:

  1. 接下来,在新单元格中输入k-Nearest-Neighbor Classifier文本:

  1. 然后,点击键盘图标并选择将单元格更改为标题 1:

  1. 在执行前面的步骤之后,你可以看到 Markdown 单元格看起来略有不同:

  1. 一旦点击运行,你可以看到结果:

使用常见的 Markdown,我们可以继续在 Notebook 中插入注释:

  • 你可以在 Notebook 的顶部添加一个新的单元格,将其格式转换为 Markdown,然后拖放一张图片到单元格中(如下所示)。这可以用来添加公司标志或甚至工作流程图:

  • 使用其他 Markdown,如标题级别、缩进和项目符号列表,你可以提供有关假设的详细信息,例如使用的数据来源和数据中包含的内容:

  • 使用额外的类似 HTML 的 Markdown(例如 <font color=></font>),你可以创建如下 Markdown 单元格:

这将产生以下输出:

你可以尝试使用全功能的 Markdown,看看哪种最适合你。你可以访问:commonmark.org/help/ 以找到完整的 Markdown 速查表。

时间序列预测示例

在本节中,我们的目标是尝试使用 Python 和 Watson Studio 实现一个时间序列模型。

时间序列分析包括分析时间序列数据的方法(当然)以便我们可以提取数据的统计意义和其他特征。时间序列预测是使用算法根据先前观察到的值预测未来值的过程。

时间序列分析

时间序列数据在本质上可能是 平稳的非平稳的。平稳意味着没有周期性波动,而非平稳数据通常具有频繁的价值变化。你通常看到时间序列分析用于非平稳数据,例如评估和预测零售销售。在这个例子中,我们将再次利用一个研究练习(可在 GitHub 上找到)来展示分析零售销售数据及其预测的基本步骤,这些步骤是通过 IBM Watson Studio 实现的。

设置

使用(现在)熟悉的将数据添加到我们的 Watson Studio 项目中的过程,我们创建了一个新的资产,使用 CSV 数据文件,并为了更好地理解数据,使用了数据精炼功能来分析、描述和可视化我们的资产。从那里(正如我们在本章之前的 时间序列分析 部分中所做的那样),我们使用“插入到代码”并然后插入 pandas DataFrame,以便 Watson Studio 生成导入所需 Python 模块的代码,将数据(加载到名为 df_data_1 的 Python DataFrame 对象中)并打印前五行,如下面的截图所示:

图片

数据预处理

在使用 数据精炼 功能时,我们注意到数据文件中有一个名为 Category 的列,这似乎表明了所售产品的类型(家具、办公用品等)。在这个例子中,数据科学家只对家具销售感兴趣,因此以下代码行被用来过滤数据并验证该类别是否有足够的数据来进行适当的分析:

furniture = df.loc[df['Category'] == 'Furniture']
furniture['Order Date'].min(), furniture['Order Date'].max()

在 Watson Studio 中执行的前置代码如下所示,通过显示最早和最晚的时间戳来过滤销售数据并验证我们在这份数据文件中有四年的家具销售记录:

图片

在所选示例中,数据科学家选择使用原始的 Python 命令来删除(删除)分析中不需要的数据列,检查缺失值,按日期对销售交易进行汇总(按组),等等。虽然使用 Python 脚本来完成这些任务并不特别复杂,但你也可以通过 Watson 数据精炼流程 的拖放操作来完成所有这些任务(以及更多)。

如我们之前提到的,数据精炼流程是一系列按顺序排列的步骤,用于净化、塑形和增强数据资产。通过应用操作来精炼数据,你实际上是在动态构建一个可以实时修改并保存以备将来使用的数据精炼流程,因为新数据变得可用!

可视化索引

一旦数据被适当准备,数据科学家使用Pandas set_index命令将订单日期列设置为索引,将销售交易的行(作为我们将进行初步分析的领域)进行索引。换句话说,我们最终希望能够预测每月的家具销售量。以下截图显示了在我们的 Watson 项目中执行的 Python 语句,以设置索引并打印命令的结果:

数据科学家接着指出,考虑到数据,查看每个月的平均日销售额会更合理,因此使用以下命令重采样销售数据,以每个月的开始(MS)作为时间戳,然后,作为一个合理性检查,查看一些数据(按订单月份排序后,计算平均销售):

y = furniture['Sales'].resample('MS').mean()
y["2017":]

以下截图显示了在我们的 Watson 项目中执行的前述命令:

可视化

要实际可视化 4 年系列的平均销售量,使用plot命令:

y.plot(figsize=(15, 6))
plt.show()

这导致了以下可视化,在此处由 Watson Studio 执行:

当你绘制或以其他方式可视化数据时,识别模式会容易得多。在这个例子中,数据科学家指出了一个通常被称为季节性的模式。然后,数据科学家进一步进行时间序列分解,使用以下命令将趋势、季节性和噪声分离出来:

from pylab import rcParams
rcParams['figure.figsize'] = 18, 8
decomposition = sm.tsa.seasonal_decompose(y, model='additive')
fig = decomposition.plot()
plt.show()

再次强调,正如在所选示例中执行的那样,我们在 Watson Studio 中得到了以下结果:

销售预测

最后,在完成前述时间序列数据分析和解构之后,我们可以进入实际的预测步骤!仍然遵循所选示例中概述的轨迹,数据科学家选择应用时间序列预测中最常用的方法之一,自回归积分移动平均ARIMA)。

你可以点击以下链接了解更多关于 ARIMA 的信息:www.forecastingsolutions.com/arima.html

要使用 ARIMA 模型或方法进行时间序列预测练习,你需要了解如何为算法的三个主要参数选择值:PDQ。假设你已经验证了你的模型选择(首先使用 ARIMA),构建实际预测模型和生成模型预测的最困难的部分是选择那些最适合模型的参数值(给定数据):

  • P 是自回归项的数量

  • D 是为了平稳性所需的非季节性差分的数量

  • Q 是预测方程中滞后预测错误的数量

在不深入挖掘参数选择背后的理论之前,我们在这里说明,这一步涉及确定可能的参数值组合,查看它们的整体拟合结果,运行适当的诊断来调查模型中是否存在任何异常行为,以及验证模型生成的结果。

以下是用 IBM Watson Studio 实现时使用的代码块和选定的输出:

让我们看一下第一个代码示例,它展示了参数组合的例子:

图片

让我们看一下下一个代码示例:

图片

现在,让我们看一下下面的截图:

图片

现在,让我们一次性看一下这里所有的图表:

图片

验证

当然,数据科学家不能仅仅生成一个预测就结束了。必须努力审查模型的性能或预测准确性。为了帮助理解模型的准确性,将预测销售额与实际销售额进行比较,将预测从 2017-07-01 开始(到数据结束)。再次使用图表来可视化输出,显示观察值与滚动预测预测值的比较。总体而言,销售预测似乎与实际销售值一致,并显示出从年初开始的上行趋势。

我们看到以下代码块:

pred = results.get_prediction(start=pd.to_datetime('2017-01-01'), dynamic=False)
pred_ci = pred.conf_int()
ax = y['2014':].plot(label='observed')
pred.predicted_mean.plot(ax=ax, label='One-step' ahead Forecast', alpha=.7, figsize=(14, 7))
ax.fill_between(pred_ci.index, pred_ci.iloc[:, 0], pred_ci.iloc[:, 1], color='k', alpha)
ax.set_xlabel('Date')
ax.set_ylabel('Furniture Sales')
plt.legend()
plt.show() 

在 Watson Studio 中实际实现的结果如下:

图片

摘要

在本章中,我们在 IBM Watson Studio 中创建了一个新的机器学习项目,并向其中添加了笔记本,以便我们可以使用 Python 作为项目目标的编程语言。

使用 Python,我们展示了如何轻松地将数据加载到 DataFrame 中,并在进一步处理之前对其进行操作。我们还使用了额外的笔记本来说明如何轻松地使用 Watson Studio 实现各种机器学习项目。

在下一章中,我们将提供在 IBM Watson Studio 中创建 Spark 机器学习管道的指南。

第六章:在 IBM Watson Studio 中使用 Spark

在本章中,我们将讨论机器学习(ML)管道,并提供在 IBM Watson Studio 中创建和部署 Spark 机器学习管道的指南。

我们将本章内容分为以下几部分:

  • Apache Spark 简介

  • 在 Watson Studio 中创建 Spark 管道

  • 数据准备

  • 数据分析和可视化示例

Apache Spark 简介

在我们开始创建任何类型的管道之前,我们应该花一分钟时间熟悉 Spark 是什么以及它为我们提供了什么。

Spark,既注重速度又易于使用,是一个专为大规模数据处理而设计的超快速开源引擎。

通过支持循环数据流和内存计算的先进有向无环图DAG)执行引擎,程序和脚本在内存中可以比 Hadoop MapReduce 快 100 倍,在磁盘上快 10 倍。

Spark 由以下组件组成:

  • Spark Core:这是 Spark 的底层引擎,利用名为弹性分布式数据集RDDs)的基本编程抽象。RDDs 是 Spark 用作“对象集合”的小的逻辑数据块。

  • Spark SQL:它提供了一个新的数据抽象,称为 DataFrame,用于使用分布式 SQL 查询引擎进行结构化数据处理。它使得未经修改的 Hadoop Hive 查询在现有部署和数据上运行速度可提高至 100 倍。

  • MLlib:这是 Spark 内置的算法库,用于挖掘大数据,包括常见的机器学习算法和实用工具,如分类、回归、聚类、协同过滤和降维,以及支持 Spark 的最佳底层优化原语。

  • Streaming:这扩展了 Spark 的快速调度能力,以对连续的新数据进行实时分析。

  • GraphX:这是用于分析图结构数据的图处理框架。

Watson Studio 和 Spark

IBM Watson Studio 提供某些 Spark 环境,您可以使用这些环境作为默认的 Spark 环境定义,以便在 Watson Studio 中快速开始使用 Spark,而无需花费时间创建自己的 Spark 环境定义。这节省了设置时间,让您有更多时间创建解决方案而不是管理环境。

Spark 环境默认对所有 Watson Studio 用户可用。您不需要为您的 Watson Studio 项目配置或关联任何外部 Spark 服务。您只需选择所需的 Spark 运行时服务的硬件和软件配置,然后当您使用环境定义启动工具时,将根据您的配置规范创建一个运行时实例。Spark 计算资源仅用于您的工具,不与协作者共享——medium.com/ibm-watson/ibm-watson-studio-spark-environments-generally-available-f3dda78d3668

创建支持 Spark 的笔记本

要在 Watson Studio 中使用 Spark,您需要创建一个笔记本,并通过执行以下步骤将其与 Spark 版本关联:

  1. 创建笔记本的步骤与我们之前章节中遵循的相同。首先,在项目内部找到笔记本部分,然后点击新建笔记本。在新笔记本页面,提供名称和描述:

  1. 注意,在上面的截图中,选中的语言是 Python 3.5——这是可以的,但如果我们向下滚动,我们会看到 Spark 版本*。从下拉列表中,您可以选择笔记本的运行环境。在我们的例子中,我们可以选择默认的 Spark Python 3.5 XS(驱动器有 1 个 vCPU 和 4GB,2 个执行器,每个执行器有 1 个 vCPU 和 4GB RAM):

  1. 一旦您点击创建笔记本,笔记本环境将被实例化,您就可以开始输入 Spark 命令了。

  2. 一旦创建了支持 Spark 的笔记本,您就可以运行 Python 命令并执行 Spark 作业,使用 DataFrame 抽象作为数据源来处理 Spark SQL 查询,如下面的示例所示:

df_data_2.createOrReplaceTempView("station")
sqlDF = spark.sql("SELECT * FROM station where VALUE > 200")
sqlDF.show()

在这一点上不要过分关注前面示例中的实际代码,因为在下一节中,我们将使用我们的支持 Spark 的笔记本来创建Spark ML 流水线

在 Watson Studio 中创建 Spark 流水线

因此,让我们首先理解当我们说流水线时我们究竟指的是什么。

什么是流水线?

ML 流水线通常用于自动化ML 工作流程,本质上使数据集能够在模型中转换和关联,然后可以对其进行测试和评估以实现或估计结果。

这样的工作流程由四个基本区域组成:

  • 数据准备

  • 训练集生成

  • 算法训练/评估/选择

  • 部署/监控

流水线目标

管道由一系列阶段组成。管道有两个基本类型:转换器估计器。正如在什么是管道?部分中暗示的,转换器接受一个数据集作为输入并产生一个增强的数据集作为输出,而估计器抽象了学习算法的概念并实现了一个接受数据和产生模型的方法。

更简单地说,管道执行一个可以重复准备新数据(用于转换)、转换准备好的数据,然后训练模型(在准备好的数据上)的工作流程。另一种总结方式是将管道视为运行一系列算法以处理和从数据中学习的过程。

拆解管道示例

我们将从在IBM Watson Studio 社区使用 Spark 和 Python 预测设备购买,由 Melanie Manley 提交,2018 年 7 月 26 日)中可用的 Spark 管道示例的关键步骤开始:

在这个特定的例子中,我们看到一个现有的 Spark 启用笔记本,其中包含加载数据、创建预测模型和评分数据的步骤。

示例使用 Spark 命令来完成加载数据、执行数据清洗和探索、创建管道、训练模型、持久化模型、部署模型和评分模型的任务;然而,我们在这里将只关注创建 Spark ML 模型的步骤。读者可以选择在线查看整个示例。

数据准备

在这一步,DataFrame 对象中的数据(使用 Spark 的randomSplit命令)被分成三部分——一个训练集(用于训练模型)、一个测试集(用于模型评估和测试模型的假设)和一个预测集(用于预测),然后为每个集打印记录数:

splitted_data=df_data.randomSplit([0.8,0.18,0.02],24)
train_data=splitted_data[0]
test_data=splitted_data[1]
predict_data=splitted_data[2]
print("Number of training records: " + str(train_data.count())) print("Number of testing records : " + str(test_data.count())) print("Number of prediction records : " + str(predict_data.count()))

在笔记本中执行前面的命令,如下面的截图所示:

截图

管道

在这里,在我们创建了三个数据集之后,将创建 Apache Spark ML 管道,并通过以下步骤训练模型:

  1. 首先,你需要导入后续步骤中需要的 Apache Spark ML 包:
frompyspark.ml.featureimportOneHotEncoder,StringIndexer,IndexToString,VectorAssembler
frompyspark.ml.classification importRandomForestClassifier
frompyspark.ml.evaluationimportMulticlassClassificationEvaluator
from pyspark.ml import Pipeline, Model
  1. 接下来,示例使用StringIndexer函数作为转换器,将所有字符串列转换为数值列:
stringIndexer_label=StringIndexer(inputCol="PRODUCT_LINE",outputCol="label").fit(df_data)
stringIndexer_prof=StringIndexer(inputCol="PROFESSION",outputCol="PROFESSION_IX")
stringIndexer_gend=StringIndexer(inputCol="GENDER",outputCol="GENDER_IX")
stringIndexer_mar = StringIndexer(inputCol="MARITAL_STATUS", outputCol="MARITAL_STATUS_IX")
  1. 在接下来的步骤中,示例通过组合所有特征创建一个特征向量:
vectorAssembler_features = VectorAssembler(inputCols=["GENDER_IX", "AGE", "MARITAL_STATUS_IX", "PROFESSION_IX"], outputCol="features")
  1. 接下来,定义你想要用于分类的估计器(使用随机森林):
rf = RandomForestClassifier(labelCol="label", featuresCol="features")
  1. 最后,将索引后的标签转换回原始标签:
labelConverter = IndexToString(inputCol="prediction", outputCol="predictedLabel", labels=stringIndexer_label.labels)
  1. 现在构建实际的管道:
pipeline_rf = Pipeline(stages=[stringIndexer_label, stringIndexer_prof, stringIndexer_gend, stringIndexer_mar, vectorAssembler_features, rf, labelConverter])

在这个示例的这个阶段,你准备好使用你刚刚构建的管道和训练数据来训练随机森林模型。

数据分析和可视化示例

在 IBM Watson Studio 项目中使用启用了 Spark 的笔记本最令人兴奋的优势之一是,所有数据探索和随后的可视化通常只需几行(交互式编写的)代码即可完成。此外,笔记本界面允许尝试和错误的方法来运行查询和命令,查看结果,并可能调整(查询)并重新运行,直到您对结果满意。

最后,笔记本和 Spark 可以轻松扩展以处理大量(GB 和 TB)数据集。

在本节中,我们的目标是使用一个启用了 Spark 的笔记本来展示如何完成某些任务,例如将数据加载到笔记本中,进行一些简单的数据探索,运行查询(对数据进行查询),绘图,然后保存结果。

设置

让我们查看以下部分,以了解设置过程。

获取数据

首先,我们需要数据。我们不会自己编造,而是会遵循 Watson Studio 社区中其他几个工作示例的做法,并从 NOAA 国家气候数据中心(NCDC)公开下载一些收集到的数据:www.ncdc.noaa.gov/data-access/quick-links

这是如何从 NCDC 获取原始数据的方法:

  1. 国家海洋和大气管理局NOAA)网站,点击全球历史气候网络(GHCN)。

  2. 点击 GHCN-Daily FTP Access。

  3. 点击 by_year/文件夹。

  4. 滚动到页面底部并点击 2015.csv.gz 以下载数据集。

  5. 文件下载完成后,将其提取到易于访问的位置。

加载数据

现在我们有一个(尽管有些结构化)仍然是原始数据的文件。在准备数据进行分析时,一个典型的第一项任务是添加列标题。如果文件大小合理,您可以使用程序员的文本编辑器打开并添加标题行,但如果不是,您可以直接在 Spark 笔记本中完成此操作。

假设您已经将文件加载到您的 Watson 项目中(使用我们在前几章中展示的过程),然后您可以点击“插入代码”,然后选择如图所示的“插入 pandas DataFrame 对象”:

当您点击“插入 pandas DataFrame”时,会为您生成并添加到笔记本中的代码。生成的代码导入任何所需的包,访问数据文件(使用适当的凭据),并将数据加载到 DataFrame 中。然后,您可以在代码中的pd.read_csv命令中修改names参数(如图所示)。

这将在文件顶部创建一个标题行,使用提供的列名:

df_data_1 = pd.read_csv(body, sep=',',names = ['STATION', 'DATE', 'METRIC', 'VALUE', 'C5', 'C6', 'C7', 'C8'])

在单元格中运行代码的截图如下:

基础文件中的原始数据格式如图所示:

希望你能看到,每一列都包含一个气象站标识符、一个日期、收集的指标(如降水量、日最高和最低温度、观测时的温度、降雪、积雪深度等)以及一些额外的列(注意,缺失值可能显示为 NaN,表示 非数字)。

探索

正如我们在 第五章 中所展示的,“在 IBM Cloud 上的机器学习练习”,pandas 数据结构中有很多共同的基本功能,可以支持你的数据预处理和分析。然而,在这个例子中,我们将再次查看数据探索的示例,但这次使用 Spark DataFrame 方法。

例如,之前我们使用“插入 pandas DataFrame”加载了一个数据文件;这次,我们可以使用相同的步骤重新加载该文件,但这次选择“插入 SparkSession DataFrame”。生成的代码将包括 import ibmos2sparkfrom pyspark.sql import SparkSession 命令,并将数据加载到 SparkSession DataFrame(而不是 pandas DataFrame)中:

import ibmos2spark
# @hidden_cell
credentials = {
   'endpoint': 'https://s3-api.us-geo.objectstorage.service.networklayer.com',
    'service_id': 'iam-ServiceId-f9f1f892-3a72-4bdd-9d12-32b5a616dbfa',
   'iam_service_endpoint': 'https://iam.bluemix.net/oidc/token',
   'api_key': 'D2NjbuA02Ra3Pq6OueNW0JZZU6S3MKXOookVfQsKfH3L'
}
configuration_name = 'os_f20250362df648648ee81858c2a341b5_configs'
cos = ibmos2spark.CloudObjectStorage(sc, credentials, configuration_name, 'bluemix_cos')
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df_data_2 = spark.read\
 .format('org.apache.spark.sql.execution.datasources.csv.CSVFileFormat')\
 .option('header', 'true')\
 .load(cos.url('2015.CSV', 'chapter6-donotdelete-pr-qy3imqdyi8jv3w'))
df_data_2.take(5)

运行单元格会启动 Spark 作业,显示这些作业的进度/状态,并最终显示由 .take(5) 命令生成的输出:

SparkSession 是 Spark SQL 的入口点。它是你在开发 Spark SQL 应用程序时创建的第一个对象之一。作为一个 Spark 开发者,你使用 SparkSession.builder 方法(它为你提供了用于配置会话的 Builder API)来创建 SparkSession

当然,我们也可以使用 count()first 以及其他语句:

另一种有趣且实用的分析方法是通过显示 DataFrame 的模式。你可以使用 printSchema() 函数以树形格式打印出 SparkR DataFrame 的模式,如下所示:

df_data_2.printSchema()

上述命令生成了以下输出:

模式是数据结构的描述。模式使用 StructType 描述,它是一组 StructField 对象的集合(这些对象本身是包含名称、类型和可空性分类器的元组)。

使用 Spark DataFrame 也为你提供了在数据中导航和应用逻辑的能力。例如,通过运行 print 命令查看数据的前两行(或前几行)并不是不合理或不意外的;然而,为了可读性,你可能想通过以下代码在数据行之间添加一行星号:

for row in df_data_2.take(2):
    print(row)
    print( "*" * 104)

上述代码生成了以下输出:

假设你感兴趣的是使用你的 SQL 技能来执行你的分析?

没问题!你可以使用 SparkSQL 与你的 SparkSession DataFrame 对象一起使用。

然而,所有 SQL 语句都必须在表上运行,因此你需要定义一个类似于 指针 的表来指向 DataFrame(在你导入 SQLContext 模块之后):

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df_data_2.registerTempTable("MyWeather")

此外,你还需要定义一个新的 DataFrame 对象来保存你的 SQL 查询结果,并将 SQL 语句放在 sqlContext.sql() 方法中。让我们看看它是如何工作的。

你可以运行以下单元格来选择我们刚刚创建的表中的所有列,然后打印关于结果 DataFrame 和数据模式的信息:

temp_df =  sqlContext.sql("select * from MyWeather")
print (type(temp_df))
print ("*" * 104)
print (temp_df)

这会产生以下输出:

提取

现在让我们转向 提取 的概念。print 命令并没有真正以非常有用的格式显示数据。因此,而不是使用我们的 Spark DataFrame,我们可以使用 pandas 开源数据分析库来创建一个显示数据的 pandas DataFrame。

现在我们可以看看一个会让我们的 SQL 编程者感到高兴的例子。

导入 pandas 库并使用 .toPandas() 方法来显示 SQL 查询结果:

import pandas as pd
sqlContext.sql("select STATION, METRIC from MyWeather limit 2").toPandas()

执行前面的命令会产生以下输出:

这里是另一个简单的 SQL 查询执行示例,这次是计算每个气象站记录的指标数量,然后创建一个按气象站指标记录数量排序的气象站列表:

query = """
select
    STATION ,
    count(*) as metric_count
from MyWeather
group by STATION
order by count(*) desc
"""
sqlContext.sql(query).toPandas()

上述代码给出了以下输出:

鼓励你尝试 SQL 语句的额外变体,然后实时查看结果。

绘图

那么,让我们继续前进!

我们现在将查看如何在 Spark DataFrame 中绘制一些我们收集的数据。你可以使用 matplotlibpandas 创建几乎无限数量的可视化(一旦你足够了解你的数据)。

你甚至可能会发现,一旦达到这一点,生成可视化相当容易,但随后你可以花费几乎无限的时间来清理和准备与他人分享。

我们现在将查看这个过程的一个简单示例。

从上一节中的 Spark DataFrame 开始,假设我们认为生成一个基于数据中的 DATE 字段的简单柱状图会很不错。因此,为了开始,我们可以使用以下代码根据 DATE 来进行计数:

df_data_2.groupBy("DATE").count().show()
df_data_2.groupBy("DATE").count().collect()

执行前面代码的结果如下截图所示:

我们可能会说生成的输出看起来似乎有些合理(至少第一眼看起来是这样),所以下一步将使用以下代码构建一个以易于绘制的方式格式化的数据矩阵:

count = [item[1] for item in df_data_2.groupBy("DATE").count().collect()]
year = [item[0] for item in df_data_2.groupBy("DATE").count().collect()]
number_of_metrics_per_year = {"count":count, "DATE" : year}
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
number_of_metrics_per_year = pd.DataFrame(number_of_metrics_per_year )
number_of_metrics_per_year .head()

执行此代码并查看生成的输出看起来完全合理,并且符合我们的目标:

所以,太好了!如果我们达到了这个阶段,我们会认为我们已经准备好绘制和可视化数据了,所以我们可以继续使用以下代码来创建一个可视化:

number_of_metrics_per_year = number_of_metrics_per_year.sort_values(by = "DATE")
number_of_metrics_per_year.plot(figsize = (20,10), kind = "bar", color = "red", x = "DATE", y = "count", legend = False)
plt.xlabel("", fontsize = 18)
plt.ylabel("Number of Metrics", fontsize = 18)
plt.title("Number of Metrics Per Date", fontsize = 28)
plt.xticks(size = 18)
plt.yticks(size = 18)
plt.show()

在运行前面的代码后,我们可以看到代码是有效的(我们已经基于我们的数据生成了一个可视化),但输出并不像我们希望的那样有用:

它相当混乱,并且不太有用!

所以,让我们回到并尝试减少我们试图绘制的数据量。幸运的是,我们可以重用本章前面部分的一些代码。

我们可以从再次设置一个可以查询的临时表开始:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df_data_2.registerTempTable("MyWeather")

然后,我们可以创建一个临时 DataFrame 来保存我们的结果(temp_df)。查询只能加载收集到的METRICPRCPVALUE大于500的记录:

temp_df =  sqlContext.sql("select * from MyWeather where METRIC = 'PRCP' and VALUE>500")
print (temp_df)
temp_df.count()

这应该会显著减少要绘制的数据记录数量。

现在,我们可以回到并重新运行我们用来创建要绘制的矩阵数据的代码以及实际的绘图代码,但这次使用临时 DataFrame:

temp_df.groupBy("DATE").count().show()
temp_df.groupBy("DATE").count().collect()
count = [item[1] for item in temp_df.groupBy("DATE").count().collect()]
year = [item[0] for item in temp_df.groupBy("DATE").count().collect()]
number_of_metrics_per_year = {"count":count, "DATE" : year}
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
number_of_metrics_per_year = pd.DataFrame(number_of_metrics_per_year )
number_of_metrics_per_year .head()
number_of_metrics_per_year = number_of_metrics_per_year.sort_values(by = "DATE")
number_of_metrics_per_year.plot(figsize = (20,10), kind = "bar", color = "red", x = "DATE", y = "count", legend = False)
plt.xlabel("", fontsize = 18)
plt.ylabel("Number of Metrics", fontsize = 18)
plt.title("Number of Metrics Per Date", fontsize = 28)
plt.xticks(size = 18)
plt.yticks(size = 18)
plt.show()

现在我们得到了一个不同,也许稍微好一点的,但可能仍然还没有准备好分享的结果:

如果我们继续使用前面的策略,我们还可以再次修改 SQL 查询以进一步限制或过滤数据,如下所示:

temp_df =  sqlContext.sql("select * from MyWeather where METRIC = 'PRCP' and VALUE > 2999")
print (temp_df)
temp_df.count()

然后,我们可以审查生成的临时 DataFrame,并看到现在它的记录数量少了很多:

如果我们现在重新运行剩余的绘图代码,我们会看到它产生了一个稍微好一点的(但仍然不能接受)的图表:

实际上,我们可以通过修改 SQL,重新运行代码,然后审查最新的结果来继续这个过程,直到我们对看到的结果满意为止,但你应该已经有了大致的概念,所以我们现在继续。

保存

就像在 Microsoft Word 或 Microsoft Excel 中工作一样,定期保存你的工作总是一个好主意。

事实上,你可能甚至想要保存你工作的多个版本,因为你继续进化它,以防你想要在某个时候回退。在进化你的脚本时,你可以点击文件,然后保存或保存版本以保留笔记本的适当副本:

您还可以在 Watson Studio 之外保存和分享只读副本的笔记本,这样其他人即使不是 Watson Studio 项目的合作者也能查看和下载它们。您可以通过以下方式完成此操作:

  • 在社交媒体上分享 URL:您可以在社交媒体或与 Watson Studio 外的人分享笔记本的最后保存版本。

  • 在 GitHub 上发布:为了支持与利益相关者和整个数据科学社区的协作,您可以在 GitHub 仓库中发布您的笔记本。

  • 发布为 gist:所有拥有管理员或编辑权限的项目协作者都可以将笔记本或笔记本的部分内容作为 gist 分享。您的笔记本的最新保存版本将作为 gist 发布。

下载您的笔记本

您可以按照以下截图所示下载您的笔记本:

图片

摘要

在本章中,我们介绍了 Spark 以及如何在 IBM Watson Studio 中创建一个 Spark 启用的笔记本,以及 ML 流程的概念。

最后,我们通过一个使用 Spark 进行数据分析并创建可视化来讲述数据更好故事的实际示例结束了这一部分。

在下一章中,我们将介绍在 IBM Cloud 上进行深度学习和神经网络的基础知识。

第七章:在 IBM 云上使用 TensorFlow 进行深度学习

在本章中,我们将介绍 IBM 云上深度学习和神经网络的概念。同时,我们将提供如何使用 TensorFlow 框架在云上实现深度学习模型的概述。本章旨在在理论与实践之间取得平衡。

在本章中,我们将介绍以下主题:

  • 深度学习简介

  • TensorFlow 基础知识

  • 使用 TensorFlow 的神经网络

  • 一个例子

  • TensorFlow 与图像分类

  • 额外的准备

深度学习简介

深度学习(也称为深度结构学习层次学习)是更大一组基于学习数据表示的机器学习方法的组成部分,而不是特定任务的算法。

学习可以是监督的(我们在第三章,监督机器学习模型与你的数据)中已经讨论过)、半监督的,或无监督的(在第四章,实现无监督算法)。

深度学习算法正在一些令人兴奋的领域发挥作用,如图像分类(将数字图像中的每个像素分类为几种土地覆盖类别之一,或主题)、目标检测(在图像或视频中寻找现实世界对象(如人脸、汽车和建筑物)的实例的过程)、图像恢复(补偿或撤销由运动模糊、噪声和相机失焦引起的缺陷,这些缺陷会降低图像质量)以及图像分割(将数字图像分割成多个像素段的过程,也称为超像素,以简化图像表示或将其转换为更有意义且更容易分析的形式)。

使用巨大的神经网络进行深度学习正在教会机器自动化人类视觉系统执行的任务。

深度学习模型在某种程度上受到生物神经系统信息处理和通信模式的影响,但它们与生物大脑的结构和功能特性不同,这使得它们与神经科学证据不兼容。

足够的理论。虽然对机器/深度学习的先前列举可能属于高级别,但对于我们来说已经足够,可以继续到下一节,在那里我们开始思考深度学习实现的手段,特别是使用由谷歌大脑团队为谷歌内部使用开发的工具集,在 2015 年 11 月 9 日以 Apache 2.0 开源许可证发布:TensorFlow。

TensorFlow 基础知识

张量可以被认为是广义的矩阵,或者更具体地说,是存在于结构中并与其他数学实体交互的数学实体。如果结构中的其他实体以任何方式变换,那么张量也必须按照那个变换规则变换。

前面的定义意味着什么?也许将张量视为多维数组更容易理解,或者考虑以下内容,比较标量向量矩阵张量

基于 TensorFlow 的主题,TensorFlow 是一个由 Google 最初创建的开源软件库(也称为框架),用于创建深度学习模型。

您可以访问www.tensorflow.org/获取有关 TensorFlow 的更多详细信息。

在下一节中,我们将讨论深度学习、神经网络和 TensorFlow 之间的关系。

神经网络和 TensorFlow

深度学习模型通常采用被称为神经网络的算法,这些算法据说受到了实际生物神经系统(如大脑)处理信息方式的影响。这使得计算机能够识别所有数据点所代表的内容,并学习模式。

今天,深度学习模型的主要软件工具是 TensorFlow,因为它允许开发者创建具有多个层的庞大神经网络。

TensorFlow 主要用于以下目的:

  • 分类

  • 感知

  • 理解

  • 发现

  • 预测

  • 创建

如 Watson 文档中所述,部署复杂机器学习模型(如 TensorFlow 模型)的挑战在于这些模型在训练时非常计算密集和时间消耗。一些解决方案(针对这一挑战)包括 GPU 加速、分布式计算或两者的结合。IBM 云平台和 Watson Studio 都提供了这两种解决方案。

它还指出:IBM Watson Studio 允许用户利用云上可用的计算能力来加速更复杂机器学习模型的训练时间,从而将时间从数小时或数天缩短到几分钟。

在下一节中,我们将探讨几个练习,展示使用 IBM Watson Studio 和 TensorFlow 的各种方法。

一个例子

在本节中,我们将首先通过一个 Watson 社区(dataplatform.cloud.ibm.com/community)教程,展示如何使用 IBM Watson Studio 上的 TensorFlow 库轻松部署深度神经网络。

该教程可在 GitHub 上下载,但在此我们不会提供 URL,因为我们将展示如何直接在 IBM Watson Studio 项目中从外部来源(如 GitHub)导入内容变得多么简单。

本练习的关键点是复杂的机器学习模型可能非常计算密集,但 IBM Watson Studio 为您提供了轻松高效(按使用付费)使用云上计算能力来加速处理时间并缩短从数小时或数天到数分钟的学习时间的机遇。

此外,IBM Watson Studio 提供了在云中开发以数据为中心的解决方案所需的所有工具。它使用 Apache Spark 集群(用于计算能力),并允许您在 Python、Scala 和 R 中创建资产,并利用开源框架(如 TensorFlow),所有这些都在 Watson Studio 上预先安装。

如果您花时间阅读教程的细节,您会发现它解释了如何创建新的 IBM Cloud 账户并注册 IBM Watson Studio(我们在第一章,IBM Cloud 简介)。

然后教程继续展示如何导航到 IBM 的 Watson Studio(一旦在 IBM Cloud 平台上),创建一个新项目,然后将笔记本导入到项目中。

尽管在早期章节中,我们展示了如何在 Watson Studio 中创建新项目和创建新笔记本,但这将是第一次我们从外部 URL 直接进行笔记本导入,所以接下来的章节将重点介绍这个过程。

要导入的笔记本将已经包含 TensorFlow 库和示例代码,因此这项练习对我们来说应该既快又简单,所以让我们不要浪费更多时间!

创建新项目

通过遵循我们在早期章节中遵循的相同步骤,我们可以创建一个新的深度学习 IBM Watson Studio 项目(见以下截图)并为其命名:

图片

笔记本资产类型

一旦创建新项目,从项目仪表板,您可以点击“添加到项目”选项并选择笔记本,如下截图所示:

图片

正如我们在前面的章节中所做的那样,我们可以创建一个新的、空的笔记本。但在这个练习中,我们想要导入一个现有的笔记本。

IBM Watson Studio 允许您从文件或直接从已知且可访问的 URL 导入笔记本。

在此情况下,我们将选择从 URL 导入。为此,您需要选择“从 URL”选项,并输入以下行:

github.com/aounlutfi/building-first-dl-model/blob/master/first-dl-model.ipynb

前面的链接将是导入到您的 Watson Studio 项目的(外部)URL。

接下来,点击“创建笔记本”开始导入(如果可以访问 URL,这个过程应该只需要几秒钟),如下截图所示:

图片

几秒钟后,笔记本打开并准备好审查和执行:

图片

运行导入的笔记本

要运行导入的笔记本,点击命令栏中的“单元格”,然后点击“运行所有”:

图片

在点击运行全部之后,IBM Watson Studio 将运行笔记本中的所有单元格,这应该需要大约十五分钟的时间来完成,因为数据集由 20,000 张图像组成。

如果您想更好地理解正在发生的事情,您也可以单独运行每个单元格。

查看笔记本

如果您花时间(您应该这样做)查看笔记本中的单元格,您会注意到其中有很多 Markdown 单元格明确描述了笔记本中的步骤。

例如,你应该注意标记为“导入”的 Markdown 单元格(如下面的截图所示),其中清楚地说明为了能够在 TensorFlow 中构建、测试和运行神经网络,必须使用以下导入。这还导入了 MNIST 数据集(数据集中的每个点都是 0-9 数字的手写表示,每个数字由 784 个像素组成):

图片

指南还通过挑战您尝试在本地计算机上设置 Python 和 TensorFlow(而不是使用 IBM Watson Studio 在云上)并运行示例来强调一个观点,以便您可以比较结果,注意这可能需要数小时,甚至可能需要数天才能训练,这取决于机器的性能,而且是在您组装了所需环境之后!

在下一个示例中,我们将介绍如何使用 IBM Watson Studio 与 Watson 服务和 TensorFlow API 进行图像分类和对象检测。

TensorFlow 和图像分类

IBM Watson 视觉识别服务使用深度学习算法来识别您上传到服务的图像中的特征,如场景、对象和面部。您还可以使用视觉识别服务、IBM Watson Studio 和相关 Python 模块创建和训练自定义分类器,以识别符合您要求的主题。

要开始使用视觉识别,我们需要使用常规程序创建 Watson Studio 项目并定义一个新的 Python 3.5 笔记本,但我们也需要将 IBM Watson 视觉识别服务实例与项目关联(实际上这是一件相当容易的事情)。

添加服务

要添加 Watson 视觉识别服务,您需要转到 IBM 云仪表板,选择 Watson 服务,然后浏览服务,在那里您可以找到并选择视觉识别服务:

图片

接下来,从视觉识别页面(如下面的截图所示),您可以选择服务实例的位置和资源组,然后点击创建以实际创建您可以在项目中使用的服务实例:

图片

一个视觉识别服务实例一次只能与一个项目相关联。

一旦创建了视觉识别服务实例,它将列在您的云仪表板上:

图片

在创建服务实例后,您应该能够通过在服务凭据部分点击“新建凭据”或“查看凭据”来创建所谓的服务凭据(或 API 密钥)。

您将需要这个 API 密钥来引用和使用项目中的实例。

以下截图显示了服务凭据页面:

图片

在本章的下一节中,我们需要引用这个 API 密钥,所以请将其保留在手边!

现在我们已经准备好开始实际的视觉识别项目。在这个例子中(GitHub 上有可用的版本),我们使用 Watson 视觉识别服务通过 TensorFlow 对象检测 API 进行对象检测。

必需的模块

尽管许多预安装的库和模块已经作为 IBM Watson 笔记本环境的一部分包含在内(取决于选择的笔记本类型),但为了使特定项目正确运行,可能还需要安装各种其他模块和框架,因此在我们笔记本中的第一件事就是输入以下命令以查看预安装库的列表:

!pip list –isolated

总是以这个命令开始一个新的项目是一个非常好的主意,以了解您的笔记本环境;这可能会节省您以后的时间。

然后,您可以使用 Python 的!pip install命令逐行安装此项目所需的每个模块,如下所示:

!pip install asn1crypto==0.23.0
!pip install bleach==1.5.0
!pip install certifi==2017.11.5
!pip install cffi==1.11.2
!pip install chardet==3.0.4
!pip install cryptography==2.1.3
!pip install cycler==0.10.0
!pip install enum34==1.1.6
!pip install html5lib==0.9999999
!pip install idna==2.6
!pip install Markdown==2.6.9
!pip install matplotlib==2.1.0
!pip install numpy==1.13.3
!pip install olefile==0.44
!pip install Pillow==4.3.0
!pip install protobuf==3.5.0.post1
!pip install pycparser==2.18
!pip install pyOpenSSL==17.4.0
!pip install pyparsing==2.2.0
!pip install pysolr==3.6.0
!pip install python-dateutil==2.6.1
!pip install pytz==2017.3
!pip install requests==2.18.4
!pip install six==1.11.0
!pip install tensorflow==1.4.0
!pip install tensorflow-tensorboard==0.4.0rc3
!pip install urllib3==1.22
!pip install watson-developer-cloud==1.0.0
!pip install Werkzeug==0.12.2

使用一个命令安装所需的模块的另一种更高效的方法是参考提供的requirements.txt文件:

pip3 install -r requirements.txt

在代码中使用 API 密钥

IBM Watson 视觉识别服务内置了模型,您可以使用这些模型来分析图像,以识别场景、对象、面部以及许多其他类别,而无需任何训练。我们已创建了一个视觉识别服务的实例,因此它可用于我们的项目。为了使其工作,您需要拥有那个有效的密钥(我们的实际 API 密钥)。

即使您在 Watson 笔记本中有可工作的 Python 代码,您现在也需要使用您已建立的 API 密钥,这样它就可以与 Watson 服务进行验证(并且实际上可以工作)。

如果您查看 Python 项目代码(我们将在下一节中加载),您将找到以下代码语句:

Visual_recognition = VisualRecognitionV3('2016-05-20', api_key='API_KEY')

这行代码是 Watson 视觉识别服务初始化为我们代码中可用的对象的地方。您需要将API_KEY短语替换为您实际的 API 密钥(您在上一节中创建的)。

额外的准备

在本节中,我们将处理一些在成功运行项目之前所需的额外家务。

Pillow 是Python 图像库PIL),它提供了打开、操作和保存图像的支持。当前版本可以识别和读取大量格式。

这个项目使用pillow,并要求至少安装 5.3.0 版本。为了确保笔记本使用这个版本,我们需要运行以下命令:

# --- we need pillow version of 5.3.0 to run this project
# --- this code will uninstall the current version:
!pip uninstall -y Pillow
# --- install the 5.3.0 version
!pip install Pillow==5.3.0
# --- import the new one
import PIL
# --- Should print 5.3.0\. If it doesn't, then restart the kernel 
print(PIL.PILLOW_VERSION)

代码卸载了当前安装的 Pillow 版本,安装了 5.3.0 版本,将其导入到项目中,然后打印出(现在)当前安装的版本。

如最后一行代码所示,如果print命令的输出没有显示安装的pillow版本是 5.3.0,你需要停止并重新启动你的内核(在笔记本中点击“内核”,然后重启),然后再次执行print命令,你应该就可以继续了:

图片

升级 Watson

当我开始尝试这个项目时,在使用 Visual Recognition 服务时遇到了几个困难。经过大量的调试和一些来自 IBM Cloud 支持的宝贵帮助,确定我使用的项目代码正在使用较旧的云 API 版本。

为了解决我看到的问题,我需要使用以下命令将 Watson 服务升级到最新版本:

# --- Upgrade Watson Developer
!pip install --upgrade "watson-developer-cloud>-2.8.0"

前一个命令生成了以下输出:

图片

为了验证服务已升级,你应该看到以下消息:

Successfully installed watson-developer-cloud-2.8.0 websocket-client-0.48.0

一旦服务升级,我之前遇到的所有问题都得到了解决。

在撰写本文时,2.8.0 是最新版本。建议始终检查并使用最新可用的版本。

图片

需要执行的最后一项设置任务是提供一个图像文件供我们的解决方案检测其中的对象。

示例项目代码提供了一个四只狗的图片,你可以使用它,但提供你自己的图片会更有趣。这个项目的 README 说明指出,代码期望文件位于test_image/image1.jpg,但你可以简单地使用我们在前几章中使用的相同步骤上传它作为数据资产,然后更新代码,以便找到文件(你还可以更改文件名)。

我选择了以下三张不同的图片:

图片

代码审查

到目前为止,我们的环境应该已经准备好进行主代码部分。现在让我们看看代码的每个部分,以了解其目的。

第一部分执行了各种额外的导入操作。请注意导入 Visual Recognition 服务(VisualRecognitionV3)的代码行,该服务来自(现已升级的)watson_developer_cloud

from watson_developer_cloud import VisualRecognitionV3

以下是一些命令:

import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile
import json
from io import StringIO
from PIL import Image
from watson_developer_cloud import VisualRecognitionV3
import matplotlib.pyplot as plt
import matplotlib.patches as patches

下一条代码使用了我们之前提到的 API 密钥(你将使用自己的):

# --- Replace with your api key
visual_recognition = VisualRecognitionV3('2016-05-20', api_key='r-1m0OdmBy9khRHJvujylJoLRJIqjwS6Bqwb6VMBfeCE')

下一个部分包含了一些变量,当你在运行笔记本时可以对其进行实验。查看结果并调整变量以观察效果:

MAX_NUMBER_OF_BOXES = 9
MINIMUM_CONFIDENCE = .9
COLORS = ['b', 'g', 'r', 'c', 'm', 'y', 'b', 'w']

从前面的命令中,让我们探索定义的三个变量中的每一个:

  • MAX_NUMBER_OF_BOXES:这个变量代表在测试图像中要定位的最大对象数量;我使用了9,因为如果有很多,可能会变得很难看。

  • MINIMUM_CONFIDENCE:这个变量代表一个框可以有的最小置信度分数。如果这个值太低,你可能会在没有任何东西的地方得到框。

  • COLORS:这个变量设置结果识别框的属性。

访问模型

代码的下一部分将下载要使用的视觉识别模型并将其加载到内存中。第一次下载模型可能需要几分钟,但只需要在第一次运行时下载:

# --- define What model to download.
MODEL_NAME = 'ssd_mobilenet_v1_coco_11_06_2017'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'
# --- Path to frozen detection graph. This is the actual model that  # --- is used for the object detection.
PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'
print('Downloading model... (This may take over 5 minutes)')
# --- Download model if not already downloaded
if not os.path.exists(PATH_TO_CKPT):
   opener = urllib.request.URLopener()
opener.retrieve(DOWNLOAD_BASE + MODEL_FILE, MODEL_FILE)
 print('Extracting...')
tar_file = tarfile.open(MODEL_FILE)
for file in tar_file.getmembers():
    file_name = os.path.basename(file.name)
if 'frozen_inference_graph.pb' in file_name:
tar_file.extract(file, os.getcwd())
else:
   print('Model already downloaded............')
# --- Load model into memory
print('Loading da model...')
detection_graph = tf.Graph()
with detection_graph.as_default():
    od_graph_def = tf.GraphDef()
    with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
      serialized_graph = fid.read()
        od_graph_def.ParseFromString(serialized_graph)
       tf.import_graph_def(od_graph_def, name='')

检测

代码的下一部分运行图像使用 TensorFlow 对象检测 API。它将提供边框位置的坐标作为边缘位置的数组(顶部、左侧、底部和右侧)。然后根据这些框裁剪并保存图像。为了我们能够裁剪正确的区域,我们需要通过乘以宽度和高度将坐标从百分比转换为像素:

def load_image_into_numpy_array(image):
   (im_width, im_height) = image.size
    return np.array(image.getdata()).reshape(
   (im_height, im_width, 3)).astype(np.uint8)
# --- Path to image to test, was: "test_image/image1.jpg"
TEST_IMAGE_PATH = 'image1.jpg'

在我们保存图像部分之后,我们可以将每个部分传递给 Watson 进行分类。

注意以下代码中使用了我们之前设置的变量(MAX_NUMBER_OF_BOXESMINIMUM_CONFIDENCE):

print('detecting...')
with detection_graph.as_default():
   with tf.Session(graph=detection_graph) as sess: 
        image = Image.open(TEST_IMAGE_PATH)
        image_np = load_image_into_numpy_array(image)
        image_np_expanded = np.expand_dims(image_np, axis=0)
        image_tensor = detection_graph.
        get_tensor_by_name('image_tensor:0')
        boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
        scores = detection_graph.
        get_tensor_by_name('detection_scores:0')
        num_detections = detection_graph.
        get_tensor_by_name('num_detections:0')
        # --- Actual detection.
    (boxes, scores, num_detections) = sess.run([boxes, scores, num_detections], feed_dict={image_tensor: image_np_expanded})
  # --- Create figure and axes and display the image
        fig, ax = plt.subplots(1)
        ax.imshow(image_np)
        (height, width, x) = image_np.shape
for i in range(0, int(min(num_detections,          MAX_NUMBER_OF_BOXES))):
           score = np.squeeze(scores)[i]
           # --- if the score is not greater than
           # --- what we set the minimun score to be then
           # --- exit the loop
           if score < MINIMUM_CONFIDENCE:
             break
            box = np.squeeze(boxes)[i]
            box_x = box[1] * width
            box_y = box[0] * height
            box_width = (box[3] - box[1]) * width
            box_height = (box[2] - box[0]) * height
            box_x2 = box[3] * width
            box_y2 = box[2] * height
            img2 = image.crop((box_x, box_y, box_x2, box_y2))
            path = 'cropped/image1'
            os.makedirs(path, exist_ok=True)
            full_path = os.path.join(path, 'img{}.jpg'.format(i))
            img2.save(full_path)        

分类和输出

假设你执行了本章前面概述的环境检查和设置,到目前为止的所有代码应该能够完美运行,不会产生任何错误。下一部分代码是从 GitHub 上提供的项目的原始版本更新的,因为 IBM 对 API 的新版本进行了更改。

如果你使用这本书提供的笔记本代码,更新已经为你做好了。

最后,下一段代码接收从 Watson 视觉识别服务返回的结果或分类,并将其存储在名为results的对象中。

从那个信息中,构建了一个标签,并在源图像文件中检测到的每个对象周围绘制了一个矩形形状:

# --- Classify images with Watson visual recognition
         with open(full_path, 'rb') as images_file:
             parameters = json.dumps({'threshold': 0.7,          'classifier_ids': ['default']})
               results = visual_recognition.classify(images_file=images_file, parameters=parameters).get_result() 
                label = results['images'][0]['classifiers'][0]['classes'][0]['class']
                ax.text(box_x + 5, box_y - 5, label, fontsize=10, color='white', bbox={'facecolor':COLORS[i % 8], 'edgecolor':'none'})
            # --- Create a Rectangle patch
            rect = patches.Rectangle((box_x, box_y), box_width, box_height, linewidth=2, edgecolor=COLORS[i % 8], facecolor='none')
            ax.add_patch(rect)

如果你更仔细地检查results对象(尝试使用 Python 的type命令),你会看到结果对象是一个 Python 字典对象。

Python 字典对象与列表类似,因为它是一个对象的集合。

现在尝试在笔记本代码中添加print(results),你将看到结果中返回的原始输出的一瞥。

使用print(results)命令,实际输出显示在以下屏幕截图:

图片

检测到的对象

最后,我们准备好使用matplotlibplt.show()来显示我们正在工作的当前图像:

 # --- use matplotlib to show the result!
 plt.show()

我们现在终于可以看到项目的输出了。在这个例子中,我们的图像是一匹马,我们可以看到 Watson 视觉识别服务正确地检测并标记了这个对象为斑点马:

图片

现在是好玩的部分

现在是最好玩的部分。你可以从几乎任何地方下载任意数量的文件来测试应用程序(或创建你自己的)。我使用了几个图像,发现沃森相当准确。

使用的第一张图像被正确地检测为摩托车,第二张(显示两辆复古汽车的图像)在沃森检测到其中一辆汽车为汽车,而另一辆被检测为轻型卡车方面很接近。

我们之前提到的最后一张图像的结果:沃森不仅正确地检测到一匹马,而且还标记了它的品种:斑马。

以下截图显示了三张不同的图像及其相应的结果:

保存并分享你的工作

和往常一样,一旦你有一个可工作的项目笔记本,你可以点击文件然后保存来保存你的工作。下一步是通过点击共享图标来共享你的笔记本,如下面的截图所示):

从那里,你可以选择你想要分享笔记本的方式:

你应该养成在分享之前用 Markdown 单元格内容记录你的笔记本的习惯。你会发现,如果你为每个单元格添加注释和观点,你的工作将得到更好的接受。

最后,当你查看你的项目笔记本(见下面的截图)时,注意 SHARED 和 STATUS 图标。你可以将你的笔记本发布到各种目标环境中,例如 GitHub:

摘要

在本章中,我们从一个关于深度学习概念的介绍开始,然后探讨了使用 TensorFlow 库和神经网络的基礎。

我们接着浏览了两个 IBM Watson Studio 项目,以展示如何使用 IBM 云上提供的工具和服务构建神经网络和对象检测项目。

在下一章中,我们将在 IBM 云上创建一个面部表情平台。

第三部分:真实案例研究

本书本部分提供了从 A 到 Z 解决完整、生产就绪的机器学习问题的完整案例研究。

本节将涵盖以下章节:

  • 第八章,在 IBM 云上创建面部表情平台

  • 第九章,使用机器学习自动分类岩相形成

  • 第十章,构建基于云的多生物识别身份认证平台

  • 第十一章,结论

第八章:在 IBM 云上创建面部表情平台

在本章中,我们将介绍一个基于 IBM Cloud 的完整表达式分类解决方案,该解决方案将在 IBM Cloud 平台上使用深度学习机器学习技术。该解决方案将使用 TensorFlow 和 IBM Watson Studio 提供的 ML 服务实现一个简单而高效的 ML 模型。目标是展示一个复杂 ML 任务的端到端解决方案。

我们将本章分为以下区域:

  • 理解面部表情分类

  • 探索表情数据库

  • 面部预处理

  • 学习表达式分类器

  • 评估表达式分类器

理解面部表情分类

让我们从简短讨论开始,讨论当我们说面部表情分类时我们究竟指的是什么。

在第七章《在 IBM 云上使用 TensorFlow 进行深度学习》中,我们使用了 IBM Watson Studio 在随机图像中执行目标检测。在那个用例中,我们要求我们的项目模型找到或检测图像中可能出现的常见或已知对象。例如,我们提交了一张动物的图片,解决方案正确地检测并识别出了一匹斑马,尽管没有提供关于检测到的对象的更多信息,例如马是否生气或害怕。

面部检测

可能的下一步(在图像中的目标检测之后)是面部检测。面部检测是一种计算机技术,被应用于各种应用中,旨在识别数字图像中的人类面部。

面部识别是通过使用技术来检测和识别人类面部的一种方式。面部识别解决方案利用生物识别逻辑将照片(甚至视频)中的面部特征进行映射,然后将其与已知面部数据库中的信息进行比较,寻找匹配项。

生物识别是基于每个人独特的生理和行为特征进行测量和统计分析的科学,基于的原则是每个个体都可以通过其固有的生理或行为特征被准确识别。

面部表情分析

现在我们可以进入正题:面部表情分析

这个概念通常将所有面部表情归类为与六种普遍情感之一相关——快乐(幸福)、惊讶、厌恶、悲伤、愤怒和恐惧,以及中性。

情感是我们作为人类的一个元素,而且(信不信由你)它们很难隐藏,因为所有情感,无论是否被抑制,都可能产生明显的生理效应,如果我们能够自动化检测和解释这些生理效应的过程,这些效应将是有价值的。

一旦检测到,对(面部表情)的解释过程(或许)仅仅是另一个分类练习。在实践中,你会发现面部表情分类将基于所谓的TBM可迁移信念模型框架。

TBM

TBM 提供了一个有趣的假设。无意提供对 TBM 框架的全面解释,一个关键点是它引入了信念和转移的程度(从而产生了该方法的名字:可迁移信念模型),这允许模型做出执行适当分类(表情)所需的必要假设。基本上,这意味着它对其假设进行评分,即确定表情是快乐的表情的假设有n百分比的正确性(我们将在本章后面回顾我们项目的结果时看到这一点)。

进一步(并且我在简化),TBM 试图使用量化的信念来做出其分类决策。也许更容易理解的是,面部表情分析从面部特征(嘴巴、眼睛和眉毛)中提取表情骨骼,然后从面部图像中推导出简单的距离系数。这些特征距离随后被输入到一个基于规则的决策系统中,该系统依赖于 TBM 来将面部表情分配给面部图像。

再次强调,目标不是定义 TBM 背后的理论,甚至不是面部表情分析解决方案的详细细节,而是更多地展示一个实际的工作示例;因此,我们将继续到下一节和我们的用例示例,并将进一步研究这个主题的工作留给读者。

探索表情数据库

所有面部表情分析解决方案的核心是一个表情数据库。

一个(面部)表情数据库是展示一系列情感的具体面部表情的图像集合。如果这些图像要用于表情识别系统和相关算法,它们必须被很好地注释或情感标记。

自动人类行为分析领域新发展的一个主要障碍是缺乏展示行为和情感的合适数据库。在这个领域已经有一些有针对性的进展,例如MMI 面部表情数据库项目,该项目旨在向面部表情分析社区提供大量面部表情视觉数据

MMI 面部表情数据库最初于 2002 年创建,作为构建和评估面部表情识别算法的资源。该数据库的一个显著特点是,其他数据库专注于六种基本情绪(我们之前提到过)的表情,而此数据库包含这些典型表情以及仅激活单个面部动作编码系统(FACS)或动作单元(AU)的表情,对于所有现有的 AU 和许多其他动作描述符(AD)。最近还增加了自然表情的记录。

该数据库对科学界免费开放。有关数据库的更多信息,请在网上查看mmifacedb.eu

在其他示例项目中,我们能够创建自己的测试数据或修改现有数据集以在项目中使用。然而,对于表情分析项目来说,创建一个合理规模的数据库(从零开始),这需要收集和处理成千上万张图像,所有这些图像都需要适当的文档记录,实际上并不现实。

收集后,每个(面部)图像都需要根据所显示的情绪进行审查和分类,分为七个类别之一(愤怒、厌恶、恐惧、快乐、悲伤、惊讶和中性)。为了进一步复杂化这项工作,图像可能没有对齐和适当的比例。

事实上,即使你有大量的图像,如果图像没有正确标记,或者根本不包含可检测的面部图像,表情分析和检测过程的性能将会受到影响(表现不佳)。

这些类型的挑战使得分类过程更加困难,因为模型被迫进行泛化。

使用 Watson 视觉识别服务进行训练

考虑到上述挑战,IBM Watson Studio 通过提供(开箱即用的)Watson 视觉识别服务,帮助我们开始使用。

这个有价值的服务有助于使用机器学习逻辑准确分析、分类和训练图像的过程(尽管,诚然,一开始仍然需要合理数量的相关训练数据,关于这一点稍后还会详细说明)。

幸运的是,有一组内置模型可供我们使用,无需无限期地训练就能提供高度准确的结果。这些模型如下:

  • 通用模型:通用分类类别

  • 面部模型:在图像中定位面部、性别和年龄

  • 显式模型:图像是否适合通用

  • b 模型:专门用于食品图像

在本章的项目中,我们将展示如何使用视觉识别服务和面部模型构建一个端到端的工作解决方案,该解决方案可以查看人脸图像,执行表情分析和简单分类,并最终确定个人是感到快乐还是悲伤。

预处理面部

我们刚刚提到,构建一个合适的表情数据库是一项大量工作。为了能够构建一个端到端的工作表情分析解决方案(并将其全部放入本书的单章中),我们将在我们的项目中采取一些自由:

  • 我们将限制我们模型检测和分类的能力,仅限于两种情绪——快乐和悲伤

  • 我们将只提供有限的表达数据来训练我们的模型

显然,在现实世界中,我们的第二个假设是风险性的;在任何机器学习模型中,训练数据越少,通常产生的结果就越没有价值。

准备训练数据

再次强调,如果我们决定仅满足使用面部模型和视觉识别服务的最低要求,我们可以只收集每个类别(我们打算让模型训练的类别)的 10 张图片(10 个笑脸,10 个哭脸和 10 个负面表情)。

这些单个训练文件需要满足以下条件:

  • 格式为 JPEG(.jpg)和 PNG(.png

  • 至少 32*32 像素大小

  • 将一组图片压缩成 ZIP 文件,即一个happy.zip文件包含 10 个笑脸,一个sad.zip文件包含 10 个哭脸

下面是初始快乐模型训练数据的抽样截图:

图片

前面的图像是 10 个面部表情,我们认为可以标记为快乐面部表情的代表。请注意,所有单个文件都已添加到名为happy.zip的压缩(ZIP)文件中。

下面是初始悲伤模型训练数据的抽样截图:

图片

显然,前一组展示了快乐,后一组图像是面部表情,我们认为可以标记为悲伤表情的代表(单个文件和压缩文件sad.zip)。

负面或非正面分类

为了使面部模型正常工作,也需要负面图像,这些图像不会被用于创建分类(我们将在下一节中介绍)在创建的分类器中,而是用来定义更新的分类器不是什么。负面示例文件不应包含任何正面类别(快乐和悲伤)的主题图像。本质上,这个组中的面部图像可能被认为是中性的。你只需要指定一个负面示例文件。

因为你想给模型提供不应该寻找的例子,你必须提供负面类别。向机器学习模型提供所有正面图像意味着它只会假设一切都是正面的,并产生风险性的结果。

因此,最终,我们的初始负面模型训练数据如下截图所示:

图片

准备环境

让我们现在继续进行项目模型开发。

下一步(假设您已经创建了一个新的 IBM Watson Studio 项目)是将 Watson 视觉识别服务关联到项目。我们在第七章使用 TensorFlow 在 IBM Cloud 上进行深度学习中介绍了如何进行此操作,因此我们假设您已经将服务添加到这个新项目中。如果没有,请参阅第七章使用 TensorFlow 在 IBM Cloud 上进行深度学习或在线 Watson Studio 文档。

项目资产

在本章的项目中,我们的主要资产将是我们所收集的培训图像,也许间接地,还包括分类。这些图像资产以类似于我们在前几章中向 Watson Studio 项目添加数据资产的过程添加,但也有一些不同之处,我们很快就会看到。

现在,我们将执行以下步骤:

  1. 前往“资产”标签页,在“模型”下点击“新建视觉识别模型”:

截图

  1. 一旦模型创建完成(这应该只需要几分钟),您可以将我们在本章早期部分收集的培训(.zip)文件浏览到或拖放到新项目中以添加它们。这将上传图像文件到云对象存储COO),使它们可用于我们的项目:

截图

您不需要单独加载每个图像文件,只需加载三个压缩文件(happy.zipsad.zipnegative.zip)。ZIP 文件应列在先前的截图所示。

虽然您可以上传 ZIP 文件,但 Watson 不会允许这些 ZIP 文件在数据资产页面使用预览功能。但这并不是问题,因为您仍然可以从模型页面预览图像,正如我们很快就会看到的。

为我们的模型创建类别

现在,从默认自定义模型页面,我们需要创建两个类别。按照以下步骤创建模型类别:

  1. 点击“创建类别”。

  2. 为其输入一个类别名称。

  3. 点击蓝色的“创建”按钮:

截图

实际上,我们只需要为这个项目创建两个类别:快乐和悲伤,因为 Watson 已经为我们创建了负面类别。每个模型只有一个负面类别,但您可以根据项目目标需要创建尽可能多的其他类别。

一旦创建了类别,您只需将 .zip 文件拖放到相应的类别中,如下面的截图所示:

截图

如您所见,我们将每个三个 ZIP 文件都拖放到相应的类别面板中。

正如我们在本章前面所述,Watson 预览不支持 zip 图像文件资产;然而,从以下截图所示的默认自定义模型页面,我们可以点击所有图片并滚动查看已加载的文件名、标签和内容:

图片

自动标注

在本章前面,我们指出,在收集用于表情分析和识别的图像后,每个单独的图像都必须被标注或标记为属于哪个情感组。这可能是一项艰巨的任务。幸运的是,当使用 IBM Watson Studio 时,你只需将适当的图像包含在一个 ZIP 文件中,并将 ZIP 文件拖放到一个类别上,Watson 就会自动标记图像文件。例如,在以下截图中,你可以看到我们可以正确识别那些属于我们快乐类别的图像(用绿色轮廓表示),而单个图像sad05(用红色轮廓表示)不属于,应该从我们的 ZIP 文件中排除:

图片

这是一个相当简单的过程,但它可能会引起错误。由于它简单快捷,你可能会错误地包含会稀释训练样本的图像。记住,即使图像文件命名直观,如快乐或悲伤,Watson 并不关心这些名称,它只是将文件中的所有图像标记为正面匹配到类别。

最后,还有关于训练数据的另一个注意事项。一旦你费心收集和上传数据作为 IBM Watson Studio 资产,这些数据将可用于任何你的项目,如果你愿意,你可以与任何其他 Watson Studio 用户共享!这促进了跨项目和用户之间的资产开发,并增加了你的投资回报率。

学习表情分类器

一旦你注意到模型状态(在默认自定义模型页面的右上角指示)已更改为“模型准备训练”,然后你可以点击“训练模型”按钮开始在我们提供的训练图像上训练 Face 模型:

图片

由于我们只提供了大约 30 个训练图像,训练过程应该不到 5 或 10 分钟。在训练过程中,你将无法对模型或类别进行任何更改。

评估表情分类器

一旦模型训练完成,你应该会看到以下训练成功的消息:

图片

从这个点开始,你可以点击弹出窗口中的此处超链接来查看和测试模型。

查看模型训练结果

在成功训练模型后,你将被重定向到一个页面,你可以看到模型构建的概述或摘要(模型 ID、状态和其他元数据):

图片

我们还可以查看我们模型的类别信息:

图片

测试模型

要测试和了解我们的模型表现如何(或者它是否真的工作!),您可以在上一页视图的测试标签页上传图像。让我们试试!

要使用图像进行测试,请点击测试:

图片

就像我们收集快乐和悲伤图像一样,我们可以识别出一些随机图像(不考虑图像中显示的表情)来测试模型检测表情的能力:

图片

测试分数

我们的模型旨在解释前面的图像,进行一些表情分析,然后根据图像是快乐表情还是悲伤表情进行分类。此外,模型应为每个定义的类别(除了负类别)生成并显示一个分数。

正如您在我们模型中看到的那样,我们定义了两个要分类的类别——快乐和悲伤。对于每个测试图像,模型应显示一个百分比分数,显示检测到的表情是快乐还是悲伤的百分比。例如,以下分数表明有大约 90%的可能性,所识别的表情是快乐的:

图片

测试模型

要使用以下图像测试模型,我们可以简单地将图像文件拖放到前面的页面上,让分类器分析它们:

图片

还请查看以下截图:

图片

成功!看起来我们的四个随机面孔都被我们的面部模型正确评估和评分了。我们可以看到,在前两张图像中,模型表示有 11%和 90%的可能性认为个体是快乐的和悲伤的。

改进模型

尽管我们的解决方案看起来运行正确,但我们仍需记住,模型是在非常少量的数据上训练的。

要改进模型,从默认自定义模型页面,您可以点击标有“编辑和重新训练”的蓝色按钮:

图片

这将使我们的项目可编辑。

更多训练数据

对我们的解决方案的一些改进包括向快乐和悲伤组添加更多图像。为此,您可以创建一个新的 ZIP 文件,包含新的和额外的图像,并将其上传到 IBM Watson Studio(与本章前面所做的方式相同),上传文件,并将新的 ZIP 文件拖放到相应的类别中。Watson 将添加新的图像(而不会覆盖已定义的内容):

图片

添加更多类别

我们解决方案的另一个重大改进是添加额外的类别。这是为了让我们的模型能够支持检测除了快乐和悲伤之外的第三种情感或表情。让我们尝试添加愤怒作为我们的第三个(不计负面)类别:

  1. 当然,第一步是收集和压缩(zip 文件)我们的愤怒图像训练数据:

图片

记住,单个图像文件的名字并不重要,重要的是它们都代表相同的情感,愤怒

  1. 在我们上传了angry.zip文件(作为我们项目可用的另一个数据资产)之后,我们就可以继续点击创建一个类别,输入angry作为类别名称,然后点击创建:

图片

片刻之后,我们新的angry类别就准备好了:

图片

  1. 现在,我们可以再次点击训练模型按钮,开始使用我们提供的训练图像以及我们新的愤怒类别重新训练面部模型。片刻之后,我们应该再次看到模型已训练的消息:

图片

结果

再次,我们可以前往默认自定义模型页面,点击测试选项卡,并投放一些新的测试图像供模型评估和分类:

图片

您可以看到模型已经正确地将第一张图像分类为 0.77 愤怒。我们还对一张之前的图像进行了回归测试,模型再次正确地将其分类(为 0.66 快乐)。

注意,现在我们的模型为每个测试图像提供了三个分数:愤怒、快乐和悲伤,对应于我们模型定义的每个类别:

图片

摘要

在本章中,我们探讨了表情分析和检测背后的概念,并使用 IBM Watson Studio、Watson 视觉识别服务和默认的面部模型构建、训练和测试了一个几乎零编程的端到端、可工作的视觉表情分类解决方案!

在下一章中,我们将发现使用 IBM 云平台上的机器学习自动分类岩相形成。

第九章:使用机器学习自动分类岩性形成

在本章中,我们将探讨构建一个端到端基于云的机器学习系统来根据井日志测量识别岩性的想法。这是所有钻井应用中的关键步骤。首先,我们将从介绍问题和数据集开始。接下来,我们将解释此类用例所需的预处理和后处理类型。最后,将使用机器学习服务、Python 和 IBM Watson Studio 构建一个完整的解决方案。

本章将涵盖以下主题:

  • 理解岩性

  • 探索数据

  • 训练分类器

  • 评估分类器

理解岩性

通过水、冰和风搬运的沉积物沉积和固结形成的沉积岩通常呈层状沉积。这些层的地质特性取决于多种力量,如构造、海平面、沉积物供应、沉积物搬运和沉积的物理和生物过程,以及气候。这些力量和相互作用的结果形成了所谓的几何排列,构成了一个地区的地层结构。通过岩性分析和对沉积环境的解释,可以识别出结构内部沉积体的排列或内部解剖结构。

收集和解释这些信息是石油和天然气、地下水、矿产和地热勘探工作中的关键组成部分(同时也是环境与岩土工程研究的重要部分)。

沉积环境

之前提到的沉积环境是由各种物理和生物过程搬运和沉积沉积物所形成的。这些过程导致各种粒度分布和生物成因沉积结构,这些结构通过直接关系表征(或分类)沉积物,与产生它们的沉积力有关。

将在环境结构中发现的特征与创造它们的力联系起来是地质学家用来解释沉积岩系沉积环境的基本方法。

岩性形成

岩性分析(因此是岩性形成)的进展中,非常早期的步骤之一是对可用和传统核心数据的描述和解释。

核心描述的一个重要结果是核心被细分为岩性,定义为基于岩石学(岩石特性的研究)、粒度、物理和生物成因沉积结构以及与产生它们的沉积过程相关的层序的沉积岩系分类

岩性及其岩性组合(相关岩性的群体)是解释沉积环境的基元。

我们的使用案例

我希望您在阅读本章前面的部分后,已经形成了这样的想法:在评估钻井应用机会的关键组成部分是岩性和岩性形成。

在这个项目中,我们的目标是使用机器学习来解释岩心数据并识别岩性(即,根据其物理特性、成分、形成或各种其他属性,将岩石或岩石类型分类为指定地层单元的可绘制单元)。

探索数据

在接下来的章节中,我们将探索测井训练数据并以各种形式绘制学习过程。

测井

测井,有时被称为钻孔测井,是详细记录(或测井)通过钻孔或井渗透的地质构造的实践。这个记录可以是通过对带到地面的样品进行视觉检查(称为地质测井)或通过将仪器降入孔中进行的物理测量(称为地球物理测井)来建立的。

地球物理测井,如钻井、完井、生产或废弃,可以在测井历史的任何阶段进行。

测井 ASCII 标准(LAS)

幸运的是,有一个普遍接受的格式,其中测井被期望以这种格式。

LAS 是石油和天然气以及水井行业使用的行业标准文件格式,用于记录和存储测井信息和数据。单个 LAS 文件只能包含一个井的数据。但在那个井中,它可以包含任何数量的数据集(称为曲线)。在 LAS 文件中常见的曲线可能包括自然伽马、旅行时间、电阻率测井和其他可能的信息。

关于 LAS 文件更详细的信息,您可以参考这篇论文:www.bcogc.ca/node/11400/download

哇!虽然不是火箭科学,但数据并非简单的关系表。这个练习的初步工作将是更好地理解提供的数据的具体细节。

在本章中,我们的目标是使用 Python 中的scikit-learn实现机器学习算法,这是 Python 中最受欢迎的机器学习工具之一,基于样本测井数据集来训练一个分类器,以区分不同类型的岩性。

假设我们被告知训练日志数据集是从样本日志创建的,并且基于定义八个不同岩性的研究,以及各种测井测量,如伽马射线、中子孔隙率、光电因子PeF)和电阻率。

我们还知道,在这个文件中,我们将有六个岩性数据点(GCRNPHIPEPEFILDILM),以及一个 ID 和岩性类型。

以下截图显示了实际测井文件顶部部分的一小部分:

图片

以下截图是我们文件的一部分的预览,我们将用它来训练我们的机器学习模型。此文件排除了顶部的 LAS 格式化部分标题,而是一个连续的曲线或测井测量的列表:

图片

加载数据资产

我们将假设你已经创建了一个新的 IBM Watson Studio 项目,因此,你可以继续向其中添加一个数据资产(我们的井样本测井文件)以便我们可以处理这些数据。我们在前面的章节中已经加载了数据文件,但这里是一个快速回顾:

  1. 从新项目的“资产”页面,点击“添加到项目”|“数据”

  2. 在打开的“加载”面板中,浏览到文件。请记住,你必须停留在该页面上,直到加载完成。

  3. IBM Watson 然后将文件保存在与你的项目关联的对象存储中,它们在项目的“资产”页面作为数据资产列出。

数据资产注释

当你在 IBM Watson Studio 中构建你的资产时,强烈建议你在加载它们的时候花时间注释你的数据资产。这将允许你快速搜索和定位这些资产,以便与他人协作,并在其他项目中使用。你可以通过简单地添加描述和一到多个标签到你的资产来实现这一点。

标签是简化搜索你的资产的元数据。标签由一个包含空格、字母、数字、下划线、破折号以及#和@符号的字符串组成。你可以在同一资产上创建多个标签,通过使用逗号分隔各个标签值。

从项目页面,在“数据资产”下,你可以点击资产名称:

图片

接下来,点击“标签”框内部以添加标签,你可以手动分配业务术语和标签到数据,以及描述,如以下截图所示:

图片

数据分析

了解你的数据提供的内容的另一种方法是创建数据的配置文件,使用 IBM Watson Studio 中的配置文件功能。

数据资产的配置文件包括关于数据文本内容的生成元数据和统计信息,以便你可以“看到”它是如何构成的。你可以在项目的配置文件页面上创建配置文件,如以下截图所示:

图片

一旦你点击“创建配置文件”,IBM Watson 将审查数据并生成你可以滚动查看并轻松检查的视觉图表:

图片

根据数据的大小和复杂性,生成配置文件可能需要几分钟。好消息是,一旦创建,它就会与文件一起保存,因此不需要再次生成。

使用笔记本和 Python 代替

而不是使用分析器,您可以使用 IBM Watson 笔记本中的可视化来直观地展示数据,以识别模式、获得见解并基于您项目的目标或假设做出决策。正如我们在前面的章节中所看到的,许多开源可视化库,如matplotlib,已经预安装在 IBM Watson Studio 中供您使用,您只需导入它们即可。

您可以使用相同的方式安装其他第三方和开源可视化库和包,或者利用 IBM 的其他可视化库和工具,如Brunel,通过简单的代码创建交互式图表,以及使用 SPSS 模型创建交互式表格和图表,以帮助评估和改进预测分析模型。

在接下来的几节中,我们将使用笔记本和 Python 命令来展示分析和处理数据的各种方法。

加载数据

由于我们假设我们已经创建了一个新的 IBM Watson Studio 项目,我们可以继续向项目中添加一个新的笔记本(从您的项目,点击添加到项目 | 笔记本,就像我们在前面的章节中所做的那样,只是确保指定语言为 Python)。让我们看看以下步骤:

  1. 加载并打开文件,然后打印前五条记录(来自文件)。回想一下,为了完成这项任务,不需要编写代码。

  2. 您只需点击插入代码,然后在文件 | 数据资产面板中插入我们的文件:

图片

这将在我们的笔记本的第一个单元中自动生成以下代码,该代码将我们的数据文件加载到 pandas DataFrame 对象(df_data_1)中,然后打印文件的前五条记录:

图片

上述代码为我们生成了以下输出:

图片

从这次回顾中,我们可以看到数据集的每一行代表一个岩性层,它们分别由我们表格的列中的几个特征表示(如前面的截图所示)。

使用 Python 的print.shape函数,我们看到我们有180个岩性层(文件中的记录数)和8个数据集中的特征:

图片

  1. 我们还可以使用.unique()函数来证明我们的数据集中有八种不同的岩性层类型:

图片

  1. 接下来,我们可以使用.size()函数来查看每个岩性层在文件中的表示情况。数据显示,数据在2225之间比较均衡,其中Mdst/Mdst-Wkst岩性层的分布最不均衡,有16个:

图片

可视化

您可以使用 Python 创建基于岩性层大小的条形图;这使理解变得更容易,如下面的截图所示:

图片

箱线图

经常用于执行解释性数据分析,箱线图是一种用于显示和理解分布形状、中心值及其变异性的图表。查看我们测井数据中每个数值变量的箱线图将使你更好地了解输入变量的分布,如下面的截图所示:

图片

直方图

直方图用于图形化地总结和显示数据集中数据点的分布。

使用以下 Python 代码,我们现在可以尝试对数据中的每个数值输入值进行直方图分析(GCRILDILMNPHIPEPEF):

import pylab as pl
df_data_1.drop('lito_ID' ,axis=1).hist(bins=30, figsize=(10,10))
pl.suptitle("Histogram for each numeric input variable")
plt.savefig('lithofacies_hist')
plt.show()

这将给出以下输出:

图片

一旦从数据中生成直方图,通常会被问到的第一个问题是直方图的形状是否为正态分布。正态分布(数据)的一个特征是它是对称的。这意味着如果分布被切成两半,每一侧将是另一侧的镜像,形成一个钟形曲线,如下面的截图所示:

图片

从我们生成的直方图中,也许NPHI数据点最接近于显示正态分布。

散点矩阵

散点矩阵是另一种常见的分析工具,因为它包括了变量在矩阵格式中的多个成对散点图。它也用于验证变量是否相关以及相关性是正还是负。

以下代码可用于尝试此类可视化:

from pandas.tools.plotting import scatter_matrix
from matplotlib import cm
feature_names = [ 'GCR', 'NPHI', 'PE', 'ILD', 'ILM']
X = df_data_1[feature_names]
y = df_data_1['lito_ID']
cmap = cm.get_cmap('gnuplot')
scatter = pd.plotting.scatter_matrix(X, c = y, marker = 'o', s=40, hist_kwds={'bins':15}, figsize=(9,9), cmap = cmap)
plt.suptitle('Scatter-matrix for each input variable')
plt.savefig('lithofacies_scatter_matrix')

这将给出以下输出:

图片

散点图试图揭示变量(称为相关性)之间的关系或关联。有关散点图的更多信息,请参阅以下链接:

mste.illinois.edu/courses/ci330ms/youtsey/scatterinfo.html

观察从我们的测井数据生成的散点图(如前一个截图所示),我实在看不到数据之间有任何特定的或直接的相关性。

在这一点上,你可以继续深入数据,进行一些重组或聚合,甚至可能回到原始数据源并请求额外的或新的数据。

为了节省时间,在这个练习中,我们将假设我们将使用我们拥有的数据,并继续创建和测试各种建模算法。

训练分类器

scikit-learn库可用于编写机器学习分类器,并且是唯一具有四步建模模式的 Python 库。

有关sckit-learn的更多信息,请参阅以下链接:www.jmlr.org/papers/volume12/pedregosa11a/pedregosa11a.pdf

实现 scikit-learn 模型的编码过程适用于sklearn中的各种分类器,如决策树、k 近邻KNN)等。我们将在这里查看一些这些分类器,使用我们的测井数据。

使用 Scikit 构建模型的第一个步骤是创建训练集和测试集,并应用缩放,以下 Python 代码行展示了这一过程:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

现在我们已经创建了训练集,我们可以使用这些数据来构建各种类型的机器学习模型。通常,在一个特定的机器学习项目中,你会有一些关于你想要使用的机器学习算法类型的想法,但也可能没有。无论如何,你想要验证所选算法(们)的性能。

以下部分展示了使用scikit-learn模块创建模型的 Python 命令。

构建逻辑回归模型

回归分析用于理解哪些独立变量(我们的特征:GCRNPHIPEILDILM)与因变量相关;即岩性 facies 类型。

以下 Python 代码行创建了一个逻辑回归分类器模型并打印了其准确率统计信息:

图片

构建 KNN 模型

KNN 算法是一种简单、有监督的机器学习算法,也可以用于分类和回归问题。

以下 Python 代码行创建了一个 KNN 分类器模型并打印了其准确率统计信息:

图片

构建高斯朴素贝叶斯模型

给定类变量,所有朴素贝叶斯分类器都推断出数据中特定特征的价值与任何其他特征的价值无关。

以下 Python 代码行创建了一个高斯朴素贝叶斯GaussianNB)分类器模型并打印了其准确率统计信息:

图片

构建支持向量机模型

支持向量机SVM)是一个有监督的学习模型,它关联的学习算法用于分类和回归分析。

以下 Python 代码行创建了一个 SVM 分类器模型并打印了其准确率统计信息:

图片

构建决策树模型

决策树是一种决策支持工具,它使用决策及其可能后果的树状模型,包括随机事件结果、资源成本和效用。

以下 Python 代码行创建了一个决策树分类器模型并打印了其准确率统计信息:

图片

总结一下

再次强调,如果我们正在处理一个真实的项目,这一步或项目阶段将包括对每个模型性能结果的更深入审查,甚至可能需要决定返回数据探索和转换阶段。然而,为了节省时间,我们将继续前进。

由于我们已经看到了一些创建和至少从表面上看判断每个模型性能(就准确度而言)的简单方法,我们将继续本章的最后部分,并查看一个使用 Python 命令可视化所选模型的示例。

评估分类器

在每次模型构建后打印的输出中回顾,我们应该注意到决策树模型具有最佳结果之一:

Accuracy of Decision Tree classifier on training set: 0.99 
Accuracy of Decision Tree classifier on test set: 0.00

类似于免责声明

通常,我们会花更多的时间评估和验证所选模型(并持续训练它),但再次强调,你得到了一个大致的概念(还有很多尽职调查工作要做!),我们的目标更多是展示使用 IBM Watson Studio 及其资源构建端到端机器学习解决方案的步骤。

考虑到这一点,我们现在将使用一些 Python 代码来创建我们模型的可视化。

理解决策树

决策树算法是非常常用的监督学习算法模型,用于分类和回归任务。在本节中,我们将展示如何可视化决策树分类器,以便更好地理解其逻辑。

决策树分类器通过使用一系列简单的 if/else 规则对数据进行建模,然后通过这些规则预测目标值。

由于其结构和我们可以使用如sklearn export_graphviz函数等模块可视化的建模树的能力,决策树通常更容易解释。

以下标准的 Python 代码可以用来可视化我们在笔记本中之前构建的决策树模型:

!pip install graphviz
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn import tree
from sklearn.datasets import load_wine
from IPython.display import SVG
from graphviz import Source
from IPython.display import display

# feature matrix
feature_names = [ 'GCR', 'NPHI', 'PE', 'ILD', 'ILM']
X = df_data_1[feature_names]

# target vector
y = df_data_1['lithofacies']

# print dataset description
estimator = DecisionTreeClassifier()
estimator.fit(X, y)

graph = Source(tree.export_graphviz(estimator, out_file=None
   , feature_names=labels
   , filled = True))
display(SVG(graph.pipe(format='svg')))

示例代码可以在towardsdatascience.com/interactive-visualization-of-decision-trees-with-jupyter-widgets-ca15dd312084找到。

以下截图显示了在笔记本中执行的代码及其创建的图形输出(尽管这很难放入一个单独的截图):

很少有人允许这样做。

摘要

在本章中,我们介绍了一个实际案例,在评估钻井日志以分类岩性时使用。

我们加载了一个样本文件,进行了各种配置文件和可视化练习,比较了 Watson 配置文件,并在笔记本中使用 Python 命令。最后,我们使用专门的 Python 库构建了各种类型的模型,并展示了一个监督机器学习算法的图表。

在下一章中,我们将构建一个基于云的多生物识别身份验证平台。

第十章:构建基于云的多生物识别身份认证平台

在本章中,我们将使用IBM Watson Studio,通过构建一个基于云的人类识别系统来展示如何使用生物识别特征。我们首先介绍生物识别,并考虑我们所说的生物识别数据是什么。然后,我们将解释每种生物识别所需的预处理类型。此外,我们将了解如何从生物识别数据中提取有意义特征的过程。最后,我们将涵盖多模态数据融合的概念。

本章将涵盖以下主题:

  • 理解生物识别

  • 探索生物识别数据

  • 特征提取

  • 生物识别识别

  • 多模态融合

  • 我们的示例

理解生物识别

如果我们从单词本身开始分解,生物识别这个词来源于希腊语单词bio(生命)和metrics(测量),因此生物识别与将统计分析应用于生物数据的应用相关。

生物识别验证是指通过评估一个(或多个)区分性生物特征来唯一识别某人的过程。

在生物识别验证过程中通常使用的唯一标识符包括以下内容:

  • 指纹

  • 手部几何形状

  • 耳垂几何形状

  • 视网膜/虹膜图案

  • 语音(波)

  • DNA

  • 签名

对于我们这些《法医档案》粉丝来说,最古老的生物识别验证形式之一是指纹识别。您可以参考以下链接中的文章,了解更多关于第一个法医档案是如何实施的信息:onin.com/fp/fphistory.html

随着技术的进步,生物识别验证和认证得到了显著的发展,例如模拟数据的数字化(更不用说 IBM Watson 了!),现在可以实现几乎瞬时的个人识别。

虽然可能很明显,生物识别认证过程使用物理特征(指纹识别)来数字化识别(或验证)一个人,但更先进的解决方案也可能利用人类的行为特征(如语音节奏)。

这些(特征)被认为对特定个人是独特的,因此它们可以组合使用(关于如何组合标识符将在本章稍后讨论)以确保更高的识别准确性。

建立案例

为什么生物识别验证如此引人关注?

答案是,在一个瞬间和越来越互联网化的世界中,密码验证速度慢,坦白说,根本不够好(不够强大)。

根据最近的流行观点(4 reasons why biometric security is the way forward, Digitial Biometrics, AUG 2015),以下四个原因被认为是生物识别验证之所以如此重要的原因:

  • 物联网的格局正变得越来越复杂

  • 密码不够强大

  • 生物识别安全更高效

  • 越来越多的公司和机构正在采用生物识别技术

几乎我们每个人都需要创建或选择一个密码,并且被告知所选短语是弱的或不够强大。一个弱密码是指人类或自动化过程都容易检测到的密码。

人们经常使用可猜测的密码,如孩子的名字或房子的号码(这样就不会忘记密码),但密码越简单或越弱,就越容易被检测或复制。

生物识别认证是一种更有效的证明身份或验证某人的方法,因为它不能被模拟或复制,而且黑客几乎不可能操纵认证过程,即使使用恶意软件和其他病毒。

流行用例

一些目前实际应用生物识别认证技术的领域包括以下内容:

  • 边境和移民

  • 劳动力管理

  • 犯罪识别

  • 机场安全

  • 时间管理和考勤

  • 公安执法

  • 访问控制和单点登录SSO

  • 银行

所有迹象都表明,这项技术将继续增长和成熟,正如 M2SYS Technology 的 John Trader 在文章《全球生物识别技术的应用》中所展示的(www.m2sys.com/blog/biometric-hardware/top-5-uses-biometrics-across-globe/amp/)。

从财务角度来看,根据安全行业协会SIA)的数据,仅在美国,电子访问控制市场的规模预计在 2019 年将超过 447 亿美元(从 2014 年的略超过 30 亿美元增长而来)。

为了进一步证明生物识别认证的合理性,一篇在线文章《千禧一代加速密码时代的终结》(2018 年 1 月 29 日,作者 Limor Kessem),我们看到尽管密码使用并不流行,但在登录应用程序时,安全性是用户最关心的问题(securityintelligence.com/new-ibm-study-consumers-weigh-in-on-biometrics-authentication-and-the-future-of-identity/)。

隐私问题

随着生物识别技术的便利性和安全性,隐私问题也引起了关注。为了使任何生物识别认证解决方案正常工作,它需要一个数据库,包含每个要被系统识别和授权的个人的相关信息。这意味着每个用户的生物识别签名都必须被记录,以便解决方案可以使用这些信息来验证每个人的身份。保护、道德使用和治理这些信息变得至关重要。

除了上述内容外,由于生物系统的本质,它们还收集比用户的指纹、视网膜模式或其他生物数据更多的信息。在基本层面上,大多数系统会记录个人在身份验证时的时间和地点。这也导致了关于如何以及在哪里可能使用这些信息的担忧。

关于这个特定主题的一些最后的话:一项最近的法院裁决强调了在收集和使用生物数据之前提供(事先)通知的重要性。处理生物数据时要小心:违反法律很可能会导致你或你的公司被起诉。

生物认证解决方案的组件

构成生物认证解决方案的组件包括以下内容:

  • 用于捕获生物信息的传感器或其他设备

  • 数据存储以保存生物数据

  • 机器学习匹配算法

  • 决策处理器或如何处理前三个步骤的结果

在下一节中,我们将开始探索生物数据。

探索生物数据

在阅读本章前面的部分,并希望理解在解决方案中使用生物数据的目的和机会之后,下一步是至少在概念上构建解决方案的概述。

当使用生物信息进行身份验证时,我们会看到以下情况:

  • 生物数据的收集:此步骤使用某种输入设备来捕获生物数据。此信息的输入通常被称为生物扫描。这种扫描可能是指纹、眼睛的虹膜、语音提示或其他形式的生物扫描(相当常见的是,照片是首先使用的生物形式,因为照片易于理解和处理)。

  • 生物数据的转换、标记和存储:通过扫描收集的数据必须随后转换为数字格式,并保存在数据库中,并适当标记。此数据库存储需要由解决方案授权的个人生物数据。

  • 选择和配置机器学习算法:使用匹配算法将新扫描的数据与数字数据库中存储和标记的数据进行比较。一旦匹配,个人就会被验证,然后使用决策逻辑来决定下一步将是什么,例如授予系统或位置的访问权限。

特定个人识别

因此,生物识别涉及通过比较呈现在(或扫描)的生物特征签名与解决方案数据库中已编目和标记的签名来确定特定个人的身份,并做出决定:是否匹配?这可以在以下图表中看到:

图片

生物特征签名可以是来自个人的以下项目之一:

  • 他们的面部照片

  • 他们的声音记录

  • 一张他们的指纹图像

请记住,生物识别数据是一个通用术语,用于指代在生物识别****扫描过程中创建的任何数据。

除了之前提到的,这种生物识别数据还可能包括任何样本、模型、指纹、相似度得分,以及包括个人姓名和人口统计数据的所有验证或识别数据。

个人签名中还可以包括掌纹、面部识别、DNA、掌印、手部几何形状、虹膜识别、视网膜和气味/香味。此外,与个人行为模式相关的行为特征(例如,他的步态或打字节奏)也可能成为生物识别数据库的一部分。

还应该注意的是,由于生物识别数据是数字格式,它可以被计算机系统高效处理,并且可以轻松加密,以防止未经授权的人员进行不道德的操作和使用。

另一点是,将一组生物识别样本提交给生物识别系统进行身份验证或验证被称为尝试。出于明显的原因,解决方案通常只允许对个人进行一次身份验证或验证尝试。那些在解决方案数据库中没有预先扫描和编目生物识别签名的人的尝试将失败认证。这很重要,因为它减少了解决方案工作所需扫描和编目的数据量:你只需要为那些确实需要认证和授权访问的个人建立数字签名。

生物识别数据使用的挑战

收集、编目和使用生物识别数据可能是一个挑战。这种数据形式,像大多数数据一样,容易受到不确定性和变化的影响。也许生物识别数据独有的,我们发现这些信息可能受到个人年龄变化、环境影响、疾病、压力、职业因素、训练和提示、有意改变、发生情境的社会文化方面、人与系统交互的变化等因素的影响。

因此,个人的每次互动或尝试都可能关联到不同的生物识别信息。

样本量确定

在第八章《在 IBM 云上创建面部表情平台》中,我们构建了一个表情分析模型,使用面部图像作为模型训练和检测人类情感(快乐、悲伤和愤怒)的数据。在那个练习中,我们为每种情感选择了 11 张图像的样本量:

指纹图像

在那个练习中,样本量(11)是足够的,因为目标是证明我们的概念。显然,样本量越大,模型越准确。

生物识别认证解决方案基于相同的原理;然而,它不是从尝试中检测情绪,而是将扫描的图像与其目录数据库进行比较,寻找匹配项。由于扫描的图像不会是数据库中的图像,匹配算法必须比较数据库中的图像,并根据其面部识别和评估逻辑检测个体。如果数据库中每个已认证用户的图像只有一张,错误率就会增加。因此,需要多少张图像(对于每个用户)?对于生物识别认证解决方案,最优的样本大小是多少?

生物识别系统性能通常通过从n个不同主体收集生物识别模板(或生物识别签名)来评估,并且为了方便起见,为每个n个主体获取该生物识别的多个实例(例如,照片)。

不幸的是,你很可能会发现,目前关于基于接收者操作特征(ROC)曲线构建置信区域以验证声称的性能水平并确定建立 ROC 曲线预定宽度置信区域所需的生物识别样本数量的工作并不多。

ROC 广泛用于确定预测模型如何区分真阳性和真阴性。为了完成这项任务,模型不仅需要正确地将阳性预测为阳性,还需要将阴性预测为阴性。

特征提取

生物识别特征提取(有时也称为细节提取)是指选择或增强样本的已建立关键特征的过程,以便更有效地处理。通常,特征提取的过程依赖于一套算法,这些算法根据所使用的生物识别识别类型(例如,面部图像或指纹)而变化。

生物识别认证是将从图像(例如,生物特征图像)等转换成可搜索数据集的样本进行匹配。这种转换的过程被称为特征提取。

如果你想要了解特征提取的基本工作原理的例子,你会发现它取决于样本类型,但大部分来说,概念化起来相当简单。你可以访问以下链接了解更多关于生物识别匹配的工作原理:devtechnology.com/2013/11/emerging-biometric-technology-revocable-biometric-features/

一些其他生物识别特征提取的例子也可以参考以下链接中的文章:arindamcctvaccesscontrol.blogspot.com/2010/05/access-control-index-terminology.html

生物识别识别

生物识别认证以及最终的认证成功,依赖于解决方案中选用的机器学习算法的鲁棒性,同时也取决于(正如我们在本章的特征提取部分所讨论的)样本大小。

除了这些要求之外,还需要考虑样本的质量以及类型。例如,图像质量差可能会显著影响生物识别认证的准确性。我们还简要提到了将行为特征作为生物识别签名的一部分。

一般而言,生理特征(例如指纹或面部图像)总是最静态的,随着时间的推移显示出很少的差异,而行为特征(即步态或节奏)可能会并且通常会有变化,可能会受到外部因素或特定情绪条件(如压力或强烈的心理影响)的影响。

一些生物识别认证解决方案已经使用的一些有趣的行为****特征包括声音印记、书写和/或打字风格、身体动作、行走风格和趋势等。

多模态融合

最简单地说,围绕个人财产的关卡越多,它就越安全,因为我们需要具备成功通过多个测试的能力才能继续进行。同样适用于任何基于测试结果(匹配或不匹配)做出继续决策的系统或解决方案。添加额外的测试会产生额外的结果和基于这些结果做出的额外决策。

生物识别认证解决方案通常被认为是单模态(仅进行单一测试)或多模态(进行多个测试):

  • 多模态生物识别认证:这描述了一个实现解决方案,该解决方案利用多个生物识别指标来识别认证的个人,例如照片/图像和签名。需要成功匹配两个生物识别才能成功。

  • 单模态生物识别认证:这描述了一个仅利用单一认证级别的解决方案,例如仅使用照片/图像或签名。在这种情况下,如果解决方案成功匹配到生物识别(例如,图像),则尝试成功。

我们的例子

现在我们已经对生物识别认证解决方案及其工作原理有了概念和理解,我们将尝试构建一个简单但实际可行的原型,使用与我们在第八章,“在 IBM 云上创建面部表情平台”中使用的相同的IBM Watson 视觉识别服务,以及那个项目作为我们新解决方案的指南。

作为提醒,IBM Watson 视觉识别服务能够直接理解图像内容(我们已在我们的第八章,在 IBM 云上创建面部表情平台项目中演示过)。提供的预训练模型使您能够分析图像中的对象、人脸、颜色、食物、显性内容以及其他主题,以深入了解您的视觉内容。我们成功使用该服务检测人脸并确定表情。

前提

基本前提是克隆我们的第八章,在 IBM 云上创建面部表情平台项目,并创建一个或多个类,用作我自己的简单生物特征签名;一个包含 dozen 张我脸的图片,以及一个包含 dozen 张随机人脸的负类(这些人脸中不会有我)。

此外,至少还有一个其他类,设计为另一个个人的生物特征签名。因此,我们预计在本章的项目中,我们将有以下三个类:

  • 吉姆类

  • 第二个人或其他类

  • 负类

最后一步将是使用移动设备拍摄我和其他人的几张照片,不进行任何准备或图像处理,将面部图像提交到我们的项目并记录结果:匹配或不匹配。这些图像提交将被视为我们生物识别认证的尝试。

为了公平地测试项目,我们确保提交几张我自己的照片(这些照片都不会成为模型类定义的一部分,即我的生物特征签名)和几张不是我的脸的照片,并记录每次提交的结果。

最后,我们将评估并记录结果。

数据准备

立即,我们需要有 10 张我脸的样本。这些图片应该是合理的质量,并且为了获得最佳结果,应该在一段时间内拍摄近距离照片,以便算法可以考虑到我外观的变化。

如果您忘记了,可以回顾第八章,在 IBM 云上创建面部表情平台,以了解具体的文件图像要求。

这里是用于创建我的生物特征签名的图片:

图片

接下来,我们需要为另一个人建立生物特征签名(与相同大小的样本):

图片

最后,需要设置 10 张随机人脸的负类(当然,这些是从我们的项目中借用的):

图片

来自 Watson 文档的提醒:创建分类器的调用需要你提供至少两个示例 ZIP 文件:两个正面示例文件或一个正面和一个负面文件。负面示例定义了更新后的分类器不是什么。它不用于在创建的分类器中创建一个类别。负面示例文件将包含不匹配任何正面示例主题的图像。在单个调用中,只能指定一个示例。

项目设置

再次假设我们已经创建了一个新的 IBM Watson Studio 项目,现在(就像在第八章,“在 IBM 云上创建面部表情平台”)通过访问资产选项卡下的模型,点击新建视觉识别模型(你可以回到第八章,“在 IBM 云上创建面部表情平台”,快速回顾)。

就像在第八章,“在 IBM 云上创建面部表情平台”,一旦模型创建完成(只需几分钟),你就可以将本章前几节准备的图像.zip文件拖放到模型上。

这将把图像文件上传到云对象存储COO),使它们可用于我们的项目(如下面的截图所示):

图片

从默认自定义模型屏幕(如下面的截图所示),我们准备好构建我们的模型类别:

图片

创建类别

现在,你可以点击创建类别按钮(如下面的截图所示底部左侧)来创建 Jim 和其他类别(记住,负类别已经为你创建好了):

图片

再次,你可以参考第八章,“在 IBM 云上创建面部表情平台”,到“为我们的模型创建类别”部分,以获取创建类别的逐步说明。

训练模型

一旦我们创建了三个类别(并加载了图像),并保存,并且模型状态显示为“准备训练”,我们就可以点击训练模型按钮开始在我们提供的图像上训练模型:

图片

再次强调,这是一个只有 30 个训练图像的小模型;训练过程将不到 5 或 10 分钟。使用 IBM Watson 和服务的美丽之处在于,许多“详细任务”如创建模型定义和训练模型只是简单地“点击按钮”。要了解更多关于训练视觉识别模型的信息,你可以访问:

https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/visual-recognition-train.html?linkInPage=true

一旦模型训练完成,并且您注意到(见以下截图)模型状态显示为“已训练”,您就可以继续:

图片

正如我们在第八章,“在 IBM 云上创建面部表情平台”中做的那样,为了测试和验证我们的模型,我们可以在默认自定义模型页面的测试区域上传图片,如下截图所示:

图片

测试我们的项目

正如我们计划的那样,我们项目练习的最后一步是使用移动设备拍摄自己和其他人的几张照片,不准备图片,将面部图像提交到我们的项目进行认证并记录结果:匹配或不匹配。

使用我的智能手机,我拍摄了以下三张头像。我试图捕捉到光照和表情的变化:

图片

此外,正如我们之前所述,为了公平地测试我们的项目,我们需要提交几张不是我的脸的图片,并记录每次提交的结果。

对于这些测试对象,我收集了以下内容:

图片

现在是测试时间!

如以下截图所示,我提交了前四张图片:吉姆、吉姆、吉姆和其他。模型正确验证了提交的每一张图片:

图片

这相当不错,对吧?现在我们可以提交第四张和最后一张图片(不是吉姆和不是其他)并放大所有分数:

图片

良好训练的指南

我们现在使用 IBM Watson Studio 和 IBM Watson 视觉识别服务创建了一个简单的生物识别认证概念证明。它可行,但当然这还不是部署状态。在模型准备好部署和生产使用之前,有许多事情需要考虑。例如,视觉识别服务提供的指南指出,在开始实际评估训练结果之前,最好每个类别至少包含 50 张正面图片。

提供的其他建议包括以下内容:

  • 假设您的训练数据质量和内容相似,更多的训练图片通常比更少的图片提供更准确的结果。

  • 每个.zip文件包含 150 到 200 张图片,在处理时间和准确性之间提供了最佳平衡。超过 200 张图片会增加时间,但准确性会下降,而且时间的增加会带来递减的回报。

实现方式

测试标签旁边的实现标签(如下截图所示)。从这里,您可以看到 Watson 为您提供的代码片段,用于将图像与您刚刚构建的模型进行分类:

图片

作为参考,您将需要部署模型的全 API 规范在此处可用:cloud.ibm.com/apidocs/visual-recognition

摘要

在本章中,我们介绍了讨论了在生物识别认证解决方案中收集和使用生物识别数据,以及此类解决方案的工作原理,以及特征提取(就生物识别数据解决方案而言)的多模态融合的想法。最后,我们再次使用 IBM Watson 视觉识别服务,将第八章中提到的表情检测和分析解决方案扩展,即在 IBM Cloud 上创建一个面部表情平台,以创建一个工作的生物识别认证解决方案的概念验证。

下一章将总结本书内容,概述我们已经涵盖的内容。该章节还将对与在 IBM Watson Studio 上开发机器学习系统相关的某些实际考虑因素进行一些说明。

posted @ 2025-09-03 10:08  绝不原创的飞龙  阅读(1)  评论(0)    收藏  举报