Azure-自动机器学习实践指南-全-

Azure 自动机器学习实践指南(全)

原文:zh.annas-archive.org/md5/8c86bde0466afff4dc878c43a10cbf4e

译者:飞龙

协议:CC BY-NC-SA 4.0

序言

我清楚地记得我在大学本科时的第一堂人工智能课程。我父亲多年来一直从事“专家系统”的工作,而我在 MIT 学习如何从最好的人那里学习这种魔术。马文·明斯基,该领域的创始人之一,甚至在那里开设了一系列客座讲座。大约在学期中期时,我深深感到失望:“这只是一堆技巧!”找不到任何“智能”,只有一堆脆弱的规则引擎和巧妙的数学运用。那是在 90 年代初,也是我个人的人工智能寒冬的开始,我当时认为人工智能没有什么用处。

几年后,当我在广告系统上工作时,我终于看到了这些“一堆技巧”中的力量。经过有天赋的工程师们手工调校了几个月的算法,却被简单模型在大量数据支持下击败。我看到即将到来的爆发只需要更多的数据和计算能力才能发挥效果。在过去的 5 到 10 年中,大数据和计算能力的爆发释放出了一个行业,这个行业起起落落。

这一次确实不同。尽管人工智能的炒作依然极高,但实际人工智能的潜在应用才刚刚开始影响商业世界。今天做出预测的规则或人将几乎被人工智能算法取代。人工智能为企业创造的价值是巨大的,从更好地评估油田中的石油价值到更好地预测每款新运动鞋的库存量。即使在这些能力上稍微提升,也代表着跨企业数十亿美元的价值。

我们现在处于人工智能实施的时代。企业正在努力找出在其企业中部署人工智能的最佳位置。其中最大的挑战之一是将炒作与现实相匹配。我与的公司中有一半期望人工智能能够解决一些他们根本不知道如何解决的问题。另一半则低估了人工智能可能具有的力量。他们需要具备足够人工智能背景的人来帮助他们构思可能性,并将其应用到他们的业务问题中。

我与的客户们正在努力寻找具备这些技能的人才。虽然他们有许多熟练并习惯于利用数据进行预测和决策的开发人员和数据分析师,但他们需要能够从这些数据中构建模型的数据科学家。本书将帮助填补这一空白。

它展示了自动化机器学习如何赋能开发人员和数据分析师训练 AI 模型。它强调了多个业务案例,说明了 AI 如何很好地解决业务问题,并展示了如何精确构建模型并将其投入生产。这本书中的技术和理念已经在微软的各个团队中进行了大规模的压力测试,包括必应、Office、Azure 安全、内部 IT 等等。它还被许多使用 Azure 机器学习的外部企业所采用。

Eric Boyd

微软 Azure AI 公司副总裁

2019 年 9 月

前言

本书使用的约定

本书使用以下排版约定:

斜体

指示新术语、URL、电子邮件地址、文件名和文件扩展名。

固定宽度

用于程序清单以及段落内部,用来指代程序元素,如变量或函数名称、数据库、数据类型、环境变量、语句和关键字。

固定宽度加粗

显示用户应按照字面意义键入的命令或其他文本。

固定宽度斜体

显示应由用户提供值或由上下文确定值的文本。

小贴士

这个元素表示一个提示或建议。

注意

这个元素表示一般提示。

警告

这个元素表示警告或注意事项。

使用代码示例

补充材料(代码示例、练习等)可在 https://oreil.ly/Practical_Automated_ML_on_Azure 下载。

本书旨在帮助您完成工作。一般来说,如果此书提供了示例代码,您可以在自己的程序和文档中使用它们而无需联系我们。除非您复制了大量代码,否则无需取得许可。例如,编写一个使用本书多个代码片段的程序不需要许可。销售或分发包含奥莱利书籍示例的 CD-ROM 需要许可。引用本书并引用示例代码回答问题不需要许可。将本书大量示例代码整合到产品文档中需要许可。

我们感谢您的使用,但不要求署名。署名通常包括标题、作者、出版商和 ISBN 号。例如:“在 Azure 上实现自动化机器学习实践,作者 Deepak Mukunthu、Parashar Shah 和 Wee Hyong Tok(奥莱利)。版权所有 2019 年 Deepak Mukunthu、Parashar Shah 和 Wee Hyong Tok,ISBN 号 978-1-492-05559-4。”

如果您认为您使用的代码示例超出了公平使用范围或上述许可,请随时通过 permissions@oreilly.com 联系我们。

致谢

感谢这些人士的伟大贡献,没有他们,本书将无法完成–谢谢

我们感谢在 Microsoft(Azure AI 产品、市场营销和其他许多团队)的同事们共同努力,以提供最佳的企业就绪 Azure 机器学习服务。

Nicolo Fusi,分享了关于自动化机器学习创建的研究细节(第二章)。

Sharon Gillett,为《自动化机器学习介绍》(第二章)提供文本输入。

Vanessa Milan,负责《自动化机器学习介绍》(第二章)的图片。

Akchara Mukunthu,为机器学习任务检测的示例场景(第二章表 2-1)提供了例子。

Krishna Anumalasetty 和 Thomas Abraham,负责本书的技术审查。

Jen Stirrup,为本书提供反馈意见。

了不起的 O’Reilly 团队(Nicole Tache、Deborah Baker、Bob Russell、Jonathan Hassell、Ben Lorica 等等),从概念到生产与我们合作,使我们有机会撰写并与社区分享本书。

Azure 机器学习和 Azure CAT 团队的成员,在支持的环境下使作者们能够在业余时间、许多周末和节假日中撰写本书。

第一部分:自动化机器学习

在这一部分,你将学习自动化机器学习如何帮助自动化模型开发。

第一章:机器学习:概述与最佳实践

人类与机器有哪些不同?有很多差异,但这里有一个重要的区别:人类通过经验学习,而机器遵循给定的指令。如果机器也能从经验中学习呢?这就是机器学习的要点。对于机器来说,“过去的数据”在逻辑上相当于“经验”。机器学习结合了统计学和计算机科学,使机器能够学习如何执行给定任务,而无需通过指令显式编程。

今天机器学习被广泛应用,并且我们每天都与之交互。以下是一些例子来说明:

  • 像必应或谷歌这样的搜索引擎

  • 像亚马逊或 eBay 这样的在线商店的产品推荐

  • Netflix 或 YouTube 的个性化视频推荐

  • 像 Alexa 或 Cortana 这样的基于语音的数字助理

  • 我们邮箱收件箱的垃圾邮件过滤器

  • 信用卡欺诈检测

为什么机器学习作为一个趋势发展得如此之快?为什么每个人现在都对它如此感兴趣?如图 1-1 所示,其流行性源自三大关键趋势:大数据、更好/更便宜的计算能力和更智能的算法。

paml 0101

图 1-1. 机器学习的增长

在本章中,我们通过一个现实世界的例子快速回顾机器学习,讨论一些区分成功的机器学习项目与其他项目的最佳实践,并以生产力和规模方面的挑战结束。

机器学习:简明回顾

构建机器学习模型的过程是怎样的?让我们通过一个真实的场景深入探讨:房价预测。我们有过去的房屋销售数据,任务是预测刚刚进入市场且当前不在我们数据集中的某个房屋的销售价格。

为简单起见,假设房屋的大小(平方英尺)是确定房屋价值最重要的输入属性(或 特征)。如表 1-1 所示,我们有来自四个房屋 A、B、C、D 的数据,需要预测房屋 X 的价格。

表 1-1. 基于大小的房价

House Size (sq. ft) Price ($)
A 1300 500,000
B 2000 800,000
C 2500 950,000
D 3200 1,200,000
X 1800 ?

我们从图 1-2 中可以看出,将 尺寸 放在 x 轴上,价格 放在 y 轴上进行绘制。

paml 0102

图 1-2. 绘制价格与尺寸的关系

房屋 X 的最佳价格估计是多少?

  • $550,000

  • $700,000

  • $1,000,000

让我们来弄清楚。如图 Figure 1-3 所示,基于数据绘制的四个点形成了几乎直线。如果我们画出最能匹配我们数据的直线,我们就可以找到与房屋 X 相关联的直线上的正确点,即 x 轴上的点和对应的 y 轴上的点,这将给我们一个价格估计。

paml 0103

图 1-3. 创建直线以找到价格估计

在这种情况下,这条直线代表我们的模型,并展示了线性关系。线性回归 是一种用于建模输入变量(也称为特征独立变量)与输出变量(也称为目标依赖变量)之间线性关系的统计方法。数学上,这种线性关系可以表示为:

y = β0 + β1x

其中:

  • y 是输出变量;例如,房价。

  • x 是输入变量;例如,平方英尺的大小。

  • β0 是截距(当 x = 0 时 y 的值)。

  • β1x 的系数,是回归线的斜率(“与 x 单位增加相关的 y 的平均增加量”)。

模型参数

β0β1 被称为这个线性回归模型的模型参数。在实现线性回归时,算法通过使用模型参数 β0β1 来找到最佳拟合直线,使其尽可能接近实际数据点(最小化每个实际数据点与表示模型预测的直线之间的平方距离)。

图 Figure 1-4 在概念上展示了这一点。圆点代表实际数据点,直线代表模型预测。d1d9 表示数据点与相应模型预测之间的距离,D 是它们平方的和。图中显示的线是最佳拟合回归线,最小化了 D

paml 0104

图 1-4. 回归

正如您所见,模型参数 是模型的一个重要部分,并决定了结果。它们的值通过模型训练过程从数据中学习而来。

超参数

还有另一组被称为超参数的参数。模型超参数在模型训练过程中用于确定模型参数的正确值。它们是模型外部的,其值不能从数据中估计得出。超参数的选择将影响训练的持续时间和预测的准确性。作为模型训练过程的一部分,数据科学家通常根据启发式方法或知识指定超参数,并经常手动调整超参数。超参数调整更多地依赖于实验结果而不是理论,因此确定最佳设置的最佳方法是尝试多种组合并评估每个模型的性能。

简单线性回归没有任何超参数。但是线性回归的变种,如岭回归和Lasso,则有。以下是各种机器学习算法的模型超参数示例:

  • k-最近邻中的k

  • 决策树中所需的深度和叶子节点数

  • 支持向量机(SVM)中的 C 和 sigma

  • 神经网络训练的学习率

机器学习项目的最佳实践

在这一部分,我们探讨使机器学习项目成功的最佳实践。这些是大多数公司和团队通过经验学习到的实用建议。

理解决策过程

基于机器学习的系统或过程使用数据驱动业务决策。因此,理解需要解决的业务问题至关重要,而不受技术解决方案的影响——换句话说,需要通过数据来进行决策或采取行动。清楚地了解决策过程至关重要。有时,这一步骤也被称为将业务场景/问题映射到数据科学问题

对于我们的房价预测场景,对于一个购房者来说,关键的业务决策是“我是否应该以标价购买某个房屋?”或者“对于这栋房屋,什么是一个好的竞标价格以最大化我赢得竞标的机会?”这可以映射到数据科学问题:“基于其他房屋过去销售数据,房屋价格的最佳估计是什么?”

表格 1-2 展示了其他真实业务场景以及该决策过程的外观。

表格 1-2. 理解决策过程:真实场景

业务场景 关键决策 数据科学问题
预测性维护 我应该为这台设备提供服务吗? 这台设备在接下来的x天内会出现故障的概率是多少?
能源预测 我应该买还是卖能源合同? 区域内能源的长期/短期需求会是多少?
客户流失 我应该优先考虑哪些客户以减少流失? 每位客户在x天内流失的概率是多少?
个性化营销 我应该首先提供哪种产品? 客户购买每种产品的概率是多少?
产品反馈 哪个服务/产品需要关注? 每种服务/产品的社交媒体情感是什么?

确立性能指标

与任何项目一样,性能指标对于引导任何机器学习项目朝着正确的目标前进并确保取得进展至关重要。在我们理解决策过程之后,下一步是回答这两个关键问题:

  • 我们如何衡量朝着目标或期望结果的进展?换句话说,我们如何定义评估进展的指标?

  • 什么被认为是成功?也就是说,我们如何定义指标的目标?

对于我们的房价预测示例,我们需要一个度量标准来衡量我们的预测与实际价格的接近程度。有很多度量标准可供选择。对于回归任务中最常用的度量标准之一是均方根误差(RMSE)。其定义为实际分数与预测分数之间的平方距离的平方根,如下所示:

RMSE = 1 n j=1 n (y j -y ^ j ) 2

这里,y[j] 表示第 i 个数据点的真实值,ŷ[j] 表示预测值。理解这个公式的一种直观方法是它是真实值向量与预测值向量之间的欧几里得距离,再除以n,其中n是数据点的数量的平均值。

注重透明度以赢得信任

有一种普遍的看法认为机器学习是一个神奇的黑匣子,它只是神奇地工作。重要的是要理解,虽然以指标衡量的模型性能很重要,但更重要的是要理解模型的工作原理。没有这种理解,很难信任模型,因此也很难说服关键利益相关者和客户相信机器学习和基于机器学习的系统的商业价值。

在像医疗保健和银行业这样严格监管的行业中,需要遵守法规,模型的可解释性至关重要。模型可解释性 通常由特征重要性表示,它告诉您每个输入列(或特征)如何影响模型的预测。这使数据科学家能够解释结果预测,以便利益相关者可以看到模型中哪些数据点最重要。

在我们的房价预测场景中,如果模型除了价格预测外还指示了对输出有贡献的关键输入特征,比如房屋大小和年龄,我们对模型的信任会增加。图 1-5 显示了我们房价预测场景中的特征重要性。请注意,年龄和学校评级是最重要的特征。

paml 0105

图 1-5. 特征重要性

拥抱实验

建立一个好的机器学习模型需要时间。与其他软件项目一样,成功在机器学习项目中的关键在于我们试验新假设的速度、从中学习,并不断进化。正如在图 1-6 中所示,成功的道路通常并不容易,并且在这个过程中需要大量的坚持、尽职和失败。

paml 0106

图 1-6. 成功并不容易。

这里是重视实验的文化的关键方面:

  • 愿意从实验中学习(无论成功或失败)。

  • 与同事分享学习。

  • 将成功的实验推广到生产环境。

  • 理解失败是实验的一个有效结果。

  • 快速转移到下一个假设。

  • 优化下一个实验。

不要孤立操作

客户通常通过应用程序体验机器学习模型。图 1-7 展示了机器学习系统与传统软件系统的不同之处。关键区别在于,机器学习系统除了代码工作流程外,还必须考虑数据工作流程。

paml 0107

图 1-7. 机器学习系统与传统系统的比较

在数据科学家构建了他们满意的机器学习模型后,他们将其交给应用程序开发人员集成到更大的应用程序中并部署。通常情况下,任何错误或性能问题直到应用程序部署后才会被发现。由于这些问题,应用程序开发人员和数据科学家之间的摩擦可能导致根本原因的识别和修复变得缓慢、令人沮丧和昂贵。

随着机器学习进入更多业务关键应用,越来越清楚的是,数据科学家需要与应用程序开发人员密切合作,以更高效地构建和部署以机器学习为驱动的应用程序。数据科学家专注于数据科学生命周期,即数据采集和准备、模型构建以及部署。他们还关注定期重新训练和重新部署模型,以调整最新标记的数据、数据漂移、用户反馈或模型输入的变化。应用程序开发人员专注于应用程序生命周期——构建、维护和持续更新大型业务应用程序,其中模型是其一部分。双方都有动力使业务应用程序和模型良好协同工作,以满足端到端性能、质量和可靠性目标。

所需的是一种更有效地桥接数据科学和应用生命周期的方法。图 1-8 展示了如何实现这种协作。我们将在本书的后面章节更深入地讨论这个问题。

paml 0108

图 1-8. 应用程序开发人员和数据科学家共同合作

一个迭代且耗时的过程

在本节中,我们通过使用我们的房价预测示例更深入地探讨机器学习过程。我们从房屋尺寸作为唯一输入开始,发现房屋尺寸与房价之间的关系是线性的。为了创建一个能够更准确预测价格的好模型,我们需要探索良好的输入特征,选择最佳算法,并调整超参数值。但是,您如何知道哪些特征是好的,哪种算法和超参数值会表现最好呢?这里没有银弹;我们需要尝试不同的特征组合、算法和超参数值。让我们来看看这三个步骤,然后看看它们如何应用于我们的房价预测问题。

特征工程

特征工程是利用我们对数据的了解来创建使机器学习算法工作的特征的过程。如图 1-9 所示,这涉及四个步骤。

paml 0109

图 1-9. 特征工程

首先,我们获取数据 —— 收集具有所有可能的输入变量/特征的数据,并将其处理到可用状态。大多数实际数据集都不干净,需要在使用之前进行处理,可能涉及修复缺失值、删除异常和可能不正确的数据,并确保数据分布是代表性的。

接下来,您需要生成特征:探索从可用数据中生成更多特征。在处理文本数据或时间序列数据时,这通常是有用的。与文本相关的特征可以简单到n-gram 和计数向量化,也可以复杂到从评论文本提取情感。类似地,与时间相关的特征可以简单到月份和周索引,也可以复杂到基于时间的聚合。生成的这些附加特征有助于提高模型的准确性。

完成这一步后,您需要转换数据,以使其适合机器学习。通常情况下,机器学习算法要求在拟合机器学习模型之前以特定方式准备数据。例如,许多算法不能直接处理分类数据,需要将所有输入变量和输出变量转换为数值形式。分类变量是一个变量,它可以取有限数量且通常固定的可能值之一。这些变量的示例包括颜色(红色、蓝色、绿色等)、国家(美国、印度、中国等)和血型(A、B、O、AB)。分类变量必须转换为数值形式,通常通过整数编码或独热编码技术实现。

最后一步是特征选择:选择模型训练的特征子集。为什么需要这样做?为什么不用所有的特征来训练模型?特征选择识别并移除不必要、无关或冗余的属性,这些属性不会有贡献,甚至可能降低模型的准确性。特征选择的目标有三个:

  • 提高模型准确性

  • 提高模型训练时间/成本

  • 提供对特征生成底层过程的更好理解

注意

特征工程步骤对传统机器学习至关重要,但对深度学习影响不大,因为特征是通过深度学习网络自动生成/推断的。

我们从一个特征开始:房屋大小。但我们知道房价不仅依赖于大小,还依赖于其他特征。还有哪些输入特征可能影响房价?尽管大小可能是最重要的输入之一,但这里还有几个值得考虑的:

  • 邮政编码

  • 建造年份

  • 地块大小

  • 学校

  • 卧室数量

  • 浴室数量

  • 车库车位数

  • 设施

算法选择

一旦我们选择了一组好的特征,下一步就是确定模型的正确算法。对于我们拥有的数据,简单的线性回归模型似乎可以工作。但请记住,我们只有少量数据点(四个房价),足以代表机器学习的规模,也足够小。此外,线性回归假设输入特征与目标变量之间存在线性关系。随着我们收集更多数据点,线性回归可能不再是最相关的,我们将受到数据中趋势和模式的影响,被激励探索其他技术(算法)。

超参数调整

正如本章前面讨论的,超参数在模型准确性和训练性能中起着关键作用。因此,调整它们是达到良好模型的关键步骤。由于不同的算法有不同的超参数集,调整超参数的这一步骤增加了全程流程的复杂性。

全程流程

有了对特征工程、算法选择和超参数调整的基本理解,让我们逐步解决我们的房价预测问题。

让我们从大小地块大小建造年份特征开始,使用梯度提升树和特定的超参数值,如图 1-10 所示。生成的模型准确率为 30%。但我们希望做得更好。

paml 0110

图 1-10. 机器学习过程:步骤 1

为了开始工作,我们尝试相同特征和算法的不同超参数值。如果这不能提高模型的准确性到满意的水平,我们尝试不同的算法,如果这也不起作用,我们增加更多特征。图 1-11 显示了一个这样的中间状态,增加了学校作为一个特征,并使用k最近邻(KNN)算法。生成的模型准确率为 50%,但仍不够好,因此我们继续这个过程并尝试不同的组合。

paml 0111

图 1-11. 机器学习过程:中间状态

经过多次尝试不同特征、算法和超参数值的组合迭代,我们最终得到了一个符合我们标准的模型,如图 1-12 所示。

paml 0112

图 1-12. 机器学习过程:最佳模型

正如您所见,这是一个迭代且耗时的过程。举个例子:如果有 10 个特征,那么选择特征的方法有 2¹⁰(1,024)种。如果我们尝试五种算法,并假设每种算法平均有五个超参数,那么总共会有 1,024 × 5 × 5 = 25,600 次迭代!

图表 1-13 展示了 scikit-learn 的速查表,显示选择合适算法本身可能是一个复杂的问题。现在想象一下在此基础上加入特征工程和超参数调整。结果,数据科学家需要几周甚至几个月的时间才能得到一个好的模型。

paml 0113

图表 1-13. Scikit-learn 算法速查表(来源:https://oreil.ly/xUZbU

不断增长的需求

尽管模型构建过程复杂,但对机器学习的需求激增。几乎所有行业的组织都在尝试利用数据和机器学习来获得竞争优势——将智能融入其产品和流程中,以取悦客户并放大业务影响。图表 1-14 展示了使用机器学习解决的各种实际业务问题的多样性。

paml 0114

图表 1-14. 使用机器学习解决实际业务问题

因此,机器学习相关工作的需求非常巨大。图表 1-15 展示了从 2015 年到 2018 年各种工作职位的百分比增长。

paml 0115

图表 1-15. 机器学习相关工作的增长

图表 1-16 展示了使用机器学习和人工智能的企业应用预期的收入将会呈现天文数字的增长。

paml 0116

图表 1-16. 机器学习/人工智能收入预测

结论

在本章中,您学到了成功的机器学习项目所共有的一些最佳实践。我们讨论了构建一个良好的机器学习模型的过程是迭代且耗时的,导致数据科学家需要几周到几个月的时间来构建一个好的模型。与此同时,对机器学习的需求正在迅速增长,预计将会飙升。

要解决这个供需失衡问题,需要找到一种更有效的方法来缩短构建机器学习模型的时间。那么,工作流程中的某些步骤能够自动化吗?当然可以!自动化机器学习是成功的数据科学家必备的最重要技能之一,能够显著提高生产力。

在接下来的章节中,我们将深入探讨自动化机器学习。我们将探讨它是什么,如何入门,以及如何在当今的实际应用中使用它。

第二章:自动化机器学习的工作原理

在前一章中,我们确认了自动构建机器学习模型的需求。本章将解释什么是自动化机器学习,涉及到此过程中的不同技术,以及它们如何相互结合。我们还将简要介绍 Microsoft Azure 机器学习中的自动化 ML。

什么是自动化机器学习?

在第一章中,我们讨论了如何通过探索所有可能的组合来创建一个好的机器学习模型可能会耗费大量时间和精力。自动化机器学习是机器学习的一个新发展方向,旨在简化整个过程,从而提高数据科学家的效率,同时使非数据科学家也能构建模型。

让我们详细了解机器学习过程的各个阶段,并看看自动化机器学习如何在每个阶段提供帮助。

理解数据

如前一章简要讨论的,现实世界的数据并不干净,需要大量工作才能使其达到可用状态。理解输入数据是制定机器学习问题的关键步骤。

自动化机器学习可以通过分析数据并自动检测每列的数据类型来帮助这一过程。列的类型可能是布尔型、数值型(离散或连续)、或文本型。自动检测这些列类型有助于后续的特征工程阶段。

在许多情况下,自动化机器学习还可以提供关于每列语义或意图的见解。它可以检测到广泛的情况,包括以下内容:

  • 检测目标/标签列

  • 检测文本列是分类文本特征还是自由文本特征

  • 检测列是否是邮政编码、温度、地理坐标等

在继续之前,让我们讨论模型训练过程如何与输入数据的关系。我们应该使用所有可用数据进行训练吗?答案是否定的。

在全数据集上训练模型可能会导致过拟合。过拟合意味着我们训练的模型过于贴近输入数据集并模仿输入数据集。这通常发生在模型过于复杂(即特征/变量数量远大于观测数量)的情况下。这种模型在输入数据上可能非常准确,但在未训练或新数据上可能表现不佳。

相反,当模型欠拟合时,意味着模型不适合输入数据,因此错过了数据中的趋势。这也意味着该模型无法推广到新数据。这通常是因为模型过于简单(输入变量/特征不足)。增加更多的输入变量/特征有助于克服欠拟合问题。

图 2-1 展示了二元分类问题中的过拟合和欠拟合情况。

paml 0201

图 2-1. 过拟合和欠拟合

为了克服过拟合问题,我们通常将输入数据分成两个子集:训练数据和测试数据(有时还会进一步分成三个子集:训练、验证和测试)。然后,模型在训练数据上进行拟合,以便在测试数据上进行预测。训练集包含已知输出,模型在此基础上学习,以便稍后可以泛化到其他数据。我们使用测试集来测试模型预测的准确性。

但是,我们如何知道训练/测试拆分是否有效?如果我们的数据子集相比其他子集存在偏差怎么办?即使我们试图避免,这也会导致过拟合。这就是交叉验证发挥作用的地方。

交叉验证类似于训练/测试拆分,但应用于更多子集。数据被分成k个子集,模型在其中的k-1 个子集上进行训练,最后一个子集用于测试。这对每个子集都执行。这称为k-折交叉验证。最后,所有k折的分数平均后产生最终分数。图 2-2 展示了这一过程。

paml 0202

图 2-2. k-折交叉验证(来源:ttps://oreil.ly/k-ixI)

任务检测

数据科学家将现实世界的场景映射到机器学习任务中。图 2-3 展示了一些机器学习任务的类型示例。

paml 0203

图 2-3. 机器学习任务

自动化机器学习可以自动确定机器学习任务,给定输入数据。这在监督学习中更为相关,其中目标/标签列可用于预测机器学习任务。表 2-1 列出了通用的机器学习任务。

表 2-1. 机器学习任务检测

目标/标签列 机器学习任务 示例场景
布尔 二分类 分类推特评论的情感,正面或负面 表明电子邮件是垃圾邮件还是非垃圾邮件
离散数值/分类 多类别分类 确定狗的品种,如哈瓦那犬、金毛寻回犬、比格犬等 按位置、价格、清洁度等对酒店评论进行分类
连续数值 回归 基于房屋属性(如卧室数量、位置或大小)预测房价 基于历史数据和当前市场趋势预测未来股票价格

除了这些通用任务外,还有基于输入数据的特定变体。其中一种受欢迎的任务类型是预测,因为它与诸如收入预测、库存管理、预测性维护等许多业务问题相关。如果输入数据是时间序列,根据日期时间列的可用性来确定,那么很可能是一个预测任务。

选择评估指标

选择评估机器学习算法的指标基本上是由业务结果驱动的。这是一个重要的步骤,因为它告诉您如何衡量和比较算法的性能。不同的任务有不同的评估指标可供选择,并且选择取决于多个因素。图 2-4 显示了用于评估各种机器学习任务中使用的算法的可能选项。

paml 0204

图 2-4. 机器学习评估指标

自动化机器学习可以自动选择适合给定输入数据集和机器学习任务的正确评估指标的过程。例如,像欺诈检测(这是一个分类任务)这样的情景中数据通常是不平衡的,只有很小一部分数据是欺诈性的。在这种情况下,曲线下面积(AUC)比准确率更好地评估了性能。自动检测数据中的类别不平衡可以帮助自动选择 AUC 作为此分类任务的评估指标。

特征工程

如 第一章 讨论的,特征工程是从输入数据中获取适当特征集的过程,其目标是生成一个良好的机器学习模型。自动特征工程包括四个关键步骤,在接下来的小节中我们会讨论这些步骤。

检测输入数据问题并自动标记它们

其中的例子包括:

  • 检测缺失值并自动使用最相关的技术填补它们;例如,数值列使用均值,分类列使用众数(最频繁出现的值),等等。

  • 检测类别不平衡,并通过应用诸如合成少数类过采样技术(SMOTE)等技术自动修复它。

放弃作为特征无用的列

下面是一些例子:

无变异列

这些是跨所有行具有相同值的列,可以通过自动化轻松检测到。

高基数列

这些是跨行具有不同值的列;例如,哈希值、ID 或全局唯一标识符(GUID)。基数由列中唯一值的百分比确定。

生成特征

有多种技术可以从现有特征生成新特征。以下是一些例子:

编码和转换

大多数机器学习算法需要数值输入和输出变量。现实世界的数据集充满了文本和分类数据。数据科学家通过使用编码和转换将它们转换为数值数据。

独热编码 是一种将分类数据转换为整数数据的流行技术。您可以轻松自动化此过程。图 2-5 显示了独热编码的一个示例。

paml 0205

图 2-5. 独热编码

对输入列应用转换以生成有趣的特征。一些示例包括生成“年份”、“月份”、“日期”、“星期几”、“年的天数”、“季度”、“年的周数”、“小时”、“分钟”和“秒”等给定日期时间列的特征。这对于与时间序列相关的问题非常有效。

其他示例可能根据单字、双字和三字符组生成词频,并为文本列生成词嵌入。

聚合

特征生成中的另一种流行技术涉及对多个数据记录进行聚合生成。聚合可以基于数据集中的特定实体(例如,每个商店的平均产品销售/收入)或基于时间(例如,过去 7 天、30 天、180 天内的网站页面访问量)。通过时间聚合生成的特征对于时间序列预测问题非常有用。

选择最有影响力的特征

特征选择是过程中的重要步骤,因为它有助于优先考虑适当的输入特征集。当输入特征数量非常大时,这变得尤为重要。

为什么我们需要优先考虑适当的输入特征集?为什么不使用所有特征?以下是特征选择的顶级好处:

  • 更快的训练

  • 更简单的模型,更容易解释

  • 减少过拟合

  • 提高模型准确性

让我们来看看一些不同的特征选择技术。请记住,您可以自动化所有这些技术:

过滤器

根据这种技术,特征的选择与任何机器学习算法无关。特征的选择基于它们与结果变量的相关性,由统计测试来衡量。因为选择过程与模型无关,这种方法可能不会选择最有用的特征,但能有效防止过拟合。如图 2-6 所示,选择最佳特征子集发生在模型训练之前。

包装器

根据这种技术,使用特征子集来训练模型。基于模型的性能,我们决定从子集中添加或删除特征,并使用更新的子集再次训练模型。这个过程持续进行,直到模型的性能令人满意。然而,由于多次来回迭代,这种技术可能计算开销很大。由于选择过程与模型绑定,它倾向于产生比过滤方法更准确的结果,但更容易过拟合。如图 2-6 所示,展示了包装器方法。

嵌入方法

嵌入方法结合了过滤器和包装器方法的优点。由具有其自身内置特征选择方法的算法实现,嵌入方法类似于包装器,但计算开销较小,因为没有来回迭代。这种技术也较少容易过拟合。如图 2-6 所示,展示了嵌入方法。

paml 0206

图 2-6. 特征选择

选择模型

如前一章所讨论的,机器学习模型由算法及其关联的超参数值组合表示。自动化机器学习系统采用不同的方法进行模型选择。在本节中,我们讨论了两类方法:暴力方法和更智能的方法。

暴力方法

这是尝试所有可能的算法和超参数值组合的天真方法,以找到根据评估度量得出的最佳模型。通常是随机选择算法,并应用网格搜索来找出正确的超参数集。网格搜索的一个主要缺点是,当超参数数量呈指数增长时,维度灾难会显现出来。仅有四个参数,这个问题就变得不切实际,因为这种方法所需的评估次数随每个额外参数的增加而指数增加。

随机搜索是一种技术,通过随机组合超参数来寻找最佳解决方案。在这种搜索模式下,每次迭代都考虑随机组合的参数。由于每次迭代都选择随机值,很有可能整个空间都被覆盖,因此找到最佳模型的机会比网格搜索要高得多。在网格搜索期间,覆盖每个组合的每个方面需要大量时间。如果所有超参数不是同等重要,随机搜索效果最好。

图 2-7 展示了网格搜索和随机搜索的工作原理。在这个例子中,正在尝试九组参数组合。请注意,随机搜索成功达到了更好的模型性能,如顶部的“山丘”上的点所示。在“山丘”的最高点表示了最佳参数组合。

paml 0207

图 2-7. 网格搜索与随机搜索比较

更智能的方法

对于现实世界的问题,搜索空间非常大,暴力方法将不会有效。这导致了更智能的选择和优化方法的出现,主要由先进的统计学和机器学习技术驱动。其中一些方法包括贝叶斯优化、多臂赌博机和元学习。在这里,我们以较高层次介绍其中一些方法(详细内容需要更深入挖掘,超出本书的范围):

贝叶斯优化

这种方法使用近似来猜测一个未知函数,并带有一些先验知识。这里的目标是基于可用的观察结果训练模型。训练好的模型将映射到一个我们不知道的函数上。我们的任务是找到最大化学习函数的超参数。

贝叶斯优化能帮助您在众多模型中找到最佳模型,通过减少计算任务并不需要人类帮助来猜测数值来加快模型选择过程。这种优化技术基于随机性和概率分布。图 2-8 展示了其工作原理的视觉描述。

paml 0208

图 2-8. 贝叶斯优化

虚线是我们真实目标函数曲线。不幸的是,我们不知道这个函数及其方程式。我们试图通过使用高斯过程来近似它。在我们的样本空间中,我们绘制一个符合观察到的样本(实心点)的直观曲线(实线)。t代表我们有新观察样本时的不同时间点。阴影区域是置信区域,点可能存在的区域。通过前述的先验知识,我们可以确定第二个点为最大观察值。下一个最大点应在其上方或相等。如果我们通过第二个点绘制一条水平线,那么下一个最大点应落在这条线上方。从这条线与置信区域的交点,我们可以舍弃曲线样本低于该线以找到最大值。这样做,我们已经缩小了我们的调查范围。这个相同的过程随后的采样点继续进行。

多臂赌博机

多臂赌博机是一个问题,其中必须在有限的资源集之间分配,以最大化预期收益,当每个选择的特性在分配时仅部分知道,并且随着时间的推移或通过将资源分配给选择可以更好地理解。

这是一个经典的强化学习问题,涵盖了探索利用的权衡困境,建模一个同时试图获取新知识(称为探索)并基于现有知识优化其决策的代理。正如图 2-9 所示,代理试图平衡这些竞争任务,以在考虑期内最大化其总价值。

paml 0209

图 2-9. 探索与利用

元学习

这是“学习如何学习”。将其视为应用机器学习来构建机器学习模型;因此,“元”在名称中。元学习的目标是在各种学习任务上训练模型,使其能够仅通过少量训练样本解决新的学习任务。这不仅极大地加快和改进了机器学习流水线的设计,还允许我们用数据驱动的方式替换固定的手动选择模型。

随着神经网络的普及,元学习方法已被应用于自动设计最优神经网络架构。这被称为神经架构搜索(NAS),是一个研究热点领域。NAS 已被用来设计与手动设计架构相媲美或优于其的网络。NAS 的方法可以根据使用的搜索空间搜索策略性能估计策略进行分类。

搜索空间定义了可以设计和优化的神经网络类型。搜索策略定义了探索搜索空间的方法。性能估计策略从设计角度评估可能的神经网络的性能(无需构建和训练它)。

监控和重新训练

到目前为止,我们已经介绍了建立良好模型的阶段以及自动化机器学习如何在每个阶段帮助。机器学习工作流的最后一个阶段是监控和重新训练您的模型。

模型在训练期间的表现可能与在实际数据部署后的表现有很大不同。因此,即使在部署后也要持续测量模型性能非常重要。模型性能不佳通常是由于时间内输入数据特征的变化引起的,这被称为数据漂移。存在技术可以自动监控数据漂移和模型性能随时间的变化。

一旦检测到模型性能下降,可以立即采取纠正措施以最小化损害。纠正措施可能包括以下内容:

  • 立即将模型下线(并禁用相应的用户体验)

  • 使用最新数据重新训练模型并部署更新后的模型

对于依赖于生产环境的机器学习模型的公司来说,这个阶段尤为关键。因此,一个好的自动化机器学习解决方案应该支持监控和训练。

全面总结

自动化机器学习使用户(无论是否具有机器学习专业知识)能够为任何问题识别一个端到端的机器学习管道,实现更高的准确性,同时花费更少的时间。它能够运行更多实验,加速向生产就绪的智能体验迭代。根据输入数据,它可以自动化特征工程、模型选择和超参数调优的过程,如图 2-10 所示。

paml 0210

图 2-10. 自动化机器学习

自动化 ML

自动化 ML 是 Microsoft Azure 机器学习服务中提供的一种能力。本节概述了自动化 ML 的工作原理,后续章节将详细介绍如何在您的场景中使用自动化 ML。

自动化 ML 的工作原理

自动化 ML 基于微软研究部门的突破性成果。该方法将协同过滤和贝叶斯优化的思想结合起来,智能高效地搜索大量可能的机器学习流水线。本质上,它是机器学习流水线的推荐系统。与流媒体服务为用户推荐电影类似,自动化 ML 为数据集推荐机器学习流水线。图 2-11 和 2-12 展示了这个类比。

paml 0211

图 2-11. 流媒体服务:电影推荐

paml 0212

图 2-12. 自动化 ML:机器学习流水线推荐

如图 2-11 和 2-12 右侧所示的分布所示,自动化 ML 还考虑了不确定性,采用概率模型确定下一步尝试的最佳流水线。这种方法允许自动化 ML 在不进行穷举搜索的情况下探索最有前途的可能性,并更快地收敛于用户数据的最佳流水线,胜过竞争对手的蛮力方法。

保护隐私

自动化 ML 实现了所有这些,而无需查看用户的数据,从而保护隐私。如 图 2-13 所示,用户的数据和机器学习流水线的执行都驻留在用户的云订阅中(或其本地计算机),用户完全控制。只有每个流水线运行的模型性能指标被发送回自动化 ML 服务,然后做出智能的、概率性的选择,确定下一步应该尝试哪些流水线。

自动化 ML 的概率模型经过数亿次实验训练,每次实验都涉及在特定数据集上评估特定流水线。现在,这种训练使得自动化 ML 服务能够快速为新问题找到良好的解决方案。并且模型在运行新的机器学习任务时继续学习和改进,尽管如前所述,它不会看到用户的数据。

paml 0213

图 2-13. 保护隐私

实现透明度

数据科学家以及其他用户都认为透明度非常重要,这样他们才能理解发生的情况并信任输出结果。这对企业在生产中使用关键业务场景尤为关键。

自动化机器学习(Automated ML)强调透明度,使得理解生成的机器学习流水线变得轻松,包括前一节中讨论的所有阶段(例如数据理解、特征工程、模型选择/优化)。用户可以直接使用生成的机器学习流水线,或者进一步进行定制。

透明度的另一个方面是理解输入特征如何影响模型的结果,也称为模型可解释性解释性。自动化 ML 通过提供特征重要性功能使这一过程变得简单。图 2-14 展示了一个客户流失模型的示例,其中SupportIncidents计数是最重要的特征贡献因素。这是有道理的,因为如果客户遇到了很多支持问题,他们流失的可能性就更高。

paml 0214

图 2-14. 特征重要性

守护栏

除了提供透明度外,Azure 上的自动化 ML 还提供守护栏,帮助用户了解数据(例如缺失值、类别不平衡)或模型可能存在的问题,并帮助采取改进结果的纠正措施。我们将在第七章中详细介绍这一点。

端到端模型生命周期管理

自动化 ML 作为 Azure 机器学习的一个能力,提供端到端(E2E)模型生命周期管理,包括通过与 Azure 机器学习的 ML 运营能力集成,简单部署、监控、漂移分析和重新训练。图 2-15 展示了这一端到端的流程。

paml 0215

图 2-15. E2E 模型生命周期管理

结论

在本章中,您了解了什么是自动化机器学习,以及它如何帮助解决实际问题中建立良好机器学习模型的每个阶段。我们还简要介绍了 Azure 机器学习能力自动化 ML 在幕后如何构建良好的机器学习模型,并通过允许透明度和保护数据隐私来建立信任的简要概述。

在后续章节中,我们将涵盖我们在这里提到的不同方面,并提供实践和示例场景,帮助您在工作中使用自动化机器学习。

第二部分:在 Azure 上的自动化机器学习

在这一部分,您将开始在 Azure 上使用自动化机器学习。您还将了解一些机器学习技术如何与自动化机器学习结合使用。

第三章:开始使用 Microsoft Azure 机器学习和自动化 ML

在第二章中,我们解释了自动化机器学习的概念,并简要概述了 Microsoft Azure 机器学习上的自动化 ML 工具。在本章中,我们将讨论如何开始使用 Azure 机器学习以及随后的自动化 ML。在深入讨论自动化 ML 的细节之前,我们将首先讨论企业在其机器学习项目中面临的一些常见挑战,以更好地理解这些问题。

机器学习流程

在使用机器学习解决问题时,我们首先从问题陈述开始,明确我们要优化的内容。接下来,我们寻找能帮助解决问题的数据集。我们开始查看数据,并使用像 Pandas 这样的数据操作库。我们检查缺失值、数据分布以及数据中的错误。我们尝试合并多个数据集。当我们认为已经有足够好的数据集可以开始时,我们将其分割为训练集、测试集和验证集,通常的比例是 70:20:10。这有助于避免过拟合,基本上意味着我们不在训练和测试时使用相同的数据集。我们使用训练集来训练机器学习算法。测试集用于在训练完成后测试机器学习模型,以确定算法的表现如何。

我们建立了一个度量标准来确定算法的性能,并不断迭代,直到得到一个优秀的算法。然后,我们使用验证数据集来检查算法的性能。有时,验证数据集可能不在主数据集中,在这种情况下,我们可以将原始数据集按 80:20 的比例分割为训练集和测试集。所有这些数据集都应该是主数据集的代表性样本,以避免数据偏斜(也称为偏差)。正如你所看到的,这个过程是迭代的,可能会耗费时间。图 3-1 显示了手动流程的摘要。

paml 0301

图 3-1. 自定义人工智能的手动流程

让我们来看看数据科学家在开始机器学习项目时可能面临的一些其他挑战。

合作与监控

企业中的数据科学家可以独立工作,也可以组成团队。如今,机器学习项目更加复杂,数据科学家经常进行合作。然而,对于数据科学家来说,分享结果和审查代码可能并不容易。

数据科学家在协作时面临的其他挑战包括如何跟踪机器学习实验,以及如何跟踪每个实验中多次迭代(运行)的历史记录。在具有可以水平和垂直扩展的训练环境方面也存在额外的挑战。当我们需要集群中的更多节点时,我们希望进行水平扩展;当我们需要更多 CPU 或内存时,我们则对每个节点进行垂直扩展。

部署

在训练模型满足业务标准之后,下一步是将其部署到运营环境中,以便我们可以用它进行预测。这也被称为模型的部署。模型可以部署为实时评分的 Web 服务,也可以作为批量评分模型用于大规模评分。图 3-2 总结了数据科学家可能执行的步骤,从训练到部署。现在,让我们了解一下 Azure 机器学习和自动化 ML 如何帮助解决其中的一些挑战。

paml 0302

图 3-2. 机器学习步骤

为自动化 ML 设置 Azure 机器学习工作区

Azure 机器学习服务帮助数据科学家在云工作空间中跟踪实验和迭代(运行)。它是一个旨在支持端到端(E2E)机器学习的机器学习平台。

要使用 Azure 机器学习服务(包括 Azure 机器学习 SDK 和自动化 ML),您必须拥有 Azure 机器学习工作区。此工作区驻留在您的 Azure 订阅中,您可以将其用作跟踪实验和执行其他操作的单一协作场所。任何具有资源组所有者或贡献者访问权限的人都可以在 Azure 资源组中创建工作区。您可以使用 Microsoft Azure 门户或 Python SDK 创建它。在本章后面,我们将详细讨论安装 SDK 的步骤。

首次创建工作区时,您需要在 Azure 订阅中注册几个资源提供程序(RP)。让我们注册用于使用 Azure 机器学习工作区所需的 RP。您可以在 Azure 门户中搜索此 RP,位于您的订阅下。以下是执行此操作的步骤:

  1. 打开 Azure 门户,然后转到您的订阅,如图 3-3 所示。

    paml 0303

    图 3-3. 订阅概述
  2. 在窗格的左侧,浏览到“资源提供程序”,如图 3-4 所示。

    paml 0304

    图 3-4. 资源提供程序列表
  3. 在筛选器中,在搜索框中键入“machinelearning”,然后注册 Machine Learning RP,如图 3-5 所示。

    paml 0305

    图 3-5. 与机器学习相关的资源提供程序
  4. 注册 KeyVault、ContainerRegistry 和 ContainerInstance RP,如图 3-6 和 3-7 所示。

    paml 0306

    paml 0307

    Figure 3-7. 与容器相关的 RPs

现在我们准备创建 Azure ML 工作区。为此,我们需要在 Azure 资源组中具有贡献者或所有者访问权限。确认适当的访问权限后,让我们创建 Azure Machine Learning 工作区:

  1. 转到 Azure 门户并搜索“机器学习服务工作区”,如 图 3-8 所示。

    paml 0308

    Figure 3-8. 转到 Azure 门户上的机器学习工作区
  2. 按照 图 3-9 到 图 3-11 所示,在窗格中填写必要的详细信息。

    paml 0309

    Figure 3-9. Azure Machine Learning 服务创建窗格

    您可以选择现有资源组或创建新的资源组。

    paml 0310

    Figure 3-10. Azure 资源组创建窗格

    当您完成所有选择时,请单击“创建”。

    paml 0311

    Figure 3-11. Azure Machine Learning 工作区创建窗格
  3. 在随后打开的通知窗格的上部,点击铃铛图标(图 3-12)前往新创建的 Azure Machine Learning 工作区。

    paml 0312

    Figure 3-12. Azure Machine Learning 工作区通知窗格
  4. 如 图 3-13 所示,Azure Machine Learning 工作区的主页显示了如何开始以及工作区的所有资产。当我们运行自动化 ML 实验时,详细信息将显示在“实验”部分。

创建此工作区后,您可以将其用于培训、部署和更多与机器学习相关的活动。本章剩余部分我们将专注于使用自动化 ML。

paml 0313

Figure 3-13. Azure Machine Learning 工作区概览页面

Azure Notebooks

数据科学家或人工智能(AI)开发者可以通过多种方式使用自动化机器学习。它作为 Azure Machine Learning SDK 的一部分打包提供。可以在任何 Python 环境中安装为 PyPi 包。

我们在 Azure Notebooks 中(云中的 Jupyter 环境)运行一个自动化机器学习的 E2E 实验。与 Azure Notebooks 结合使用时,SDK 已预先安装在环境中。让我们创建一个项目:

  1. 通过访问 https://notebooks.azure.com,如 图 3-14 所示,开始使用 Azure Notebooks。点击“现在试用”按钮并登录。

    paml 0314

    Figure 3-14. Azure Notebooks 主页
  2. 从您的个人资料页面,您可以查看 Azure Notebooks 项目(图 3-15)。

    paml 0315

    Figure 3-15. Azure Notebooks 个人资料页面示例
  3. 将计算设置为您的笔记本服务器,如图 3-16 所示。

    paml 0316

    图 3-16. 将 Jupyter 服务器关联到计算类型
  4. 打开笔记本后(参见图 3-17),它会启动 Jupyter 内核。您可以通过按 Shift + Enter 键来执行单元格中的代码。

    paml 0317

    图 3-17. 一个 Jupyter 笔记本
  5. 如图 3-18 和 3-19 所示,首先授权环境以访问 Azure 订阅,从而访问您之前创建的 Azure 机器学习工作区。

    paml 0318

    图 3-18. 连接到 Azure

    paml 0319

    图 3-19. 授权 Azure 机器学习工作区
  6. 现在,按照图 3-20 和 3-21 中显示的方法实例化 Azure 机器学习工作区。首先导入库,然后使用 get 方法实例化工作区对象,该对象可以被自动 ML 和其他相关活动使用。

    paml 0320

    图 3-20. 导入 Azure 机器学习库

    paml 0321

    图 3-21. 实例化 Azure 机器学习工作区
  7. 在 Azure 机器学习工作区内定义一个实验,以开始使用自动 ML,如图 3-22 所示。

    paml 0322

    图 3-22. 在 Azure 机器学习工作区定义一个实验
  8. 从将用于自动 ML 训练的数据集中,我们创建了用于特征列和预测标签的 DataFrame。这些 DataFrame 在自动 ML 配置中表示为 X 和 y。配置还接受各种其他参数,如图 3-23 和 3-24 所示。

    paml 0323

    图 3-23. Azure 机器学习工作区中自动 ML 实验的配置参数

    除了实验类型外,这些参数还定义了帮助控制训练时间和花费的约束条件。这些参数的详细信息请参阅官方 Azure 文档

    paml 0324

    图 3-24. 配置自动 ML 实验

    提交此训练,并通过小部件在笔记本中监视实验进度,或通过 Azure 门户在您的 Azure 机器学习工作区中进行监视,如图 3-25 到 3-27 所示。这些显示实验运行的指标分数、状态和持续时间。这些指标可以帮助找出自动 ML 尝试的内容及每次迭代的结果。

    paml 0325

    图 3-25. 在 Azure 机器学习工作区中监视实验进度

    paml 0326

    图 3-26. Azure 机器学习工作区中自动 ML 运行的指标

    paml 0327

    图 3-27. Azure 机器学习工作区中的摘要和迭代图表
  9. 通过查看真实值和预测值的图表,我们可以探索子运行(迭代)的详细信息,如图 3-28 和 3-29 所示。

    paml 0328

    图 3-28. 预测与真实值比较

    paml 0329

    图 3-29. 评估模型性能的指标
  10. 您可以从任何子运行中导出训练过的模型,如 图 3-30 所示。使用 Azure 机器学习,您可以将此模型部署到云端或边缘以进行预测。您还可以将其部署到其他您选择的环境中。您可以利用容器化模型的优势,然后使用 Azure 机器学习将其部署为实时 Web 服务或批处理服务。(我们在第五章中讨论部署。)

    paml 0330

    图 3-30. 下载和部署模型文件
  11. 或者,在训练完成后,您可以编写 Python 代码选择最佳模型,如 图 3-31 所示。

    paml 0331

    图 3-31. 从最佳运行中选择模型
  12. 当您转到 Azure 机器学习工作区的主要实验页面时,您可以查看所有运行的实验及其子运行。门户会根据您正在优化的指标自动对子运行进行排序。在图 3-32 中,您可以看到实验运行的摘要。它有各种窗格显示运行配置和运行结果。最佳管道显示在图 3-33 的顶部。

    paml 0332

    图 3-32. 自动 ML 实验运行摘要

    paml 0333

    图 3-33. 基于指标排序的运行结果

笔记本 VM

截至本文撰写时,一个新的基于云的笔记本服务器正在预览中。这个安全的、基于云的 Azure 工作站提供了一个 Jupyter 笔记本服务器、JupyterLab 和一个完全准备好的机器学习环境。您可以在Azure 机器学习笔记本文档中了解更多信息。

结论

在本章中,您了解了 Azure 机器学习工作区,并学习了如何使用 Azure Notebooks 开始使用自动化机器学习。在第八章中,您将使用更多编码环境来运行自动化机器学习实验。

第四章:特征工程与自动化机器学习

特征工程是数据科学过程中最重要的部分之一。如果你让数据科学家分析数据科学过程中每个阶段花费的时间,你通常会听到他们花大量时间理解和探索数据,并进行特征工程。大多数经验丰富的数据科学家不会直接开始建模,而是先花时间进行特征工程。

但是什么是特征工程?通过特征工程,你可以将原始数据转换为机器学习算法更容易理解的形式。例如,你可以进行数据处理、添加新特征(例如,将现有列的值组合为新的数据列)或者将特征从其原始领域转换到不同的领域。你还可以移除对模型无用或无关的特征。在进行特征工程时,你将生成新特征、转换现有特征或选择特征子集。

为了说明如何转换特征,让我们考虑一个简单的例子,即处理分类特征(又称分类变量)。假设你有一个航空公司客户计划的数据集,其中有一个名为 Status 的特征,该特征确定客户的状态(例如,根据客户飞行频率、总里程等)。Status 包含以下五个唯一值:New、Silver、Gold、Platinum 和 Diamond。因为一些机器学习算法只能处理数值变量,所以你需要对这个特征进行转换。常见的方法是使用独热编码,如表格 4-1 所示。

表格 4-1. 独热编码

Status New Silver Gold Platinum Diamond
Gold 0 0 1 0 0
Silver 0 1 0 0 0
New 1 0 0 0 0
Platinum 0 0 0 1 0
Silver 0 1 0 0 0
Gold 0 0 1 0 0

特征工程的另一个重要方面是利用领域专业知识。在进行特征工程时,你可能考虑与具有相关领域专业知识的人合作——领域专家的输入在努力实现高质量模型的目标时将是非常宝贵的。

在训练机器学习模型时,透明性可解释性是重要考虑因素。因此,正确进行特征工程将有助于生成性能优越且能够解释的模型。

注意

第七章详细讨论了 Azure 机器学习如何提供工具来理解生成的模型、特征的相对重要性等。

在进行特征工程时,数据科学家经常问自己以下问题:

  • 数据集中哪些特征对模型是不相关的?例如,您的数据可能包含一个标识符(ID)列。尽管此列在合并来自多个数据集的数据时很有用(例如,根据employee_id连接两个数据集),但在训练模型时不会以任何方式使用 ID 列。

  • 我们能否组合一个或多个特征以创建更加有用的新特征?

  • 对于一些稀疏的类别(即包含显著较少观察结果的类别),我们能否将它们分组以创建更有意义的类别?

本章我们关注如何使用 Microsoft Azure 机器学习中的自动化 ML 工具提供的自动特征化功能。您将学习自动特征化在分类、回归和预测任务中的工作原理。此外,我们还分享了指导和资源,帮助您更深入地进行特征工程。在深入探讨自动化 ML 执行的自动特征化之前,让我们先看看可用的数据预处理方法。

自动化 ML 中可用的数据预处理方法

根据机器学习任务的类型(例如分类、回归、预测),执行不同类型的数据预处理。当您使用自动化 ML 并提交实验时,您会注意到每次迭代执行不同类型的数据预处理。

例如,当数据相关时,您会注意到数据被缩放或标准化。当特征具有不同的范围时,缩放和标准化是有帮助的。表 4-2 展示了自动化 ML 执行的缩放和标准化步骤。

表 4-2. 自动化 ML 执行的数据预处理

缩放和标准化 描述
MinMaxScalar 对每列进行缩放,使得特征在最小和最大值之间。
MaxAbsScaler 使用最大绝对值对每个特征进行缩放。
RobustScalar 使用分位数范围的值对每个特征进行缩放。
PCA 使用数据的奇异值分解(SVD)进行线性降维,将其投影到更低维度空间。
TruncatedSVDWrapper 使用截断的 SVD 进行线性降维。与主成分分析(PCA)不同,数据在计算 SVD 前不会居中。注意:这使得它能够有效地处理scipy.sparse矩阵。
SparseNormalizer 对包含一个或多个非零分量的每个样本进行独立重新缩放,使得范数(L1 或 L2)等于一。
提示

若要详细了解 Azure 机器学习中数据预处理的更多细节,请参阅此部分 Microsoft Azure 文档。

自动化 ML 的自动特征化

现在让我们开始使用自动特征生成。到目前为止,您应该熟悉如何设置自动化 ML 配置对象。让我们回顾一下如何设置自动化 ML 实验。在接下来的代码示例中,首先定义 AutoMLConfig 对象。接下来,指定实验的名称、运行的迭代次数、日志记录的粒度等。在定义了 AutoMLConfig 对象之后,通过使用 experiment.submit(…) 提交实验:

import time

automl_settings = {
    "name": "AutoML_Book_CH07_FeatureEngineering_{0}".format(time.time()),
    "task": "regression",
    "iteration_timeout_minutes": 10,
    "iterations": 10,
    "max_cores_per_iteration": 1,
    "primary_metric": 'r2_score',
    "max_concurrent_iterations": 10,
    "experiment_exit_score": 0.985,
    "debug_log": "automl_ch07_errors{0}.log".format(time.time()),
    "verbosity": logging.ERROR
}
# Local compute
Automl_config = AutoMLConfig(
                   preprocess = False,
                   X = X_train,
                   y = y_train,
                   X_valid = X_valid,
                   y_valid = y_valid,
                   path=project_folder,
                   **automl_settings)

# Training the model
experiment=Experiment(ws, experiment_name)
local_run = experiment.submit(Automl_config, show_output=True)

在提交实验后,请注意每次迭代中执行的数据处理(请参见 Figure 4-1 中的输出)。从迭代 0 到 7,您可以看到每次迭代显示的数据预处理类型。例如,在迭代 0 中,我们可以看到使用了 StandardScalerWrapper。在迭代 3 中,使用了 RobustScaler

在前面展示的代码中,您定义了 AutoMLConfig 对象,在其中注意到其中一个属性 preprocess 被设置为 False。您还可以设置 preprocess = True 来启用高级数据预处理。这使您可以同时使用数据预处理和自动特征生成。

注意

执行的自动特征生成类型取决于您计划的机器学习任务。例如,如果您使用自动化 ML 进行分类和回归,自动特征生成可能包括删除高基数或低方差的特征。如果您用于预测,可能会生成与日期时间相关的额外特征,或日期时间与各国节假日的关系。

paml 0401

Figure 4-1. 使用自动化 ML 进行数据预处理

Table 4-3 展示了自动化 ML 使用的自动特征生成功能。

Table 4-3. 由自动化 ML 执行的自动特征生成

预处理和自动特征生成 描述
删除高基数或无方差特征 从训练和验证集中删除这些特征,包括所有值缺失、所有行中具有相同值或极高基数(例如哈希值、ID 或 GUID)的特征。
补充缺失值 对于数值特征,用该列值的平均值进行填补。对于分类特征,用最频繁出现的值进行填补。
生成额外特征 对于日期时间特征:年、月、日、星期几、年的天数、季度、年的第几周、小时、分钟、秒。对于文本特征:基于单个词、双字母和三字符组的词频。
转换和编码 具有少量唯一值的数值特征被转换为分类特征。低基数分类特征执行独热编码;高基数分类特征执行独热哈希编码。
词嵌入 文本特征化器,使用预训练模型将文本标记的向量转换为句向量。在给定文档中,聚合每个词的嵌入向量以生成一个文档特征向量。
目标编码 对于分类特征,将每个类别映射到回归问题的平均目标值。对于分类问题,将每个类别映射到每个类的类概率。应用基于频率的加权和 k 折交叉验证以减少映射过拟合和稀疏数据类别引起的噪声。
文本目标编码 对于文本输入,使用带有词袋的堆叠线性模型生成每个类的概率。
权重证据(WoE) 计算 WoE 作为衡量分类列与目标列相关性的指标。它被计算为类内与类外概率比值的对数。此步骤为每个类输出一个数值特征列,并且无需显式填补缺失值和处理异常值。
聚类距离 在所有数值列上训练 k-均值聚类模型。输出 k 个新特征,每个聚类的样本到聚类中心的距离。

分类和回归的自动特征化

为了展示自动特征化的实际应用,让我们通过使用 NASA 涡轮风扇发动机退化模拟数据集来处理预测维护模型。在此示例中,尽管我们展示了如何使用回归来预测涡轮风扇发动机的剩余使用寿命(RUL)值,但我们也可以将相同的方法应用于分类问题。

为了做到这一点,让我们首先使用接下来的代码块下载数据集。在下载数据集之后,将文件解压缩到数据文件夹,并读取训练数据文件 data/train_FD004.txt。然后,为这 26 个特征添加列名。使用以下代码执行此操作:

# Download the NASA Turbofan Engine Degradation Simulation Dataset
import requests, zipfile, io
import pandas as pd
nasa_dataset_url = https://ti.arc.nasa.gov/c/6/
r = requests.get(nasa_dataset_url)

z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall("data/")
train = pd.read_csv("data/train_FD004.txt", delimiter="\s|\s\s",
          index_col=False, engine='python',
          names=['unit','cycle','os1','os2','os3',
                 'sm1','sm2','sm3','sm4','sm5','sm6','sm7','sm8',
                 'sm9','sm10', 'sm11','sm12','sm13','sm14','sm15','sm16',
                 'sm17','sm18','sm19','sm20','sm21'])

数据科学流程的一个重要部分是探索数据集。由于我们在其他章节中使用了此数据集,因此我们在这里不会探索它。此外,我们将省略创建 Azure 机器学习实验和设置 AutoMLConfig 对象(如前所示)所需的步骤,并直接进行探索当 preprocess 设置为不同值(即 TrueFalse)时的差异和结果质量。

在我们执行此操作之前,让我们定义将在探索中有用的实用函数。我们将创建两个实用函数:print_model()(示例 4-1)和 print_engineered_features()(示例 4-2)。这两个实用函数用于打印模型的管道和自动特征化期间生成的特征,如以下示例所示。

示例 4-1. print_model
from pprint import pprint

def print_model(run, model, prefix=""):
    print(run)
    print("---------")

for step in model.steps:
    print(prefix + step[0])
    if hasattr(step[1], 'estimators') and hasattr(step[1], 'weights'):
         pprint({'estimators': list(e[0] for e in step[1].estimators),
             'weights': step[1].weights})

         print()
         for estimator in step[1].estimators:
            print_model(estimator[1], estimator[0]+ ' - ')
    elif hasattr(step[1], '_base_learners') and
         hasattr(step[1], '_meta_learner'):

         print("\nMeta Learner")
         pprint(step[1]._meta_learner)
         print()

         for estimator in step[1]._base_learners:
            print_model(estimator[1], estimator[0]+ ' - ')
    else:
        pprint(step[1].get_params())
        print()
示例 4-2. print_engineered_features
from pprint import pprint
import pandas as pd
# Function to pretty print the engineered features
def print_engineered_features(features_summary):
    print(pd.DataFrame(features_summary,
          columns=["RawFeatureName",
                   "TypeDetected",
                   "Dropped",
                   "EngineeredFeatureCount",
                   "Tranformations"]))

现在我们已经定义了这两个实用函数,让我们探索一个实验的两次迭代,其中 preprocess 被设置为 False,并且输出中显示的数据预处理类似。 (图 4-1 显示了实验提交后的输出。)实验的第 4 和第 5 次迭代使用了相同的数据处理技术(StandardScalerWrapper)和相同的机器学习算法(LightGBM)。两次迭代之间有什么区别,以及它们为什么显示出两个不同的 R2 分数值?第 5 次迭代(R2 分数为 0.6220)似乎比第 4 次迭代(R2 分数为 0.4834)表现更好。

使用 local_run.get_output(),我们提取了经过训练的第 4 和第 5 次迭代的运行和模型。运行信息存储在 explore_run1explore_run2 中,而模型细节则存储在 explore_model1explore_model2 中:

explore_run1, explore_model1 = local_run.get_output(iteration = 4)
explore_run2, explore_model2 = local_run.get_output(iteration = 5)

在提取了运行信息和模型细节后,让我们仔细查看它们。从所示的第 4 和第 5 次迭代的输出中,您会注意到超参数值不同(例如,max_binmax_depthlearning_ratereg_alphareg_lambda 等)。这些超参数值由经过训练的自动 ML 元模型确定,该模型用于决定哪个机器学习流水线对数据集最相关(参见示例 4-3 和 4-4)。

注意

查看更多有关自动化机器学习工作原理的信息,请参阅 第二章。

示例 4-3. 迭代 4 的运行和模型信息
Run(Experiment: automl-predictive-rul-ch07,
Id: AutoML_0dc694bd-da06-47aa-b4f4-077d1696d553_4,
Type: None,
Status: Completed)
---
StandardScalerWrapper
{'class_name': 'StandardScaler',
 'copy': True,
 'module_name': 'sklearn.preprocessing.data',
 'with_mean': False,
 'with_std': True}

LightGBMRegressor
{'boosting_type': 'gbdt',
 'class_weight': None,
 'colsample_bytree': 0.7000000000000001,
 'importance_type': 'split',
 'learning_rate': 0.1894742105263158,
 'max_bin': 7,
 'max_depth': 3,
 'min_child_samples': 139,
 'min_child_weight': 0.001,
 'min_split_gain': 0.9473684210526315,
 'n_estimators': 800,
 'n_jobs': 1,
 'num_leaves': 7,
 'objective': None,
 'random_state': None,
 'reg_alpha': 0.075,
 'reg_lambda': 0.6,
 'silent': True,
 'subsample': 0.7999999999999999,
 'subsample_for_bin': 200000,
 'subsample_freq': 0,
 'verbose': −1}
示例 4-4. 迭代 5 的运行和模型信息
Run(Experiment: automl-predictive-rul-ch07,
Id: AutoML_0dc694bd-da06-47aa-b4f4-077d1696d553_5,
Type: None,
Status: Completed)
---
StandardScalerWrapper
{'class_name': 'StandardScaler',
 'copy': True,
 'module_name': 'sklearn.preprocessing.data',
 'with_mean': True,
 'with_std': True}

LightGBMRegressor
{'boosting_type': 'gbdt',
 'class_weight': None,
 'colsample_bytree': 0.5,
 'importance_type': 'split',
 'learning_rate': 0.1789484210526316,
 'max_bin': 255,
 'max_depth': 9,
 'min_child_samples': 194,
 'min_child_weight': 0.001,
 'min_split_gain': 0.9473684210526315,
 'n_estimators': 100,
 'n_jobs': 1,
 'num_leaves': 127,
 'objective': None,
 'random_state': None,
 'reg_alpha': 1.125,
 'reg_lambda': 0.75,
 'silent': True,
 'subsample': 0.7,
 'subsample_for_bin': 200000,
 'subsample_freq': 0,
 'verbose': −1}

接下来,让我们看看工程特征的名称。为此,您可以使用函数 get_engineered_feature_names()。代码显示了如何通过使用 local_run.get_output() 检索最佳运行和模型,然后提取工程特征的名称:

best_run, fitted_model = local_run.get_output()
fitted_model.named_steps['datatransformer']. get_engineered_feature_names ()

图 4-2 显示了输出。在这个例子中,您将看到工程特征是通过在现有特征上使用 MeanImputer 转换来导出的。没有添加额外的特征。

paml 0402

图 4-2. 工程特征的名称

让我们深入了解更多关于工程特征的细节。为此,使用 get_featurization_summary() 函数。我们之前定义的 print_engineered_features() 实用函数将帮助我们漂亮地打印输出并使其更易于阅读。

图 4-3 显示了工程特征的摘要。对于每个原始特征,您会看到应用了 MeanImputer 转换,并且新工程特征的计数为 1。您还会观察到在数据预处理和自动特征化时未丢弃任何特征:

# Get the summary of the engineered features
features_summary =
   fitted_model.named_steps['datatransformer'].get_featurization_summary()
print_engineered_features(features_summary)

paml 0403

图 4-3. 工程特征总结

用于时间序列预测的自动特征化

在下一个示例中,我们展示了如何为时间序列数据集执行数据预处理和自动特征工程,其中某些特征的数据类型为 DateTime

让我们开始下载样本能源需求数据集(图 4-4 显示了运行代码的输出):

import requests, zipfile, io

# Download the data for energy demand forecasting

nyc_energy_data_url =
"https://raw.githubusercontent.com/Azure/MachineLearningNotebooks/master/
          how-to-use-azureml/automated-machine-learning/
          forecasting-energy-demand/nyc_energy.csv"

r = requests.get(nyc_energy_data_url)
open('data/nyc_energy.csv', 'wb').write(r.content)

data = pd.read_csv('data/nyc_energy.csv', parse_dates=['timeStamp'])
data.head()

在 图 4-4 中,您可以看到能源需求时间序列数据集由以下五列组成:ID(最左列)、timestampdemandpreciptemp

paml 0404

图 4-4. 探索能源需求时间序列数据集

让我们使用以下代码对数据进行简单的绘图(图 4-5 显示输出结果):

import matplotlib.pyplot as plt

time_column_name = 'timeStamp'
target_column_name = 'demand'

ax = plt.gca()
data.plot(kind='line',x=time_column_name,y=target_column_name,ax=ax)
plt.show()

paml 0405

图 4-5. 能源需求时间序列数据集的可视化

接下来,让我们将数据拆分为训练集和测试集,将 2017-02-01 之前的观察(训练集)和 2017-02-01 之后的观察(测试集)分开。我们将目标列(需求值列)提取为 y_trainy_test

X_train = data[data[time_column_name] < '2017-02-01']
X_test = data[data[time_column_name] >= '2017-02-01']
y_train = X_train.pop(target_column_name).values
y_test = X_test.pop(target_column_name).values

让我们指定用于预测的自动化 ML 配置。在随后的代码中,请注意,我们将评估指标指定为 AutoMLConfig 对象的标准化均方根误差(RMSE)。我们还使用 time_column_name 指定了 DateTime 列。

由于数据的每行表示每小时的观测值,因此通过使用 max_horizon 属性指定预测的时间范围非常重要。假设您想预测未来一天(即 24 小时),则 max_horizon 的值设置为 24。在本示例中,我们不需要考虑 country_or_region 属性;因此,我们对其进行了注释。

time_series_settings = {
    "time_column_name": time_column_name,
    "max_horizon": 24
    #"country_or_region" : 'US',
}

automl_config = AutoMLConfig(task = 'forecasting',
                   primary_metric='normalized_root_mean_squared_error',
                   iterations = 10,
                   iteration_timeout_minutes = 5,
                   X = X_train,
                   y = y_train,
                   n_cross_validations = 3,
                   path=project_folder,
                   verbosity = logging.INFO,
                   **time_series_settings)

现在您已经定义了 AutoMLConfig 对象,可以准备提交实验。图 4-6 展示了运行实验的输出。运行自动化 ML 实验时,您会看到实验从对时间序列数据集执行自动特征工程开始。这些步骤包括“当前状态:DatasetFeaturization. 开始对数据集进行特征工程。”和“当前状态:DatasetFeaturizationCompleted. 完成对数据集的特征工程。”特征工程完成后,将开始使用自动化 ML 进行模型选择。

paml 0406

图 4-6. 运行自动化 ML 实验

在模型选择过程中,自动化 ML 运行了多个迭代。每个迭代使用不同的数据预处理方法(例如RobustScalerStandardScalerWrapperMinMaxScalerMaxAbsScaler)和预测算法(ElasticNetLightGBLassoLarsDecisionTreeRandomForest)。最后两个迭代使用了不同的集成方法(例如VotingEnsembleStackEnsemble)。在此特定示例中,第 9 次迭代达到了最佳结果,使用了StackEnsemble

local_run = experiment.submit(automl_config, show_output=True)

现在,让我们检索有关最佳运行和模型的详细信息。图 4-7 显示了工程特征的摘要。由于这是一个时间序列数据集,你会注意到针对时间戳的 11 个额外特征是自动生成的(即EngineeredFeatureCount显示为 11),全部为DateTime数据类型。

best_run, fitted_model = local_run.get_output()

# Get the summary of the engineered features
fitted_model.named_steps['timeseriestransformer'].get_featurization_summary()

paml 0407

图 4-7. 检索最佳运行的信息

现在让我们检查为DateTime列自动生成的特征。为此,我们将使用fitted_model执行预测,使用我们之前定义的测试数据。从以下代码中,我们调用forecast函数,并将结果存储在变量y_fcstX_trans中:

best_run, fitted_model = local_run.get_output()

y_query = y_test.copy().astype(np.float)
y_query.fill(np.NaN)
y_fcst, X_trans = fitted_model.forecast(X_test, y_query)

接下来我们转向X_trans。在图 4-8 中,您可以看到这 11 个工程特征,它们将DateTime列分成了时间部分(例如年、半年、季度、月份、日、小时、上午/下午、12 小时制、周日和周数)。将其从DateTime转换为数值使其更有意义,并且在训练和评分过程中更容易被机器学习算法使用。

paml 0408

图 4-8. 用于时间序列预测的工程特征

结论

在本章中,您了解了特征工程的重要性,以及它如何影响生成的机器学习模型的质量。特征工程是一门艺术:要做好特征工程,重要的是理解其基础知识,接受在职培训,并在通过各种机器学习项目时建立特征工程工具箱。近年来,机器学习社区一直在创新 Python 库,以实现自动特征工程。例如,您可以使用 Python 包featuretools利用实体之间的关系执行深度特征合成等操作。

本章重点讨论了如何在 Azure 机器学习服务中利用自动化 ML 提供的自动特征工程能力。通过回归和预测的示例,我们探讨了如何在自动化 ML 中启用自动特征工程,以及如何理解工程特征。

虽然自动化机器学习提供了自动特征工程的能力(这些能力不断改进和演变),但请注意它并不详尽涵盖所有特征工程的方面。在使用数据集作为自动化机器学习的输入之前,数据科学家有必要进行特征工程,利用领域专业知识。

第五章:部署自动化机器学习模型

Microsoft Azure Machine Learning 可以帮助您管理机器学习模型的生命周期。使用 Azure Machine Learning 的自动化 ML 工具训练模型后,您可以检索识别出的最佳模型,并将其注册到 Azure Machine Learning 中。模型注册使您能够在机器学习工作区中存储不同版本的模型,并且可以轻松部署模型到不同的目标环境。

在本章中,我们将探讨如何使用 Azure Machine Learning 执行以下操作:

  • 注册由自动化 ML 生成的最佳模型。

  • 指定和开发评分文件。评分文件将作为生成的容器映像的一部分包含在内。

  • 将模型部署到 Microsoft Azure 容器实例(ACI)和 Azure Kubernetes 服务(AKS)。

  • 在模型和 Web 服务部署期间进行故障排除。

模型部署

在 第三章 中,您学习了如何使用自动化 ML 构建机器学习模型。在本节中,您将学习如何注册和部署由自动化 ML 识别出的最佳模型。Azure Machine Learning 支持一系列丰富的部署环境,包括托管在 Azure 中的 REST API,以及部署到不同边缘设备和硬件的模型。这些环境包括以下内容:

  • Azure Machine Learning 计算

  • ACI

  • AKS

  • Azure IoT Edge

提示

要了解 Azure Machine Learning 支持的最新部署选项列表,请访问有关部署模型的 Microsoft 页面

现在,让我们详细介绍您将用于注册、部署和测试由自动化 ML 生成的最佳模型的步骤:

  1. 检索最佳模型。

  2. 注册模型。

  3. 创建容器映像。

  4. 将模型部署到测试环境,然后进行测试。

  5. 将模型部署到生产环境。

因为部署模型到不同环境的步骤相似,我们专注于部署到 ACI。

要开始模型部署,您需要一个或多个训练好的机器学习模型。如果您尚未拥有训练好的模型,您可以按照本书的 GitHub 存储库 中描述的步骤,训练一个简单的预测维护回归模型。使用 AutoMLConfig 对象创建自动化 ML 运行并提交实验的代码如下:

Automl_config = AutoMLConfig(task = 'regression',
                   primary_metric = 'r2_score',
                   iteration_timeout_minutes = 15,
                   iterations = 10,
                   max_cores_per_iteration = 1,
                   preprocess = False,
                   experiment_exit_score = 0.985,
                   X = X_train,
                   y = y_train,
                   X_valid = X_valid,
                   y_valid = y_valid,
                   debug_log = 'automl_errors.log',
                   verbosity=logging.ERROR,
                   path=project_folder)

# Training the predictive maintenance model using AutoML
experiment=Experiment(ws, experiment_name)
local_run = experiment.submit(Automl_config, show_output=True)

在实验成功完成后(参见 图 5-1),您将可以访问 local_run 对象,用于注册模型。

paml 0501

图 5-1. 自动化 ML 实验的输出
注意

本章讨论的使用自动化 ML 构建和部署预测性维护模型的示例笔记本可在https://bit.ly/2k2e6VC获取。

预测性维护模型使用了 NASA 涡轮风扇故障数据集。有关数据集的更多详细信息,请访问https://go.nasa.gov/2J6N1eK

注册模型

在注册训练好的模型之前,您可以使用get_output()函数了解与表现最佳模型对应的运行更多信息。get_output()函数同时返回最佳运行和相应的拟合模型。

注意

您可以注册哪些类型的机器学习模型?您可以使用 Azure 机器学习注册 Python 或 R 模型,以及使用 Azure 机器学习训练的模型或外部可用的预训练模型。

图 5-2 显示了运行下面代码块的输出。您会注意到在幕后创建了一个回归管道。回归管道包括几个步骤:StackEnsembleRegressorStandardScalerWrapperLightGBMRegressor)。请注意,交叉验证的折数设置为5

best_run, fitted_model = local_run.get_output()
print(best_run)
print(fitted_model)

paml 0502

图 5-2. 检索最佳运行和相应拟合模型的详细信息

您现在可以准备注册模型了。首先,您指定模型的描述和标签,然后使用register_model()函数将模型注册到 Azure 机器学习中。通过注册模型,您将模型存储和版本化在云中。

每个注册的模型由其名称和版本标识。当您多次注册模型(使用相同名称)时,注册表将逐步更新注册表中存储的模型版本。元数据标签使您能够为注册到模型注册表中的模型提供更多信息。您可以使用在注册模型时提供的元数据标签搜索模型。

注册模型后,您可以获取模型的标识符。在以下代码中,您使用local_run.model_id检索标识符(图 5-3 显示了运行代码的输出):

# Register best model in workspace
description = 'AutoML-RUL-Regression-20190510'
tags = None
model = local_run.register_model(description = description, tags = tags)

print(local_run.model_id)

paml 0503

图 5-3. 获取注册到 Azure 机器学习的模型标识符

到目前为止,您已经学会如何使用 register_model() 函数注册使用 Azure Machine Learning 训练的模型。您可能已经在没有使用 Azure Machine Learning 的情况下训练了一个模型,或者从外部模型仓库(或模型库)获取了一个模型。例如,要注册在此 repo中提供的 MNIST 手写数字识别 ONNX 模型,可以使用 Model.register(),通过提供模型的本地路径来注册它。以下代码展示了如何操作:

onnx_model_url = https://onnxzoo.blob.core.windows.net/models/opset_1/
                         mnist/mnist.tar.gz

urllib.request.urlretrieve(onnx_model_url, filename="mnist.tar.gz")
!tar xvzf mnist.tar.gz
model = Model.register(workspace = ws,
                       model_path ="mnist/model.onnx",
                       model_name = "onnx_mnist",
                       tags = {"onnx": "automl-book"},
                       description = "MNIST ONNX model",)
提示

您可以在 Microsoft 的模型文档页面上找到更多关于 Model 类的信息。

创建容器映像

接下来,我们将努力将模型部署为 REST API。Azure Machine Learning 帮助您创建容器映像。容器映像可以部署到任何支持 Docker 的环境中(包括在本地运行的 Docker)。在本章中,您将学习如何使用 ACI 或 AKS 部署和提供模型。

要完成这一步骤,您需要创建一个评分文件(score.py)和一个 YAML 文件(myenv.yml)。评分文件用于加载模型、进行预测,并在调用 REST API 时返回结果。在评分文件中,您会注意到需要定义两个函数:init()run(rawdata)

函数 init() 用于将模型加载到全局模型对象中。当启动 Docker 容器时,该函数仅运行一次。函数 run() 用于基于传递给它的输入数据预测值。因为此代码主要用于 web 服务,所以通过 rawdata 传递的输入是一个 JSON 对象。在将其传递给模型进行预测之前,需要对 JSON 对象进行反序列化,如以下代码所示:

%%writefile score.py

import pickle
import json
import numpy
import azureml.train.automl
from sklearn.externals import joblib
from azureml.core.model import Model

def init():
    global model

    # This name is model.id of model that we want to deploy
    model_path = Model.get_model_path(model_name = '<<modelid>>')

    # Deserialize the model file back into a sklearn model
    model = joblib.load(model_path)

 def run(input_data):
     try:
         data = json.loads(input_data)['input_data']
         data = np.array(data)
         result = model.predict(data)
         return result.tolist()
     except Exception as e:
         result = str(e)
         return json.dumps({"error": result})

代码运行后,内容将写入名为 score.py 的文件中。图 5-4 显示了运行代码的输出。稍后,我们将使用 local_run.model_id 的实际模型标识符值替换 <<modelid>> 的值。

paml 0504

图 5-4. 创建评分文件—score.py

创建评分文件后,从运行中识别出依赖项,并创建 YAML 文件,如以下代码所示(图 5-5 显示了运行代码的输出):

experiment = Experiment(ws, experiment_name)
ml_run = AutoMLRun(experiment = experiment, run_id = local_run.id)

dependencies = ml_run.get_run_sdk_dependencies(iteration = 0)

for p in ['azureml-train-automl', 'azureml-sdk', 'azureml-core']:
    print('{}\t{}'.format(p, dependencies[p]))

paml 0505

图 5-5. 检索 Azure Machine Learning SDK 的版本

识别出依赖项后,您可以使用函数 CondaDependencies.create() 指定所有依赖项来创建 YAML 文件。该函数创建环境对象,并通过函数 save_to_file() 将其序列化到 myenv.yml 文件中。图 5-6 显示了运行以下代码的输出:

from azureml.core.conda_dependencies import CondaDependencies
myenv = CondaDependencies.create(conda_packages=[
                  'numpy','scikit-learn','lightgbm'],
                  pip_packages=['azureml-sdk[automl]'])
conda_env_file_name = 'myenv.yml'
myenv.save_to_file('.', conda_env_file_name)

paml 0506

图 5-6. 创建环境 YAML 文件—myenv.yml

现在我们已经创建了得分和环境的 YAML 文件,我们可以更新文件的内容,用之前获取的 Azure 机器学习 SDK 的版本和模型标识符。以下代码读取文件,替换受影响的值,并将其写回磁盘:

with open(conda_env_file_name, 'r') as cefr:
   content = cefr.read()
with open(conda_env_file_name, 'w') as cefw:
   cefw.write(content.replace(azureml.core.VERSION, dependencies['azureml-sdk']))

# Substitute the actual model id in the script file.
script_file_name = 'score.py'

with open(script_file_name, 'r') as cefr:
   content = cefr.read()
with open(script_file_name, 'w') as cefw:
   cefw.write(content.replace('<<modelid>>', local_run.model_id))

现在值已替换,您可以配置并创建容器镜像,并将其注册到 ACI。在容器镜像的配置中,使用函数ContainerImage.image_configuration()指定所使用的运行时,提供 Conda 依赖项的环境文件,元数据标签以及容器镜像的描述。

当您调用Image.create()时,Azure 机器学习会构建容器镜像,并将容器镜像注册到 ACI。运行容器创建代码(从“Creating image”到“Running”)通常需要几分钟时间。通过使用image.creation.status,您可以了解镜像创建是否成功。图 5-7 显示了运行以下代码并验证容器创建成功的输出:

from azureml.core.image import Image, ContainerImage

image_config = ContainerImage.image_configuration(
                    runtime= "python",
                    execution_script = script_file_name,
                    conda_file = conda_env_file_name,
                    tags = {'area': "pred maint",
                            'type': "automl_regression"},
                    description = "Image for AutoML Predictive maintenance")
image = Image.create(name = "automlpredmaintimage",
                    models = [model],
                    image_config = image_config,
                    workspace = ws)
image.wait_for_creation(show_output = True)
if image.creation_state == 'Failed':
   print("Image build log at: " + image.image_build_log_uri)

paml 0507

图 5-7. 为预测维护模型创建 Docker 容器

部署模型进行测试

成功创建 Docker 容器镜像后,您可以准备部署模型。您可以将容器部署到任何支持 Docker 的环境中(包括本地运行的 Docker)。这些环境包括 Azure 机器学习计算、ACI、AKS、IoT Edge 等。首先,将 Docker 容器部署到 ACI 进行测试。为此部署,执行以下操作:

  1. 指定部署配置。

  2. 将 Docker 镜像部署到 ACI。

  3. 检索评分 URI。

AciWebservice类用于指定部署配置。首先,我们为 ACI Web 服务指定配置。在以下代码中,我们指定使用一个 CPU 核心和 2GB 内存的配置。此外,我们还添加了元数据标签和描述:

from azureml.core.webservice import AciWebservice
aciconfig = AciWebservice.deploy_configuration(cpu_cores=1,
                     memory_gb=2,
                     tags={"data": "RUL",  "method" : "sklearn"},
                     description='Predict RUL with Azure AutoML')

接下来,我们使用Webservice类将 Docker 镜像部署到 ACI。在调用deploy_from_image()后,我们使用wait_for_deployment(True)等待 Web 服务部署到 ACI 的完成。完成后,我们打印 ACI Web 服务的状态。图 5-8 显示了运行以下代码的输出:

from azureml.core.webservice import Webservice

aci_service_name = 'automl-book-pred-maint'
print(aci_service_name)

aci_service = Webservice.deploy_from_image(
                         deployment_config = aciconfig,
                         image = image,
                         name = aci_service_name,
                         workspace = ws)
aci_service.wait_for_deployment(True)
print(aci_service.state)
注意

Webservice类提供了各种部署功能,包括从图像(我们这里使用的)和从Model对象部署模型到本地进行测试,以及更多功能。要了解如何使用WebService类的各种功能,请参阅微软文档页面

paml 0508

图 5-8. 将 Web 服务部署到 ACI 并检查操作是否完成
提示

在这里,您正在学习如何使用 Azure 机器学习 SDK 部署由自动化 ML 创建的模型。Azure 机器学习支持使用 Azure CLI 部署模型,通过命令 az ml model deploy。要了解如何操作,请参阅 此 Microsoft Azure 文档页面

ACI 服务部署完成后,您可以使用 Azure 门户查看部署情况。创建基于 ACI 的 Web 服务后,您会注意到以下情况:

  • 在 Azure 机器学习工作区中创建了一个部署(见 图 5-9)。

  • 创建 ACI 实例进行部署时,会部署两个容器:azureml-fe-aci(包括 AppInsights 日志记录的 Azure 机器学习 ACI 前端)和一个包含评分代码的容器(在部署期间提供的名称)。

paml 0509

图 5-9. Azure 门户—验证部署到 ACI 的完成情况

使用 Azure 门户,您可以导航到创建的 ACI,并单击容器。您将看到上述两个容器。单击评分容器,然后单击日志。您可以观察接收到的输入及其处理方式。您还可以单击连接选项卡连接到容器。对于启动命令,请选择 /bin/bash,然后单击连接。

如果导航到 /var/azureml-app,您将找到在部署期间指定的文件(例如 score.py)以及用于启用 Web 服务实例化所需的其他支持文件。

一旦从镜像部署成功,您将获得一个评分 URI,可用于测试已部署的模型:

print(aci_service.scoring_uri)

图 5-10 显示了创建的 Web 服务的评分 URI。

paml 0510

图 5-10. 新 Web 服务的评分 URI

使用 Azure 门户,您还可以深入了解部署日志,或使用门户连接到正在运行的容器。图 5-11 显示了在 ACI 中部署的容器。

paml 0511

图 5-11. Azure 门户显示已部署的容器实例

图 5-12 显示了在部署容器中运行的进程。

paml 0512

图 5-12. 连接到运行中的容器

测试已部署的模型

通过将 Web 服务部署到 ACI,现在可以准备测试 Web 服务。为此,从 X_test 中随机选择一行。X_test 包含 NASA 数据的测试行。然后构造 JSON 负载,并执行 POST 到评分 URI,返回结果。图 5-13 显示了运行以下代码的输出:

import requests
import json

# Send a random row from the test set to score
random_index = np.random.randint(0, len(X_test)-1)
X_test_row = X_test[random_index : (random_index+1)]
Y_test_row = y_test[random_index : (random_index+1)]

input_data = "{\"input_data\": " + str(X_test_row.values.tolist()) + "}"

headers = {'Content-Type':'application/json'}
resp = requests.post(aci_service.scoring_uri, input_data, headers=headers)

print("POST to url", aci_service.scoring_uri)
print("input data:", input_data)
print("label:", Y_test_row)
print("prediction:", resp.text)
print(resp.status_code)
print(requests.status_codes._codes[resp.status_code])

paml 0513

图 5-13. 使用 NASA 数据集测试 ACI Web 服务

请注意,在此示例中,我们直接向评分 URI 发送 POST 请求。因为 Web 服务由 ACI 实例支持,因此未启用身份验证。将模型部署到 ACI 对于快速部署和验证模型以及测试正在开发中的模型非常有利。

部署到 AKS

对于生产部署,请考虑将模型部署到 AKS。要做到这一点,您需要创建一个 AKS 集群。您可以使用 Azure CLI 或 Azure Machine Learning SDK 创建集群。创建 AKS 集群后,您可以使用它来部署多个映像。

让我们从使用以下代码创建 AKS 集群开始:

from azureml.core.compute import AksCompute, ComputeTarget

# Use the default configuration
# You can also customize the AKS cluster based on what you need
prov_config = AksCompute.provisioning_configuration()

aks_name = 'myaks'

# Create the cluster
aks_target = ComputeTarget.create(workspace = ws,
                     name = aks_name,
                     provisioning_configuration = prov_config)
# Wait for the AKS cluster to complete creation
aks_target.wait_for_completion(show_output = True)

创建了 AKS 集群之后,您可以将模型部署到服务中。在以下代码中,请注意我们将创建的 AKS 集群指定为deployment_target

from azureml.core.webservice import AksWebservice

aks_service_name = 'aks-automl-book-pred-maint'
print(aks_service_name)

aks_target = AksCompute(ws,"myaks")

aks_service = AksWebservice.deploy_from_image(image = image,
                           name = aks_service_name,
                           deployment_target = aks_target,
                           workspace = ws)

aks_service.wait_for_deployment(True)
print(aks_service.state)

将模型部署到 AKS 后,您需要在请求的头部指定服务密钥,然后才能调用评分 URI。为此,请修改您之前开发的测试评分代码:

import requests
import json

# Send a random row from the test set to score
random_index = np.random.randint(0, len(X_test)-1)
X_test_row = X_test[random_index : (random_index+1)]
Y_test_row = y_test[random_index : (random_index+1)]

input_data = "{\"input_data\": " + str(X_test_row.values.tolist()) + "}"

# For AKS deployment you need the service key in the header as well
headers = {'Content-Type':'application/json'}
api_key = aks_service.get_keys()[0]
headers = {'Content-Type':'application/json',
                          'Authorization':('Bearer '+ api_key)}

resp = requests.post(aks_service.scoring_uri, input_data, headers=headers)

print("POST to url", aks_service.scoring_uri)
print("input data:", input_data)
print("label:", Y_test_row)
print("prediction:", resp.text)
print(resp.status_code)

Web 服务的 Swagger 文档

将机器学习 Web 服务部署到各种计算环境后,提供良好的文档描述如何使用 API 非常重要。这有助于加速依赖 API 进行预测的应用程序的开发。由于您需要管理的机器学习 API 在时间上会发生变化(特别是在开发过程中),因此保持文档的及时更新至关重要。

Swagger是一个开源软件框架,许多开发人员在设计、开发和文档化 RESTful Web 服务时使用它。Swagger 文档使开发人员能够快速描述和记录 Web 服务的输入和输出。Swagger 文档已经逐步发展成为描述 RESTful API 的常见方式。自动生成的 Swagger 文档有助于确保在部署机器学习模型并将其作为 Web 服务提供时始终可用最新信息。

在使用 Azure Machine Learning 部署模型时,您可以在创建评分文件时使用 Python 的inference-schema包。inference-schema包允许您添加函数装饰器,以便生成 Swagger 文档并强制执行模式类型。

首先,从inference-schema包中导入相关类,如下所示:

from inference_schema.schema_decorators import input_schema, output_schema
from inference_schema.parameter_types.numpy_parameter_type import
                                      NumpyParameterType

导入各种类之后,您可以通过为run()函数提供input_schemaoutput_schema装饰器来指定输入和输出模式。示例输入和输出数据作为input_sampleoutput_sample变量的一部分提供:

@input_schema('input_data', NumpyParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))

下面的代码展示了score.py文件,指定了装饰器:

%%writefile score.py
import pickle
import json
import numpy as np
from sklearn.externals import joblib

import azureml.train.automl
from azureml.core.model import Model

from inference_schema.schema_decorators import input_schema, output_schema
from inference_schema.parameter_types.numpy_parameter_type
                                            import NumpyParameterType

def init():
    global model

    # Identifier for the model (model.id) to be deployed
    model_path = Model.get_model_path(model_name = '<<modelid>>')

    # Deserialize the model file back into a sklearn model
    model = joblib.load(model_path)
X_test_row = np.array([[-0.0006, −0.0004, 100.0, 518.67,
               642.25, 1589.25, 1412.42, 14.62, 21.61, 553.88,
               2388.15, 9043.21, 1.3, 47.45, 521.88, 2388.18,
               8131.61, 8.4807, 0.03, 392.0, 2388.0,
               100.0, 38.6, 23.2946]])

input_sample = X_test_row
output_sample = np.array([120.0])

@input_schema('input_data', NumpyParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(input_data):

   try:
        result = model.predict(input_data)
        return result.tolist()

   except Exception as e:
        result = str(e)
        return json.dumps({"error": result})

当你定义了 score.py 文件并且模型已部署后,你可以使用 Swagger URI 获取 Swagger,使用 print(aci_service.swagger_uri)

这使你能够下载包含 API 的 Swagger 文档的 swagger.json 文件。想查看生成的 swagger.json 示例,请访问本书的GitHub 仓库。你还可以通过导入 API 使用 SwaggerHub 生成文档。

调试部署

在部署机器学习模型到各种计算环境(如 ACI、AKS)的过程中,你可能会遇到部署失败(如容器终止)或评分 API 未返回预期结果的情况。在本节中,我们将介绍一些常见的部署失败情况,并向你展示如何解决它们。

Web 服务部署失败

创建容器映像并使用 Webservice.deploy_from_image() 部署映像后,ACI 部署可能会失败,Web 服务将不可用。因此,你可能会看到以下错误消息:

[test]

FailedACI service creation operation finished, operation "Failed"
Service creation polling reached terminal state, current service state: Failed
{
  "code": "AciDeploymentFailed",
   "message": "Aci Deployment failed with exception: Your container application
   crashed. This may be caused by errors in your scoring file's init() function.
   Please check the logs for your container instance automl-book-pred-maint2.
   You can also try to run image
   automatedmlnf2e4863f.azurecr.io/automlpredmaintimage-bug:1 locally.
   Please refer to http://aka.ms/debugimage for more information.",
   "details": [
   {
      "code": "CrashLoopBackOff",
      "message": "Your container application crashed. This may be caused by
      errors in your scoring file's init() function.
      \nPlease check the logs for your container instance
                                                automl-book-pred-maint2.
      \nYou can also try to run image
      automatedmlnf2e4863f.azurecr.io/automlpredmaintimage-bug:1 locally.
      Please refer to http://aka.ms/debugimage for more information."
   }
 ]
}
Failed

若要调试导致服务创建失败的原因,请使用错误消息中提供的 URI 下载容器映像。同时,你可以使用 Azure 门户进行调查。导航至创建了 Azure 机器学习工作区的资源组,并找到对应于正在创建的服务的 ACI。图 5-14 显示了 ACI 的示例。进行调查时,请执行以下操作:

  1. 在左侧窗格中,点击 Containers。

    paml 0514

    图 5-14. 部署容器映像的容器实例 (automl-book-pred-maint2)
  2. 点击显示状态为 Waiting 的容器,以及上一个状态为 Terminated 的容器,如 图 5-15 所示。

    paml 0515

    图 5-15. 调查 ACI 中终止的容器
  3. 点击 Logs 标签,你将看到日志和导致容器启动失败的错误,如 图 5-16 所示。

    paml 0516

    图 5-16. 导致容器启动失败的错误
提示

欲了解如何排查 Azure 机器学习 AKS 和 ACI 部署问题,请参阅此Microsoft 文档页面

结论

在本章中,你学习了如何注册、部署和测试由自动 ML 生成的模型到 ACI。你还学会了如何指定 Web 服务的输入和输出模式,以便生成 Swagger 文档。有时你可能会遇到有错误的评分脚本导致部署失败,容器可能无法启动。针对这些情况,你学会了如何使用 Azure 门户以及 Azure 机器学习 Python SDK 来调试失败的部署。

第六章:分类和回归

成功实施机器学习的关键因素之一(基于与许多数据科学家、机器学习工程师和产品经理的讨论)是能够将业务问题和期望的结果映射到适当的机器学习问题上(或者进行坦率的对话,说明机器学习无法解决问题!)。分类回归是常用的两种机器学习技术。

在本章中,我们涵盖了分类和回归的基础知识,并展示了如何将业务用例映射到分类或回归问题。您将学习如何使用 Microsoft Azure 机器学习——特别是自动化 ML——自动选择适合您特定用例的最佳分类或回归模型。

提示

需要开始使用 Azure 机器学习?

如果您刚开始使用 Azure 机器学习,请参考第三章了解基本概念,然后再深入本章内容。

什么是分类和回归?

在监督学习中,您有一组独立特征 X 和一个目标特征 Y。机器学习的任务是从 X → Y 进行映射。分类和回归都是监督学习,要求有标记数据的可用性。

要训练一个在测试数据和泛化到新的未见数据时表现良好的高质量模型,示例需要充分代表测试数据。许多监督学习算法的一个基本假设是,训练示例的数据分布与测试示例的数据分布相同(包括未见示例)。

在许多实际问题中,这通常是不正确的。你的数据可能要么具有你想要预测的目标特征的极少数对象(称为类不平衡少数类问题),要么质量不佳。在某些情况下,你甚至可能没有标记数据!多年来,机器学习社区发明了处理这些问题的聪明方法(例如使用合成少数过采样技术,或 SMOTE,来处理类不平衡),但详细讨论这些方法超出了本书的范围。

当 Y 是一个离散特征,并且您试图预测类别/标签时,您正在处理一个分类问题。分类有助于预测对象属于哪个类别(或类)。当分类用于具有两个不同类别的数据时,我们通常称之为二元分类。如果有超过两个不同类别,则是多类分类问题。例如,预测一个人是好还是坏的信用风险是一个二元分类问题(因为有两个不同的类别:好或坏)。预测书籍类别(例如童话、烹饪书、传记、旅行等)是一个多类分类问题。

当 Y 是您试图预测的连续特征时,您正在处理一个回归问题。回归有助于预测连续值。例如,在制造业的预测性维护场景中,回归模型用于预测系统和设备的寿命。在医疗保健中,回归用于预测医疗保健成本、患者住院时间等。图 6-1 展示了训练和评估机器学习模型的典型数据科学流程。该工作流程适用于分类和回归问题。

paml 0601

图 6-1. 训练分类/回归模型

首先将数据分为训练数据和测试数据。训练数据作为分类/回归算法的输入。一旦完成训练,将生成一个机器学习模型,随后使用测试数据进行评估。作为模型评估的一部分,您将计算不同类型的指标(例如,精确度,准确度,AUC,F1-score 等),这有助于确定其质量。

让我们通过信用风险评分的示例来说明这一点。在金融服务中,信用风险评分使银行能够为客户做出信贷决策。德国信用风险数据集包含 1,000 行(表 6-1 显示了数据集的一个子集)。每行使用一组特征(或属性)来描述一个人。最后一列是类/标签(即信用风险),提供有关该人是否存在信用风险的信息。

德国信用风险数据集可以在UCI 机器学习库中找到。该数据集由汉斯·霍夫曼教授于 1994 年贡献给机器学习社区,包含 20 个特征(7 个数值特征,13 个分类特征)和一个信用风险标签。

从 UCI 机器学习库下载文件german.data

import pandas as pd
columns = ['status_checking_acc', 'duration_months', 'credit_history',
     'purpose', 'credit_amount', 'saving_acc_bonds',
     'present_emp_since','installment_rate', 'personal_status',
     'other_debtors', 'residing_since', 'property', 'age_years',
     'inst_plans', 'housing', 'num_existing_credits', 'job',
     'dependents', 'telephone', 'foreign_worker', 'status']

creditg_df = pd.read_csv(
     'https://archive.ics.uci.edu/ml/machine-learning-databases/statlog
                                    /german/german.data',
delim_whitespace = True, header = None )
# Assign the header row to
creditg_df.columns = columns

# Get the initial rows of data
creditg_df.head()

当您下载数据后,请注意每行中的前几列(例如,现有账户状态、持续时间、信用历史、外籍工人)描述了不同的个人属性。在表 6-1 中,您可以看到第一列显示了个人支票账户的账户状态。A11 到 A13 表示支票账户中的可用金额(金额以德国马克(DM)计算,即 2002 年前的德国货币)。A14 表示该人没有支票账户。出于说明目的,我们省略了许多特征。最后一列显示了信用风险:值为 1 表示没有信用风险,2 表示有信用风险。

表 6-1. 德国信用风险数据集

现有账户状态 持续时间(月) 信用历史 外籍工人 信用风险
A11 6 A34 Yes 1
A12 48 A32 No 1
A14 12 A34 No 2
A11 42 A32 Yes 1

在我们深入研究德国信用风险数据集之前,让我们回顾一下分类和回归算法。

分类和回归算法

机器学习社区多年来已经开发了丰富的分类和回归算法。常用的分类算法包括朴素贝叶斯分类器、支持向量机(SVM)、k-最近邻、决策树和随机森林。对于回归,常用的有决策树、弹性网络、LARS Lasso、随机梯度下降(SGD)和支持向量机(SVM)。

如果您问我应该使用哪种分类/回归算法?答案是:这取决于。通常,数据科学家会尝试不同的算法(取决于问题、数据集大小、可解释模型的要求、算法速度等)。往往需要在速度、模型评估指标(例如准确性)和可解释结果之间权衡。

例如,如果您关注初始解决方案到达的计算速度,您可能会考虑决策树(或任何基于树的变体)或简单的线性回归方法。然而,如果您优化精度(和其他指标),您可能会使用随机森林、支持向量机(SVM)或梯度提升树。通常,最佳结果是不同分类/回归模型的集成。

Tip

欲深入了解每种分类算法的工作原理,请参考Tom Mitchell 教授的机器学习课程,该课程详细讨论了不同的机器学习算法。

机器学习新手?请参考这张微软备忘单,了解不同分类算法及其适用场景。

图 6-2 展示了使用德国信用风险数据集训练的可能决策树示例。您会注意到树从一个分割属性开始——账户状态。如果账户状态的值为 A13、A14,则该人不具有信用风险。树进一步选择其他分割属性(持续时间和信用历史),并使用这些属性进一步确定一个人是否具有信用风险。

paml 0602

图 6-2. 德国信用风险数据集的决策树

每个这些分类算法都有需要调整的超参数。此外,数据分布、数据的维度、数据的稀疏性以及数据是否线性可分都很重要。随着数据科学家在实践中的成熟,他们会建立自己的工具箱,并掌握使用的算法(基于对算法工作原理的熟悉程度和如何调整超参数)。

如果您有兴趣尝试不同的分类算法和数据集,scikit-learn提供了丰富的各种分类算法库,是一个很好的 Python 机器学习库入门选择。

使用自动 ML 进行分类和回归

让我们开始处理一个分类问题。为了加速您学习如何使用自动 ML 对德国信用风险数据集进行信用风险分类,您可以使用 GitHub 上提供的笔记本,并在 Microsoft Azure 笔记本 上运行它们。

尽管自动 ML 看起来几乎像是魔法(即给定数据集,执行一些自动特征工程,枚举不同类型的模型,并选择最佳模型),但拥有正确的输入数据将显著提高模型的质量。

提示

使用 Azure 机器学习进行训练信用风险模型的自动 ML 示例笔记本可在 https://bit.ly/2m3xlyP 获取。

在使用自动 ML 时支持丰富的分类和回归算法,如 表 6-2 所示。

表 6-2. Azure 机器学习中自动 ML 支持的分类和回归算法

算法类型 分类 回归
C-SVC
决策树
弹性网络
极端随机森林
梯度提升
k-最近邻
LARS Lasso
Light GBM
线性 SVC
逻辑回归
朴素贝叶斯
随机森林
SGD
注意

要获取自动 ML 支持的分类算法的更新列表,并了解每种算法的详细信息,请参阅此 Microsoft 文档

设置 Azure 机器学习工作区

在此之前,您已经学会了如何设置 Azure 机器学习工作区,并准备了配置文件,其中包括订阅 ID、资源组和工作区名称。使用以下代码来设置配置文件:

config.json
{
    "subscription_id": "<Replace with Azure Subscription ID>",
    "resource_group": "oreillybook",
    "workspace_name": "automl-tutorials"
}

在使用 Azure 笔记本时,config.json 文件应存储在相同的文件夹或 aml_config 文件夹中,如 图 6-3 所示。

paml 0603

图 6-3. 开始运行 Azure 笔记本

将这些文件上传到 Azure 笔记本或您自己的本地 Jupyter Notebook 环境后,您就可以开始了。让我们首先导入您在此练习中将要使用的相关 Python 包:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import logging

接下来,导入 Azure 机器学习 SDK (azureml-sdk):

import azureml.core
from azureml.core.experiment import Experiment
from azureml.core.workspace import Workspace
from azureml.train.automl import AutoMLConfig

导入相关的 Python 包后,使用 config.json 中的值创建 Azure 机器学习工作区。

Workspace.from_config() 读取 config.json 文件,该文件存储在笔记本所在文件夹或 aml_config/config.json 中。正如前面章节中讨论的那样,工作区对象存储有关 Azure 订阅的信息,以及使用的各种资源信息。创建后,它还会创建一个监视和跟踪模型运行的云资源:

ws = Workspace.from_config()

# Populate a workspace info object
workspace_info = {}
workspace_info['SDK version'] = azureml.core.VERSION
workspace_info['Subscription ID'] = ws.subscription_id
workspace_info['Workspace Name'] = ws.name
workspace_info['Resource Group'] = ws.resource_group
workspace_info['Location'] = ws.location
pd.set_option('display.max_colwidth', −1)
workspace_info = pd.DataFrame(data = workspace_info, index = [''])
workspace_info.T

在运行 Python 代码后,您将看到 图 6-4 中显示的输出,该输出提供了 Azure 机器学习 SDK 的版本信息、Azure 订阅 ID、以及创建的 Azure 机器学习工作区的名称和位置信息。

paml 0604

图 6-4. 准备 Azure 机器学习工作区

如果这是您在 Azure 笔记本中第一次运行代码,您可能会看到以下警告消息:

Warning: Falling back to use azure cli login credentials. If you run your
code in unattended mode, i.e., where you can't give a user input, then
we recommend to use ServicePrincipalAuthentication or MsiAuthentication.

Found the config file in: /home/nbuser/library/config.json Performing
interactive authentication. Please follow the instructions on the terminal.

To sign in, use a web browser to open the page https://microsoft.com/devicelogin
and enter the code &lt;9-digit code&gt; to authenticate.

要使用 Azure 进行身份验证,请点击 https://microsoft.com/devicelogin 并输入提供的身份验证代码。使用有效凭据登录后,您可以重新运行单元格,您将得到身份验证。

要作为无人操作的一部分运行代码,您需要设置 Azure 服务主体,并使用该服务主体进行程序化登录。要了解如何与 Azure 机器学习进行身份验证的更多信息,请访问这个 GitHub 仓库

接下来,在创建 Azure 机器学习工作区之后,您需要创建用于此练习的实验对象。在随后的代码中,请注意我们在创建实验时传递了之前创建的工作区对象的引用。我们还指定了一个项目文件夹来包含将要创建的文件列表,如 图 6-5 所示。

# Choose the experiment name and specify the project folder.

experiment_name = 'automl-classification'
project_folder = './book/automl-classification'

experiment = Experiment(ws, experiment_name)

paml 0605

图 6-5. 创建实验并指定项目文件夹

数据准备

对于此练习,我们使用来自 UCI 机器学习库 的数据,该库包含用于分类和回归问题的丰富数据集集合。另一个开放机器学习数据集的良好资源是 OpenML.org。德国信用风险数据集在这两个数据集仓库中都可以找到。

因为 UCI 机器学习库中的 german.data 文件不包含标题行,我们首先定义每个列的名称。这帮助我们在处理数据集时引用列名。执行以下代码后,您将在 图 6-6 中看到数据集的前五行,每行包含 21 列,最后一列是名为 Status 的标签列:

# Define the column
columns = ['status_checking_acc', 'duration_months', 'credit_history',
           'purpose', 'credit_amount','saving_acc_bonds',
           'present_emp_since', 'installment_rate','personal_status',
           'other_debtors', 'residing_since', 'property',
           'age_years','inst_plans', 'housing', 'num_existing_credits',
           'job', 'dependents', 'telephone', 'foreign_worker', 'status']

creditg_df = pd.read_csv(
            'https://archive.ics.uci.edu/ml/
    machine-learning-databases/statlog/german/german.data',
    delim_whitespace = True, header = None )
creditg_df.columns = columns
creditg_df.head()

paml 0606

图 6-6. 指定列名并加载数据

Status 列是我们试图建立模型来预测的类。让我们看看 Status 列的唯一值数量。状态列中的值为 1 和 2;1 表示良好的信用,2 表示不良的信用。为了方便阅读,我们从这些值中减去 1,这样我们就使用值 0 来表示良好的信用,使用值 1 来表示此人有不良信用:

# Get the unique values in the Status Column
creditg_df.status = creditg_df.status − 1
creditg_df['status'].unique()

此外,我们还将带有目标特征的列分离出来:

# Get the label column, and remove the label column from the dataframe
# When axis is 1, columns specified are dropped

target = creditg_df["status"]
creditg_df =  creditg_df.drop(labels='status',axis=1)

现在我们准备将数据拆分为训练数据和测试数据。在这个练习中,我们进行 70/30 的拆分(即 70% 的数据用于训练,剩余的用于测试)。在下面的代码中,您可以看到当我们调用 train_test_split 时,我们还传入了目标列的引用 target column

# Split into train and test data
X_train, X_test, y_train, y_test =
    train_test_split(creditg_df, target, test_size=0.3)

# Convert y_train and y_test from Pandas Series to ndArray
y_train = y_train.values
y_test = y_test.values

将数据分割为训练数据和测试数据之后,请仔细检查两个 DataFrame — X_trainX_test

如 图 6-7 所示,两个 DataFrame 应该有 20 列。因为 train_test_split 返回 Pandas Series 作为训练和测试标签列(由 y_trainy_test 表示),我们可以将这两个对象转换为 ndArray 或 DataFrame 之一。这将作为将要创建的 AutoMLConfig 对象的输入之一。

paml 0607

图 6-7. 有关 DataFrame X_test 的信息

使用自动 ML 训练模型

我们已准备好使用自动 ML 来训练德国信用风险问题的分类模型。

但在此之前,让我们看看在使用自动 ML 时用于调整的可用指标,通过使用函数 get_primary_metrics()。图 6-8 显示了输出结果。您将看到支持的常见分类指标,包括准确率、精确度、AUC 和加权精确度分数:

# Explore the metrics that are available for classification
azureml.train.automl.utilities.get_primary_metrics('classification')

paml 0608

图 6-8. 用于分类模型的指标

让我们定义在多个实验中使用的常见自动 ML 设置:

import time
automl_settings = {
    "name": "AutoML_Book_CH08_Classification_{0}".format(time.time()),
    "iteration_timeout_minutes": 10,
    "iterations": 30,
    "primary_metric": 'AUC_weighted',
    "preprocess": True,
    "max_concurrent_iterations": 10,
    "verbosity": logging.INFO
}

接下来,我们创建 AutoMLConfig 对象,指定自动 ML 设置和训练数据(包括标签列 y_train)。我们指定要执行的交叉验证次数为 5

automl_config = AutoMLConfig(
                   task = 'classification',
                   debug_log = 'automl_errors.log',
                   X = X_train,
                   y = y_train,
                   n_cross_validations = 5,
                   path = project_folder,
                   **automl_settings
                 )
提示

在创建 AutoMLConfig 对象时,您会注意到在本例中,我们将任务指定为 classification。如果您正在使用自动 ML 自动选择最佳回归模型,则应将任务指定为 regression

要了解在创建 AutoMLConfig 对象时可以使用的各种设置,请参阅 https://bit.ly/2lZWXwo。您可以使用 whitelist_models 指定在自动 ML 中搜索最佳模型时要使用的算法列表。您还可以使用 blacklist_models 指定在实验迭代中忽略的模型列表。

创建了 AutoMLConfig 对象之后,您就可以提交实验了,如下所示:

local_run = experiment.submit(automl_config, show_output = True)

当实验提交后,自动化 ML 将运行并评估多个迭代。每个迭代将使用不同的分类算法以及自动特征化技术,并向您显示评估指标。最佳迭代分数也将显示出来。 图 6-9 显示了评估的 30 次迭代的输出。

注意到第 14 次迭代使用逻辑回归,最初达到了 0.7727 的最佳模型得分。而在第 30 次迭代(最后一次),使用了集成学习,将最佳模型得分从 0.7727 提升到了 0.7916. 您还将看到实验输出中每列的解释(例如,抽样百分比,持续时间,指标,最佳值)。

当实验成功完成时,您可以在 Azure 门户中查看运行的详细信息:

local_run

或者通过使用自动化 ML Jupyter Notebook 小部件:

import azureml.widgets
from azureml.widgets import RunDetails
RunDetails(local_run).show()
提示

如果尚未安装用于小部件的 Python 包,您也可以使用 pip install azureml-widgets 进行安装。

paml 0609

图 6-9. 从提交的自动化 ML 分类实验中输出

如 图 6-10 所示,如果单击“链接到 Azure 门户”,您将看到您完成的最新运行的详细信息。您还可以深入了解运行实验时生成的日志。

paml 0610

图 6-10. 获取有关 local_run 的信息

图 6-11 显示了运行的详细信息,运行编号为 347. 从图表中可以看出模型在每次迭代中的性能。

paml 0611

图 6-11. Azure 门户 - 实验运行的详细信息

安装完小部件后,您可以直接在 Azure Notebooks 中查看运行详细信息。

图 6-12 显示了从 RunDetails(local_run).show() 输出的结果。您还可以单击每个迭代以查看更多详细信息。例如,如果单击集成学习的最后一次迭代(显示为第一行),您将看到详细的图表,捕获了该迭代的精确-召回率,多类 ROC 曲线,提升曲线,增益曲线和校准曲线。还显示了混淆矩阵。

paml 0612

图 6-12. 使用自动化 ML Jupyter Notebook 小部件

此视图的子集显示在 图 6-13 中。

paml 0613

图 6-13. 使用自动化 ML Jupyter Notebook 小部件了解运行的详细信息

而不是交互式地点击每个迭代,您可以通过使用 get_children() 来制表每次运行中的指标(输出显示在 图 6-14 中):

# Get all child runs
children = list(local_run.get_children())
metricslist = {}
for run in children:
    properties = run.get_properties()
    metrics = {k: v for k,
      v in run.get_metrics().items() if isinstance(v, float)}
    metricslist[int(properties['iteration'])] = metrics
rundata = pd.DataFrame(metricslist).sort_index(1)
rundata

paml 0614

图 6-14. 每次运行中的指标

选择并测试实验运行中的最佳模型

要使用最佳模型,您可以使用get_output()函数(输出显示在图 6-15 中):

best_run, fitted_model = local_run.get_output(metric = "AUC_weighted")

print(best_run)

paml 0615

图 6-15. 最佳运行的信息

让我们使用测试数据对模型进行测试,并理解评估中的分类指标,以及接收者操作特征曲线下面积(ROC AUC):

from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score

y_pred = fitted_model.predict(X_test)

target_names = ['0','1']
print (classification_report(
          y_test,y_pred, target_names=target_names))
print("AUC: " + str(roc_auc_score(y_test,y_pred)))

图 6-16 显示了使用测试数据对模型进行测试的输出结果,以及相关的指标:精确率、召回率、F1 分数和模型的支持度。

paml 0616

图 6-16. 所选最佳模型的分类指标和 AUC

结论

在本章中,您学习了如何使用 Azure 机器学习的自动化 ML 来查找最佳的分类模型,以预测个人的信用风险。您也可以使用同样的方法来识别最佳的回归模型。一旦您确定了用于任务的最佳分类/回归模型,请参考第五章了解如何将机器学习模型部署到各种环境中。

第三部分:企业如何使用自动化机器学习

在这一部分,您将了解自动化机器学习如何民主化人工智能,并赋予企业内的人们使用熟悉工具进行机器学习的能力。

第七章:自动化机器学习中的模型可解释性和透明性

我们早些时候讨论了如何构建良好的机器学习模型是一个相当耗时的过程。什么是“好”的机器学习模型?我们看到,通常情况下这是由模型的性能来定义的,通过准确性或类似的指标来衡量。随着公司准备采用面向业务关键场景的机器学习,模型的可解释性和透明性变得至关重要。

在本章中,我们涵盖了关于机器学习可解释性和透明性的关键方面,这些方面有助于建立客户信任。当你尝试使用或定制他人开发的机器学习管道时,包括由自动化机器学习系统生成的管道时,解释性和透明性变得更加重要。让我们深入了解微软 Azure 机器学习上的自动化 ML 如何实现模型的可解释性和透明性。

模型解释性

大多数机器学习模型被认为是黑匣子,因为通常很难理解或解释它们的工作原理。没有这种理解,很难信任模型,因此很难说服高管利益相关者和客户相信机器学习和基于机器学习的系统的商业价值。

有些模型,如线性回归,被认为相对直观,因此易于理解,但随着我们添加更多特征或使用更复杂的机器学习模型如神经网络,理解它们变得越来越困难。通常,更复杂(不那么易于理解)的模型比简单且易于理解的模型表现得更好,即它们实现了更高的准确性。图 7-1 展示了这种关系。

paml 0801

图 7-1。可解释性/解释性与模型性能

企业运营在透明度和信任的基础上,打开机器学习的黑匣子以解释模型有助于建立透明度和信任。在像医疗保健和银行业这样严格监管的行业中,可解释性和透明性至关重要。以下是一些现实场景,用以说明机器学习中可解释性和透明性的价值:

  • 制造公司利用机器学习预测未来设备故障,以便能够主动进行维护活动。

    • 当你知道一个设备即将故障时,最可能的原因是什么,以便你可以快速进行预防性维护?
  • 金融机构利用机器学习处理贷款或信用卡申请。

    • 你如何知道模型是否在做正确的事情?

    • 如果客户要求更多关于为什么他们的申请被拒绝的详细信息,你将如何回应?

  • 在线零售商或独立软件供应商(ISV)使用机器学习预测客户流失——换句话说,客户是否会很快停止使用其产品/服务。

    • 什么是客户流失的主要因素?

    • 如何防止客户流失?

特征重要性 是一种用于模型解释的流行方法。特征重要性指示每个输入列(或特征)如何影响模型的预测。这使得数据科学家能够解释生成的模型和预测,从而让利益相关者看到哪些数据点在模型中最重要。

使用 Azure 机器学习进行模型解释性分析

Azure 机器学习 Python SDK 提供各种可解释性包,帮助您理解特征重要性。使用这些包,您可以全局解释所有数据上的机器学习模型,或者在特定数据点上进行局部解释。

解释器

在 Azure 机器学习 SDK 中有两组解释器,特别是azureml.explain.model包:直接解释器和元解释器。

直接解释器 来自集成库。解释机器学习模型输出的一种流行方法是 SHAP(SHapley Additive exPlanations 的简称)。以下是 SDK 中可用的直接解释器列表:

SHAP 树解释器

SHAP 的树解释器专注于树和树的集成。

SHAP 深度解释器

基于 SHAP 的解释,Deep Explainer 专注于深度学习模型。支持 TensorFlow 模型和使用 TensorFlow 后端的 Keras 模型(还有对 PyTorch 的初步支持)。

SHAP 核解释器

SHAP 的核解释器使用特殊加权的局部线性回归来估计任何模型的 SHAP 值。

模仿解释器

模仿解释器基于全局替代模型的理念。全局替代模型是一种内在可解释的模型,它被训练来尽可能精确地近似黑盒模型的预测。您可以解释一个替代模型来得出关于黑盒模型的结论。

PFI 解释器

排列特征重要性(PFI)解释器是一种用于解释分类和回归模型的技术。在高层次上,它的工作方式是逐个特征地对整个数据集随机重新排列数据,并计算感兴趣的性能度量减少的程度。变化越大,该特征越重要。

LIME 解释器

本地可解释的模型无关解释(LIME)解释器使用最先进的 LIME 算法创建本地替代模型。与全局替代模型不同,LIME 专注于训练本地替代模型来解释单个预测。目前仅在azureml.contrib.explain.model的 contrib/preview 包中提供。

HAN 文本解释器

HAN 文本解释器使用层次注意力网络,用于从文本数据中获取黑盒文本模型的模型解释。目前仅在azureml.contrib.explain.modelcontrib/preview包中可用。

元解释器会自动选择适合的直接解释器,并基于给定的模型和数据集生成最佳解释信息。目前在 Azure 机器学习 SDK 中提供以下元解释器:

表格解释器

用于表格数据集

文本解释器

用于文本数据集

图像解释器

用于图像数据集

目前,Text ExplainerImage Explainer仅在azureml.contrib.explain.modelcontrib/preview包中可用。

除了自动选择直接解释器外,元解释器在底层库的基础上开发了额外的功能,并提高了速度和可扩展性。目前,TabularExplainer使用以下逻辑来调用直接解释器:

  1. 如果是基于树的模型,请应用TreeExplainer,否则

  2. 如果是 DNN 模型,请应用DeepExplainer,否则

  3. 将其视为黑盒模型并应用KernelExplainer

集成到 SDK 中的更多库后,TabularExplainer内置的智能将变得更加复杂。

图 7-2 展示了直接解释器和元解释器之间的关系,以及适用于不同类型数据的解释器。SDK 封装了所有解释器,以便它们公开一个通用的 API 和输出格式。

paml 0802

图 7-2. 直接解释器和元解释器

您现在将看到如何使用这些解释器为以下两种场景生成特征重要性:使用 sklearn 训练的回归模型和使用自动化 ML 训练的分类模型。

使用 sklearn 训练的回归模型

我们将建立一个回归模型,使用来自 sklearn 的波士顿房价数据集来预测房价。该数据集有 506 行,13 个输入列(特征),和 1 个目标列。以下是输入列:

  • CRIM: 每人均犯罪率

  • ZN: 25,000 平方英尺以上住宅用地的比例

  • INDUS: 每个城镇非零售营业英亩的比例

  • CHAS: 查尔斯河虚拟变量(如果地块靠近河流为 1;否则为 0)

  • NOX: 一氧化氮浓度(每千万分之一)

  • RM: 每个住宅的平均房间数

  • AGE: 1940 年前建成的自住单位的比例

  • DIS: 到波士顿五个就业中心的加权距离

  • RAD: 径向公路的可达性指数

  • TAX: 每$10,000 全额财产税率

  • PTRATIO: 按城镇计算的学生-教师比例

  • B: 1,000 * (Bk–0.63)²,其中 Bk 是城镇中非洲裔美国人的比例(此数据集来源于 1978 年)

  • LSTAT: 人口的低收入阶层百分比

这是一个目标列:

  • MEDV: 以千美元为单位的自住房屋的中位数价值

在加载数据集并将其分割为训练集和测试集后,我们使用 sklearn 的 GradientBoostingRegressor 训练了一个简单的回归模型。接下来,我们将使用 azureml.explain.model 包中的 TabularExplainer 生成训练模型的 全局特征重要性。生成全局解释后,我们使用方法 get_ranked_global_values()get_ranked_global_names() 来获取排名的特征重要性值和相应的特征名称:

from sklearn.ensemble import GradientBoostingRegressor

reg = GradientBoostingRegressor(n_estimators=100, max_depth=4,
                                learning_rate=0.1, loss='huber',
                                random_state=1)

model = reg.fit(x_train, y_train)

from azureml.explain.model.tabular_explainer import TabularExplainer

tabular_explainer = TabularExplainer(model, x_train, features =
                                     boston_data.feature_names)

global_explanation = tabular_explainer.explain_global(x_train)

# Sorted SHAP values
print('Ranked global importance values:
       {}'.format(global_explanation.get_ranked_global_values()))

# Corresponding feature names
print('Ranked global importance names:
       {}'.format(global_explanation.get_ranked_global_names()))

# Display in an easy to understand format
dict(zip(global_explanation.get_ranked_global_names(),
         global_explanation.get_ranked_global_values()))

图 7-3 显示了排名靠前的全局特征重要性输出。这表明人口的 LSTAT(%低社会地位)特征对模型输出影响最大。

paml 0803

图 7-3. 全局特征重要性

接下来,我们将看看如何计算特定数据行的 局部特征重要性。这在预测时尤为重要。我们将一行从测试集传递给 explain_local() 方法并打印局部特征重要性:

local_explanation = tabular_explainer.explain_local(x_test[0,:])

# Sorted local feature importance information; reflects original feature order
print('sorted local importance names:
       {}'.format(local_explanation.get_ranked_local_names()))

print('sorted local importance values:
       {}'.format(local_explanation.get_ranked_local_values()))

# Display in an easy to understand format
dict(zip(local_explanation.get_ranked_local_names(),
         local_explanation.get_ranked_local_values()))

如在 图 7-4 中所见,尽管在这个特定测试记录中,LSTAT 仍然是最重要的特征,但 AGE 是第二重要的特征。

paml 0804

图 7-4. 局部特征重要性

如在 第 4 章 中讨论的,原始数据通常在训练过程之前经过多次转换。通过这个过程产生的特征称为 工程化特征,而原始输入列称为 原始特征。默认情况下,解释器使用用于训练的特征来解释模型(即工程化特征),而不是原始特征。

然而,在大多数真实世界的情况下,您希望理解 原始特征重要性。原始特征重要性告诉您每个原始输入列如何影响模型预测,而 工程化特征重要性 不直接基于您的输入列,而是基于输入列转换生成的列。因此,原始特征重要性比工程化特征重要性更易于理解和操作。

使用 SDK,您可以将特征转换管道传递给解释器以接收原始特征重要性。如果您跳过此步骤,解释器将提供工程化的特征重要性。通常,将在单列上的任何转换都将受到支持:

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn_pandas import DataFrameMapper

# Assume that we have created two arrays, numerical and categorical,
that hold the numerical and categorical feature names.

numeric_transformations = [([f], Pipeline(steps=[('imputer',
      SimpleImputer(strategy='median')), ('scaler',
      StandardScaler())])) for f in numerical]

categorical_transformations = [([f], OneHotEncoder(handle_unknown='ignore',
     sparse=False)) for f in categorical]

transformations = numeric_transformations + categorical_transformations

# Append model to preprocessing pipeline.
# Now we have a full prediction pipeline.
clf = Pipeline(steps=[('preprocessor', DataFrameMapper(transformations)),
                    ('classifier', LogisticRegression(solver='lbfgs'))])

# clf.steps[-1][1] returns the trained classification model
# Pass transformation as an input to create the explanation object
# "features" and "classes" fields are optional
tabular_explainer = TabularExplainer(clf.steps[-1][1],
     initialization_examples=x_train, features=dataset_feature_names,
     classes=dataset_classes, transformations=transformations)

到目前为止,您已经看到如何在模型训练时生成特征重要性。同样重要的是,在推断时间理解特定数据行的特征重要性。让我们考虑这种情况:假设您拥有一个机器学习驱动的应用程序来处理信用卡申请。如果您的应用程序拒绝了一张信用卡申请,您需要解释为什么模型拒绝了该特定申请人。

为了启用推理时特征重要性,解释器可以与原始模型一起部署,并在评分时提供本地解释信息。接下来,我们将探讨如何在 Azure 机器学习中使用自动化机器学习工具启用特征重要性。

使用自动化机器学习训练的分类模型

我们将使用 sklearn 鸢尾花数据集。这是一个著名的花卉分类场景。有三类花和四个输入特征:花瓣长度、花瓣宽度、萼片长度和萼片宽度。数据集有 150 行(每类花 50 行)。

加载数据集并将其分割为训练集和测试集后,我们使用自动化机器学习训练分类模型。为了使每个由自动化机器学习训练的模型都能获得特征重要性,我们在AutoMLConfig中设置了model_explainability=True


automl_config = AutoMLConfig(task = 'classification',
                             debug_log = 'automl_errors.log',
                             primary_metric = 'AUC_weighted',
                             iteration_timeout_minutes = 200,
                             iterations = 10,
                             verbosity = logging.INFO,
                             X = X_train,
                             y = y_train,
                             X_valid = X_test,
                             y_valid = y_test,
                             `model_explainability=True`,
                             path=project_folder)

local_run = experiment.submit(automl_config, show_output=True)

best_run, fitted_model = local_run.get_output()

因为这是一个分类问题,您不仅可以获取整体模型级别的特征重要性,还可以获取每个类别的特征重要性。

让我们回顾如何使用azureml.train.automl.automlexplainer包从自动化机器学习生成的模型中提取特征重要性值。这里以最佳运行示例为例,但您可以从自动化机器学习训练中检索任何运行:

from azureml.train.automl.automlexplainer import retrieve_model_explanation

shap_values, expected_values, overall_summary, overall_imp,
              per_class_summary, per_class_imp = \
              retrieve_model_explanation(best_run)

# Global model level feature importance
print('Sorted global importance names: {}'.format(overall_imp))
print('Sorted global importance values: {}'.format(overall_summary))

# Global class level feature importance
print('Sorted global class-level importance names: {}'.format(per_class_imp))
print('Sorted global class-level importance values:
       {}'.format(per_class_summary))

图 7-5 显示了输出:模型的全局特征重要性和类别级别的特征重要性。

paml 0805

图 7-5. 自动化机器学习模型的特征重要性

除了使用 SDK 获取特征重要性值外,您还可以通过笔记本或 Azure 门户中的小部件用户体验获取它。让我们从小部件用户体验中看看如何做到这一点。在自动化机器学习训练完成后,您可以使用来自azureml.widgets包的RunDetails来可视化自动化机器学习训练,包括所有尝试的机器学习流水线,这些可以在 图 7-6 中查看。

paml 0806

图 7-6. 自动化机器学习小部件用户体验

您可以单击任何机器学习流水线以进行更多探索。除了一堆图表外,您还将看到一个特征重要性图表。使用图例查看整体模型级别以及类级别的特征重要性。在 图 7-7 中,您可以看到“花瓣宽度(cm)”是从整体模型视角最重要的特征,但对于类别 1,“萼片宽度(cm)”是最重要的特征。

paml 0807

图 7-7. 自动化机器学习小部件用户体验中的特征重要性

模型透明化

在前一节中,您学习了特征重要性是理解机器学习模型强大的一种方式。理解从输入数据到机器学习模型的训练过程也同样重要。在本节中,我们将讨论自动化机器学习如何使端到端的训练过程变得透明。

理解自动化机器学习模型流水线

如前几章所讨论的,自动化 ML 推荐基于用户输入以产生高质量 ML 模型的模型管道。每个模型管道包括以下步骤:

  1. 数据预处理和特征工程

  2. 基于选择的算法和超参数值进行模型训练

使用自动化机器学习,您可以在将其用于应用程序或场景之前分析每个推荐管道的步骤。这种透明度不仅让您更加信任模型,还能进一步定制它。有关如何获得端到端过程可见性的详细信息,请参阅第四章,该章节涵盖了自动化 ML 推荐的机器学习管道中的所有步骤。

保护栏

在前几章中,您看到自动化机器学习通过自动化大部分迭代和耗时步骤,使得开始机器学习变得更加容易。此外,还有许多最佳实践需要应用以实现可靠的结果。保护栏帮助用户理解数据和训练模型的潜在问题,因此他们知道可以期望什么并能够纠正问题以获得改进的结果。

以下是一些要注意的常见问题:

缺失值

正如我们在早些章节中讨论的那样,现实世界的数据并不干净,可能缺少很多值。在将其用于机器学习之前,需要“修复”具有缺失值的数据。可以使用各种技术来修复缺失值,从删除整行数据到使用其他数据的智能填充方法来填充缺失值;这称为插补

类别不平衡

类别不平衡是机器学习中的一个主要问题,因为大多数机器学习算法假设数据是均匀分布的。在不平衡数据的情况下,多数类别会主导少数类别,导致机器学习模型更倾向于多数类别,从而导致少数类别的分类效果较差。一些实际例子涉及异常检测、欺诈检测和疾病检测。

采样是克服类别不平衡的常用策略。有两种采样方式:

欠采样

通过删除大多数类别的一些实例来平衡数据集。

过采样

添加类似的少数类别实例以达到平衡。

数据泄露

数据泄露是构建机器学习模型时的另一个关键问题。这种情况发生在训练数据集包含预测时不可用的信息时。由于实际结果已知(由于泄露),模型在训练数据上的性能几乎完美,但在预测时性能会非常差。您可以使用一些技巧来克服数据泄露:

删除泄露特征

使用简单的基于规则的模型来识别泄露特征并将其删除。

留出数据集

在使用模型之前,保留一个未见的测试集作为最终的模型健全性检查。

添加噪声

向输入数据添加噪声,以平滑可能泄漏特征的影响。

正如您所见,理解和防范这类常见问题对模型的性能以及对用户透明度至关重要。自动化 ML 提供了防护栏,显示并防范常见问题,并将随时间推移继续增加更复杂的防护栏。

结论

在本章中,我们讨论了建立对训练好的机器学习模型信任时变得非常重要的两个关键方面:可解释性和透明度。几乎每家使用机器学习模型的公司或团队都要求模型在一定程度上是可解释的和透明的,以获得信心。

通过使用 Azure 机器学习 Python SDK,以及自动化 ML Python SDK 和小部件 UX,您学会了如何利用解释性/可解释性功能。我们还触及了了解端到端模型训练管道以及避免陷阱的重要性,以及为什么建立防护栏来防范这些陷阱对于确保模型透明度至关重要。

第八章:开发者的自动化 ML

在早些时候,您学习了如何在 Azure 机器学习中使用 Jupyter Notebook 的自动化 ML 工具。在本章中,您将学习如何在其他环境中使用自动化 ML:Azure Databricks、ML.NET 和 SQL Server。

Azure Databricks 和 Apache Spark

Azure Databricks 是一个快速、易于使用且协作的基于 Apache Spark 的分析平台。它是 Azure 中的托管 Spark 服务,并与各种 Azure 服务集成。这意味着 Azure 不仅管理 Spark 集群节点,还管理运行在其上的 Spark 应用程序。它还具有其他有用的功能,如下:

  • Azure Databricks 旨在提高用户的生产力,设计为可扩展、安全且易于管理。它具有协作工作区,共享给有适当权限的用户。用户可以从工作区内共享多个笔记本、集群和库。

  • Azure Databricks 工作区是数据工程师、数据科学家和业务分析师可以使用所有必需库的单一位置。数据源也可以在同一个工作区中可用。

  • 在 Azure Databricks 工作区中,身份验证和授权基于用户的 Azure Active Directory(Azure AD)登录。从治理的角度来看,可以轻松地向 Azure Databricks 工作区添加或删除用户,并可以授予不同的权限,如阅读者、贡献者或所有者。从安全的角度来看,Azure Databricks 集群默认部署在 Azure 虚拟网络中,可以更改为客户的虚拟网络。

Apache Spark 目前是最流行的开源大数据分析引擎。您可以使用 Scala、Python、R 或 SQL 编写基于 Spark 的应用程序。它非常快速:使用 Spark,您可以比传统的大数据技术提升 10 到 100 倍的性能,因为它会在内存中进行一些计算,而不是从磁盘读取数据。如 图 8-1 所示,Spark 提供了像 MLlib(分布式机器学习库)和 Spark SQL(分布式 SQL)等强大的库,这些库建立在核心 Spark 应用程序之上。

paml 0901

图 8-1. Apache Spark 栈 (来源:https://spark.apache.org/)

我们将从 Azure 门户 (图 8-2) 开始创建工作区。

paml 0902

图 8-2. Azure 门户

您可以搜索 Azure Databricks 或使用 Analytics 菜单选项 (图 8-3)。

paml 0903

图 8-3. 在 Azure 门户中搜索 Azure Databricks

图 8-4 显示了创建工作区的选项。

paml 0904

图 8-4. 在 Azure Databricks 面板中提供详细信息

工作区设置过程仅需约一分钟:

  1. 给工作区命名并选择适当的 Azure 订阅。

  2. 创建新资源组或现有资源组。

  3. 选择一个能够承载该工作区的区域。它应该为您的订阅分配足够的配额。

  4. 选择定价层。对于此练习,请选择高级。

  5. 将自定义 VNET 设置为 No。

一旦完成,概述页面将打开,如图 8-5 所示。

paml 0905

图 8-5. Azure Databricks 资源概述

从概述页面,点击“启动工作区”以打开 Azure Databricks 工作区页面,如图 8-6 所示。该工作区将包含我们的集群、笔记本和相关资源。对于希望通过笔记本运行高级分析的人来说,该工作区可以是一个中心化的地方。正如我们之前提到的,您可以使用 Azure AD 凭据登录。工作区的左侧是获取数据、创建集群等选项。

paml 0906

图 8-6. Azure Databricks 工作区

让我们开始创建一个集群,如图 8-7 所示。Databricks 集群有驱动工作节点。创建集群时,您需要提供集群名称、Databricks 运行时、工作节点类型和驱动节点类型。您可以根据计划运行的实验类型选择这些值。例如,对于大型数据集,VM 类型应具有更多内存。

paml 0907

图 8-7. 集群创建页面

集群使用底层的 Azure 虚拟机(VM)。如图 8-8 所示,您可以根据工作节点和驱动节点的内存和 CPU 选择 VM 类型。

paml 0908

图 8-8. 选择工作节点 VM 类型

现在您需要考虑两个自动驾驶选项:自动缩放和自动终止(见图 8-9)。设置集群终止时间限制有助于避免在不使用集群时支付费用。启用自动缩放允许根据所需资源随需增减计算能力。

首次配置集群可能需要 10 到 15 分钟。这包括安装您希望为集群设置的库。对于自动化机器学习,请在 Databricks 运行时 5.4 及更高版本上安装 azureml-sdk[automl]

paml 0909

图 8-9. Azure Databricks 工作区中的集群配置

对于旧版本运行时,您可以安装 azureml-sdk[autom_databricks],如图 8-10 所示。这是一个单一的包,包含在 Azure Databricks 上运行自动化 ML 所需的所有内容。您可以从库页面安装它。

paml 0910

图 8-10. 指定自动化 ML PyPi 包

如果一切顺利,在群集运行并且库已安装后,您的页面应如 Figure 8-11 所示。

paml 0911

Figure 8-11. 库状态

现在让我们看看数据选项。从左侧窗格中选择“数据”选项,如 Figure 8-12 所示。

paml 0912

Figure 8-12. 数据源选项

您可以以多种方式将数据带入 Azure Databricks 工作区。提供不同的模板以轻松开始连接到各种数据源。让我们探索连接到 Azure Blob 存储的最简单选项,如图 8-13 和 8-14 Figure 8-13 所示。我们提供连接到存储的凭据。结果是一个数据框。

paml 0913

Figure 8-13. 数据样本笔记本,第一部分

paml 0914

Figure 8-14. 数据样本笔记本,第二部分

您可以使用此数据框进行进一步的数据准备。现在让我们将一个笔记本导入到 Azure Databricks 工作区,以便您可以编写机器学习代码。您可以通过导入文件或从 URL 导入笔记本,如 Figure 8-15 所示。

paml 0915

Figure 8-15. 导入工作区中的笔记本

导入笔记本后,您可以将群集附加到它,如 Figure 8-16 所示。只需阅读笔记本,无需将群集附加到它,但执行代码时需要群集。

paml 0916

Figure 8-16. 将群集附加到笔记本

将此笔记本附加到您的群集后,它可以执行代码。要使用自动化机器学习,您的数据框必须转换为数据流对象,如 Figure 8-17 所示。这是转换它的示例代码。

paml 0917

Figure 8-17. 将 Pandas 数据框转换为数据流

一旦您有了数据流对象,运行自动化机器学习的步骤与在 Jupyter 上运行笔记本的步骤相同,除了一些配置参数;Figure 8-18 展示了一个示例。您可以在 此 Microsoft 文档页面 上找到更多详细信息。

paml 0918

Figure 8-18. 自动化机器学习的示例配置设置

提交实验进行训练后,您将获得一个结果,可以在 Azure 门户中查看,如 Figure 8-19 所示。这里我们展示了每次运行的摘要和主要指标。您可以在单个 Azure 机器学习服务工作区中跟踪结果,无论您使用哪种环境来运行它。

paml 0919

Figure 8-19. 自动化机器学习的输出

在培训完成后,查看运行中使用的超参数。Figure 8-20 显示了打印参数的代码。您可以在任何环境中运行此代码;它不特定于 Azure Databricks。

paml 0920

Figure 8-20. 获取超参数的示例代码

输出将类似于 Figure 8-21(这是针对您示例笔记本中训练模型的参数)。这显示了培训模型中使用的一些参数。

本书的完整实验笔记本可以在该书的GitHub 仓库找到。

paml 0921

Figure 8-21. 示例超参数

现在您已经将 Azure Databricks 集群用作自动化 ML 培训的计算资源,让我们看看如何在 Azure Databricks 笔记本中使用远程计算。这是另一种您可以用于自动化 ML 培训的选择。您可能希望使用 Azure Databricks 集群进行使用 Spark 进行数据准备,然后不使用同一集群的工作节点,而是选择远程计算选项。这种方法在您的 Azure Databricks 集群用于其他任务或没有足够的工作节点容量时可能更经济。这取决于实验。

您可以在http://bit.ly/2lJzVtq找到使用远程计算的示例笔记本。

ML.NET

现在让我们学习另一种使用自动化 ML 的方法。如果您熟悉 Visual Studio 和 C#.NET,并有兴趣构建机器学习模型但可能不熟悉 Python,您可以在 ML.NET 上使用自动化 ML。要安装 ML.NET:

  1. 首先在您的笔记本电脑上安装一个终端,或者使用 Visual Studio Code 中的终端(安装程序可在Visual Studio 网站找到;下载适当的设置)。这适用于 Linux、Windows 或 Mac。

  2. 接下来安装.NET Core SDK(不是 Runtime)。要安装 SDK,请下载安装程序

  3. 如果需要的话,重新启动终端使这些更改生效。

  4. 完成此设置后,在您的终端中运行dotnet tool install -g mlnet命令。

  5. 安装完成后,在您的终端中运行mlnet命令,以测试mlnet是否已成功安装。

  6. 接下来,要开始使用 ML.NET,请将数据集下载到安装了mlnet的笔记本电脑上。在这种情况下,您将使用我们在先前实验中使用的 NASA 数据集。您可以通过在终端上输入简单的命令开始训练:

    mlnet auto-train --task regression --dataset "df_new.csv"
          --label-column-name rul
    

此培训采用自动化 ML 的默认配置。培训完成后,您将在与 Figure 8-22 相同的终端中看到结果。

paml 0922

Figure 8-22. 自动化 ML 结果

目前,ML.NET 的 CLI 支持以下自动化 ML:

  • 二元分类

  • 多类别分类

  • 回归

您还可以通过在终端上使用以下命令来更改默认配置:

mlnet auto-train

它将提供各种可用于自定义的参数列表。例如,默认的训练时间为 30 分钟,但您可以根据需要进行更改。

实验在输出文件夹中生成以下资产:

  • 用于进行预测的序列化模型 ZIP(“最佳模型”)

  • 包含以下内容的 C# 解决方案:

    • 用于预测的 C# 代码,可以集成到您的应用程序中

    • 用于生成模型的训练代码的 C# 代码作为参考

    • 包含跨多个算法评估的所有迭代的信息的日志文件

您还可以在 Visual Studio 中直接调用 API,而不使用 CLI。它将使用与 CLI 相同的核心自动化 ML 技术。接下来,让我们看看如何使用 SQL Server 来训练自动化 ML 模型。

SQL Server

自动化机器学习也适用于 SQL 用户,完全体现了真正的民主化风格。对此,我们不需要了解 Python。要开始使用,我们将利用在 SQL Server 2017 中运行 Python 代码的能力。我们可以使用sp_execute_external_script存储过程来调用 AutoML。

您可以使用 SQL Server Management Studio 或 Azure Data Studio 运行自动化 ML 实验。要尝试一下,请按照Microsoft SQL Server 博客上的这篇文章中列出的步骤操作。

结论

在本章中,您学习了如何在 Azure Databricks、ML.NET 和 SQL Server 中使用自动化 ML。在第九章中,您将学习如何使用 Azure UI 和 Power BI 进行自动化 ML。

第九章:每个人的自动化 ML

到目前为止,您已经看到数据科学家如何利用 Microsoft Azure Machine Learning 中的自动化 ML 功能,使用 Azure Machine Learning Python SDK 构建机器学习模型。并非每个人都具备数据科学专业知识或熟悉 Python。最近的 Gartner 研究数据(参见图 9-1)显示,缺乏技能是采用人工智能(AI)和机器学习的主要挑战或障碍。

paml 1001

图 9-1. 人工智能和机器学习采用的主要挑战

如果我们能够消除这一障碍呢?鉴于人工智能和机器学习的需求不断增加,各个部门和角色的人们也开始对此感兴趣并参与其中。以下是一些例子,展示了希望构建机器学习模型但缺乏 Python(或其他编程语言如 R)专业知识或熟悉的角色:

  • 领域专家或主题专家(SME)

  • 公民数据科学家

  • 数据分析师

  • 数据工程师

  • 开发人员

需要一种更简单的方式来使用自动化 ML——理想情况下,在熟悉的界面中进行无代码体验,而不是必须学习新的工具和技术。在本章中,我们关注的是如何使自动化 ML 可供不是机器学习专家的用户使用,以实现民主化。

Azure 门户 UI

尽管企业开始充分意识到机器学习的潜力,但也意识到这需要难以找到的高级数据科学技能。许多业务领域专家对机器学习和预测分析有一般的了解;然而,他们更倾向于不深入涉足统计学或编码的深度,而传统的机器学习工具要求这些技能。这正是我们认为 Azure 门户 UI 或 Azure UI 将会有所帮助的地方。

要开始在 Azure UI 中使用自动化 ML,首先创建一个 Azure 机器学习工作区,然后创建一个自动化 ML 实验。我们在早期章节中已经介绍过这些步骤,所以让我们使用同一个工作区并创建一个新的实验,如图 9-2 所示。

paml 1002

图 9-2. 创建一个新的自动化 ML 实验

为您的实验提供一个名称。您必须提供一个训练计算名称。这是一个 Azure Machine Learning 管理的计算,将运行该实验。您还可以使用现有的实验和计算,如图 9-3 所示。

paml 1003

图 9-3. 提供实验名称和计算选择

接下来,选择包含我们训练数据的存储账户。如图 9-4 所示,您需要从 Blob 存储容器中选择一个逗号分隔值(CSV)文件,该文件包含完整的数据集,包括预测标签列。该数据集可在此书的 GitHub 仓库中找到。

paml 1004

Figure 9-4. 数据集选择

选择 NASA 涡轮风扇引擎数据集中的传感器数据。一旦选择了数据集,您可以预览数据并选择您认为对实验有关联的列,如图 9-5 所示。

paml 1005

Figure 9-5. 探索数据集

您还可以查看数据集的概要以了解其中每一列的关键特征,如图 9-6 所示。您可以在数据集中看到最小值、最大值和其他类型的概要信息。

paml 1006

Figure 9-6. 数据集概述

在这个实验中,我们不会包含索引列,因为它对预测没有增加价值。如图 9-7 所示,选择回归作为实验类型。

paml 1007

Figure 9-7. 排除用于训练的列

每个自动化 ML 实验都需要一个标签列。在这种情况下,选择“rul”作为标签列,如图 9-8 所示。这代表涡轮风扇引擎的剩余有用寿命

paml 1008

Figure 9-8. 选择任务和目标列

对于这个实验,您需要更改一些高级设置。使用“r2_score”作为度量标准,这是回归类型问题的常见度量标准。接下来,将“培训作业时间”更改为 30 分钟,并将“最大迭代次数”更改为 50。在实际应用中,您可能希望将培训作业时间设置为 120 分钟,并将最大迭代次数设置为至少 100,以获得良好的结果。

将剩余参数保持不变。图 9-9 显示了这些设置。

paml 1009

Figure 9-9. 自动化 ML 设置

单击“开始”以开始训练。图 9-10 显示了一个包含新运行 ID 的弹出窗口。

paml 1010

Figure 9-10. 自动化 ML 运行入门

最初,当运行开始时,它将开始为实验准备计算资源,如图 9-11 所示。这可能需要几分钟的时间。

paml 1011

Figure 9-11. 准备运行

当训练正在运行时,您将看到根据指标排名的模型列表。您还可以看到已完成的迭代次数。用户界面会自动刷新,如图 9-12 所示。

paml 1012

Figure 9-12. 训练进行中

几分钟后,您会看到实验已经完成,并且可以看到一个包含所有迭代的漂亮图表,如 Figure 9-13 所示。

paml 1013

Figure 9-13. 完成训练的视图

您还将看到一个基于最高到最低 r2_score 指标排序的迭代列表表格,如 Figure 9-14 所示。

paml 1014

Figure 9-14. 所有迭代的视图

您可以通过点击运行名称查看每次运行的详细信息。您可以查看帮助您更好理解模型的图表和指标。例如,在第 49 次迭代中,如 Figure 9-15 和 Figure 9-16 所示,您可以查看预测值与真实值以及与模型评估相关的指标。

paml 1015

Figure 9-15. 选定迭代的摘要

paml 1016

Figure 9-16. 选定迭代的指标

如 Figure 9-17 所示,您可以下载与实验相关的最佳训练模型,或者从任何这些迭代中部署它。您可以在 Azure 或任何合适的环境中执行此操作。下载后,该模型将以 .pkl 文件的形式存在。您也可以点击“部署最佳模型”按钮,而不是手动查看表格。

paml 1017

Figure 9-17. 下载或部署最佳模型

当实验完成运行后,点击“部署最佳模型”按钮,即可看到部署模型的步骤,如 Figure 9-18 所示。

在 Azure 机器学习服务中,无论使用何种方法训练机器学习模型,模型部署的步骤都是相同的。Chapter 5 讲述了部署过程,所以我们在这里不详细介绍。

paml 1018

Figure 9-18. 部署最佳模型

接下来,让我们看看如何使用 Power BI 训练自动 ML 模型。

Power BI

许多数据分析师和 BI 专业人士使用 Power BI 进行指标、仪表板和分析,但他们希望利用机器学习创建智能体验和流程。

我们将使用相同的 NASA 数据集,并学习如何在 Power BI 中使用自动 ML 构建机器学习模型。

准备数据

首先,您需要在 Power BI 中创建新的数据流。使用文件 Chap_9_PBI_Democratizing_machine_learning_with_AutomatedML.csvhttp://bit.ly/2meKHs8 加载 NASA 数据集。

创建新数据流并创建新实体。Power BI 数据流支持导入多种格式和来源的数据,如 Figure 9-19 所示。对于这个实验,请选择文本/CSV 选项。

paml 1019

Figure 9-19. 数据源选择

如 图 9-20 所示,选择数据集路径。

paml 1020

图 9-20. 选择 CSV 文件路径

在新创建的实体中审查数据,然后单击“保存并关闭”,如 图 9-21 所示。

paml 1021

图 9-21. 审查数据

自动化 ML 训练

现在,您已经准备好使用一个数据实体。您会注意到新创建实体选项中有一个大脑图标。您可以通过单击此选项来创建一个新的机器学习模型,如 图 9-22 所示。

paml 1022

图 9-22. 添加机器学习模型

接下来,您将进行自动化 ML 作者步骤。考虑到数据分析师和 BI 专业人士可能没有复杂的数据科学专业知识,此过程非常简单。第一步是选择数据实体(这里是自动选择的,因为我们从该数据实体开始)和要进行训练的标签列。如 图 9-23 所示。

paml 1023

图 9-23. 选择数据实体和标签列

系统将尝试分析标签列并推荐适当的模型类型。在这种情况下,它是一个回归模型,如 图 9-24 所示。

paml 1024

图 9-24. 模型类型推荐

如果需要,您还可以灵活选择不同的模型类型,如 图 9-25 所示。

paml 1025

图 9-25. 模型类型选择

在将其建模为回归问题的情况下,下一步是选择输入特征。系统会建议一些特征,但您可以选择自己喜欢的特征,如 图 9-26 所示。您可以手动取消选择像“单位”这样对预测无帮助的列。

paml 1026

图 9-26. 特征选择

在最后一步中,如 图 9-27 所示,您提供模型名称并提交进行训练。

paml 1027

图 9-27. 开始训练

这是调用自动化 ML 来训练多个模型,以期为此场景产生一个良好模型的时机。

理解最佳模型

当训练完成时,您将收到一个通知,其中包含指向报告的链接,该报告可以帮助您更清楚地了解最佳模型以及训练过程。

对于最佳模型,图 9-28 显示了模型性能的指标和详细信息。与之前看到的 Azure UI 不同,Power BI 直接提供最佳模型以简化决策过程。

paml 1028

图 9-28. 模型性能

图 9-29 演示了此报告还提供了关于最佳模型的特征化以及算法和超参数值的详细信息。

paml 1029

图 9-29. 特征化和算法/超参数

在此示例中,最佳模型是一个集成模型,因此我们可以看到关于该模型组成的更多详细信息,如图 9-30 所示。

paml 1030

图 9-30. 集成模型细节

此报告还提供了获取模型特征重要性或影响模型质量的关键特征的选项。图 9-31 说明了循环次数和 sm4 是影响模型质量的顶级特征。

paml 1031

图 9-31. 特征重要性

理解自动化 ML 训练流程

报告的下一部分详细介绍了训练过程,如图 9-32 所示。在这里,您可以看到不同迭代中的模型质量。

paml 1032

图 9-32. 自动化 ML 训练细节

模型性能报告还提供了更新模型训练使用新参数并重复该过程的选项。图 9-33 显示屏幕右上角的“编辑模型”选项。

paml 1033

图 9-33. “应用模型”和“编辑模型”选项

模型部署与推断

当您对模型满意时,请从模型性能报告中点击“应用模型”选项(如图 9-33 所示)。这将带您通过一个简单直观的流程选择一个测试数据集/实体,并在其上添加列,这些列将根据该训练模型进行填充。当新数据记录进入此数据流实体时,新添加的列将自动填充,推断我们刚刚构建和部署的模型。

促进协作

到目前为止,您已经看到自动化 ML 在多个产品和工具中变得可用,以帮助不同水平的用户训练机器学习模型。随着企业在机器学习和人工智能上的投资越来越多,一种趋势正在形成,即不同角色的人们希望合作实现端到端的机器学习工作流程。在本节中,我们讨论了展示这一趋势的两种情景。

Azure 机器学习到 Power BI

尽管 Power BI 中的自动化 ML 使数据分析师能够轻松构建机器学习模型,但他们也希望利用其组织中专业数据科学家构建的模型。借助 Power BI 的 AI 洞察功能,可以非常轻松地消费使用 Azure 机器学习训练的任何机器学习模型,包括使用 Azure UI 构建的模型。

此章中,您了解到如何在 Azure 中使用自动化 ML UI 来训练模型,并将训练后的模型部署为 Web 服务。借助 Power BI AI 见解功能,分析师可以发现并在其 Power BI 工作负载中使用所有这些已部署的 Web 服务。让我们来看看这个流程。

第一步是编辑已创建的 Power BI 数据流实体,如图 9-34 所示。

paml 1034

图 9-34. 编辑数据流实体

接下来,点击“AI 见解”,如图 9-35 所示。

paml 1035

图 9-35. 选择“AI 见解”

这会查询所有可用的 Azure 机器学习部署模型。如图 9-36 所示,选择与正在使用的数据流实体相关的模型,然后点击应用。

paml 1036

图 9-36. AI 见解;选择相关模型

这将基于模型为实体添加一个新列,如图 9-37 所示。

paml 1037

图 9-37. 预测

您现在了解了分析师如何在 Power BI 中使用 Azure 机器学习训练的模型。在图 9-38 中从右到左的流程展示了这一协作场景。

paml 1038

图 9-38. 促进协作

Power BI 自动化 ML 到 Azure 机器学习

本章早些时候,您看到分析师如何在 Power BI 中使用自动化 ML 构建机器学习模型。也许这些分析师希望与其组织中的专业数据科学家分享他们的模型及培训流程,以便审查、批准或改进。如果有一种方法可以生成覆盖 Power BI 中发生的自动化 ML 培训过程的 Python 代码,这种情况可能会出现。事实上,确实有这样的方法,图 9-38 中从左到右的流程展示了这一协作场景。

我们预计未来会有更多类似的场景出现,以便促进不同角色之间的协作,从而更轻松地构建和管理规模化的机器学习模型。

结论

恭喜您已经到达本书的最后一章!

在本章中,您看到任何人都可以使用自动化 ML,而不论他们是否具备数据科学和 Python 专业知识。预计这一趋势将继续下去,因为自动化 ML 将继续与用户已知和喜爱的各种产品和工具集成。这展示了机器学习和人工智能的真正简化和民主化。

你开始学习本书中介绍的机器学习社区和 Azure 上正在发生的创新。这些创新正在推动自动化机器学习的发展。你了解到 Azure 机器学习如何使数据科学家能够管理整个机器学习生命周期,训练各种类型的模型(例如分类、回归和预测),使用自动化机器学习。我们还研究了模型可解释性以及 Azure 机器学习如何为数据科学家提供特征重要性的洞见,等等。你学会了如何构建容器映像,测试部署的模型,并将其部署到各种计算环境——从 Azure 上的 REST API 到容器或边缘设备等等。

我们对自动化机器学习将让你能够实现的内容感到兴奋,迫不及待想听听你构建的 AI 解决方案!

posted @ 2025-11-09 18:00  绝不原创的飞龙  阅读(10)  评论(0)    收藏  举报