# 3

# 机器学习管道

模型训练只是机器学习过程中的一小部分。 数据科学家经常花费大量时间来清理，转换和准备数据，以使其准备好供机器学习模型使用。 由于数据准备是一项非常耗时的活动，因此，我们将介绍最先进的技术来促进该活动以及其他组成良好设计的生产机器学习管道的组件。

在本章中，我们将涵盖以下关键主题：

*   机器学习管道到底是什么？
*   生产质量的机器学习管道的组成部分是什么？
*   部署机器学习模型时的最佳实践是什么？
*   机器学习管道到位后，我们如何缩短部署周期？

# 什么是机器学习管道？

许多开始进行机器学习训练的年轻数据科学家都希望立即跳入模型构建和模型调整阶段。 他们没有意识到，创建成功的机器学习系统所涉及的不仅仅是在随机森林模型和支持向量机模型之间进行选择。

从选择适当的提取机制到数据清理再到特征工程，机器学习管道中的初始步骤与模型选择一样重要。 出色的结果和平庸的结果之间的区别还在于，能够正确地测量和监视模型在生产中的性能，并决定何时以及如何重新训练模型。 随着世界的变化，您的输入变量也会变化，并且您的模型也必须随之变化。

随着数据科学的发展，期望值越来越高。 数据源变得更加多样化，数量庞大（就大小而言）并且数量众多（就数量而言），并且管道和工作流变得更加复杂。 我们期望越来越多的数据本质上是实时的，这无济于事。 考虑一下网络日志，点击数据，电子商务交易和自动驾驶汽车输入。 这些系统中的数据来得太快了，我们必须拥有能够比接收到的信息更快处理信息的方法。

存在许多机器学习解决方案来实现这些管道。 当然，仅使用 Python 或 R 语言就可以建立基本的机器学习管道。 我们将通过布局使用 Python 的管道示例来开始建立我们的理解。 在本章中，我们将详细探讨一些利用当今最流行工具的体系结构。 数据管道通常利用的一些工具是：

*   Hadoop 的
*   火花
*   火花流
*   卡夫卡
*   蔚蓝
*   AWS
*   Google Cloud Platform
*   [R
*   SAS
*   数据块
*   蟒蛇

正如我们将看到的，其中一些更适合管道的某些阶段。 让我们快速概述一下设置机器学习管道所需的最少步骤。

要考虑的一个重要事项是，管道中的每个步骤都会产生输出，该输出将成为管道中下一步的输入。 术语*管道*有点误导，因为它暗示了单向数据流。 实际上，机器学习管道可以是循环的和迭代的。 可能会重复管道中的每个步骤，以获得更好的结果或更干净的数据。 最后，下一次执行管道循环时，可以将输出变量用作输入。

机器学习管道的主要步骤是：

1.  **问题定义**：定义业务问题。
2.  **数据摄取**：识别并收集数据集。
3.  **数据准备**：使用以下技术处理和准备数据：
    *   估算缺失值
    *   删除重复的记录
    *   标准化值（更改数据集中的数值以使用通用刻度）
    *   执行另一种类型的清理或映射
    *   完整的特征提取
    *   消除相关特征
    *   执行特征工程
4.  **数据隔离**：将数据拆分为训练集，验证集和测试集。
5.  **模型训练**：针对训练数据集训练机器模型。 这是数据科学的核心。 在本章中，我们将仅涉及此步骤的表面以及后续步骤。 本书中还有其他章节将更详细地介绍模型训练。 在这里列出它主要是为了使读者完整了解整个管道。
6.  **候选模型评估**：使用数据的测试和验证子集来测量模型的性能，以确定模型的准确性。
7.  **模型部署**：一旦选择了模型，请将其部署到生产中以进行推断。

1.  **性能监视**：连续监视模型性能，相应地进行重新训练和校准。 收集新数据以继续改进模型并防止其过时：

![](img/B15441_03_01.png)

图 1：机器学习管道

让我们进一步探索并深入研究管道的组成部分。

# 问题定义

在设置管道时，此可能是最关键的步骤。 在此花费的时间可以在管道的后期阶段为您节省大量的时间。 这可能意味着技术突破或失败之间的差异，也可能意味着创业公司成功或破产之间的差异。 提出和提出正确的问题至关重要。 考虑以下警告故事：

> “鲍勃花了数年时间计划，执行和优化如何征服山丘。不幸的是，结果证明那是错误的山丘。”

例如，假设您要创建一个管道来确定贷款违约预测。 您最初的问题可能是：

*对于给定的贷款，它是否违约？*

现在，这个问题不区分贷款第一个月或贷款二十年的违约。 显然，与发行终止后的贷款相比，在发行时出现违约的贷款的利润要低得多。因此，一个更好的问题可能是：

*贷款何时会违约？*

这是一个更有价值的问题。 我们可以做得更好吗？ 有时借款人可能每月不会发送全额应付款。 有时，借款人可能会零星发送款项。 为了解决这个问题，我们可能会进一步完善问题：

*给定的贷款将获得多少钱？*

让我们进一步改善它。 今天的一美元比将来的一美元更值。 因此，财务分析师使用公式来计算货币的现值。 关于借款人偿还多少贷款同样重要的是他们何时偿还贷款的问题。 另外，您还有预付款的问题。 如果借款人预付了一笔贷款，这将使该笔贷款的利润减少，因为它将收取的利息减少。 让我们再次更改问题：

*一笔给定贷款的利润是多少？*

我们完成问题了吗？ 也许。 让我们再考虑一件事。 根据法律，某些输入变量不允许用于确定默认利率。 例如，种族和性别是不能用来确定贷款资格的两个因素。 再尝试一次：

*如果不使用不允许的输入功能，给定贷款的利润将是多少？*

我们将其留给读者以进一步完善问题。 如您所见，机器学习管道中的第一步和关键步骤需要考虑很多问题。

# 数据提取

一旦达到您满意的程度，您就可以精心制作和完善问题了，现在该收集原始数据以帮助您回答问题了。 这并不意味着一旦继续进行下一步，就无法更改您的问题。 您应该不断完善问题陈述并根据需要进行调整。

为管道收集正确的数据可能是一项艰巨的任务。 根据您要解决的问题，获取相关数据集可能非常困难。

另一个重要的考虑因素是决定如何将数据来源，摄取和存储：

*   我们应该使用什么数据提供者或供应商？ 他们可以信任吗？
*   如何摄取？ Hadoop，Impala，Spark，仅 Python 等？
*   应该将其存储为文件还是数据库中？
*   什么类型的数据库？ 传统的 RDBMS，NoSQL，图。
*   它甚至应该存储吗？ 如果我们有实时输入管道，甚至可能没有必要或没有效率地存储输入。
*   输入应采用什么格式？ 实木复合地板，JSON，CSV。

很多时候，我们甚至可能无法控制输入源来决定应采用的格式，我们应按原样进行处理，然后决定如何进行转换。 此外，我们可能没有唯一的数据源。 在我们可以将它们输入模型之前，可能需要合并，合并和合并多个源。

尽管我们长期以来都希望人工智能和能够取代人类智能，但是确定输入数据集中应包含哪些变量仍然需要人类智能，甚至可能有些古老的人类直觉。

如果您要预测股价，那么前一天的股价似乎是显而易见的输入。 其他输入（例如利率，公司收益，新闻标题等）可能不太明显。

对于餐厅的日常销售，前一天的销售可能也很重要。 其他可能包括：星期几，节假日或不节假日，下雨或不下雨，每天的人流量等等。

对于象棋和围棋这样的游戏系统，我们可能会提供以前的游戏或成功的策略。 例如，人类学习国际象棋的最佳方法之一是学习大师级玩家过去成功使用的开局和技巧以及观看过去锦标赛中完成的游戏。 通过使用此先前的知识和历史来决定将来的游戏方式，计算机可以以相同的方式学习。

到目前为止，选择相关的输入变量并建立成功的模型仍然需要数据科学家具有领域知识。 并在某些情况下具有深厚的领域知识。 让我们进一步探讨一个例子。

继续以贷款违约为例，让我们考虑一些最重要的功能，以便做出准确的预测。 这是该列表的第一个选项。 由于篇幅所限，我们将不列出所有通常使用的功能。 我们将从数据中学到的内容添加和删除项目：

<colgroup><col> <col> <col></colgroup> 
| **功能名称** | **功能描述** | **为什么有用？** |
| 欠款帐户 | 借款人现在拖欠的帐户数。 | 如果借款人在支付账单方面遇到困难，他们可能会在支付新贷款方面遇到困难。 |
| 贸易账户 | 在过去 24 个月内开设的交易数量。 | 如果数量太少，这只是一个问题。 |
| 借款人地址 | 借款人在贷款申请中提供的地址。 | 放下 地址是唯一的。 唯一变量不提供预测能力。 |
| 邮政编码 | 借款人在贷款申请中提供的邮政编码。 | 这不是唯一的，可以具有预测能力。 |
| 年收入 | 借款人在注册期间提供的自报年收入。 | 更多的收入使借款人可以更轻松地处理更大的付款。 |
| 当前余额 | 所有帐户的平均当前余额。 | 孤立地没有价值。 需要相对。 |
| 冲销 | 12 个月内的注销次数。 | 指示借款人以前的违约行为。 |
| 逾期金额 | 借款人现在拖欠其帐户的逾期金额。 | 指示借款人以前的违约行为。 |
| 最早的帐户 | 自最早的循环帐户开设以来的月数。 | 表示借款人借钱的经历。 |
| 就业时间 | 就业年限。 | 表示借款人的稳定性。 |
| 贷款额度 | 在该时间点对该贷款的承诺总额。 | 孤立地没有价值。 需要相对。 |
| 查询数量 | 个人理财查询数量。 | 借款人寻找信用。 |
| 利率 | 贷款利率。 | 如果贷款的利率很高，则还款额将更多，并且可能难以偿还。 |
| 最大余额 | 所有循环帐户上的最大当前余额。 | 如果接近 100％，则可能表明借款人有财务困难。 |
| 自上次公开记录以来的月数 | 自上次公开记录以来的月数。 | 指示先前的财务困难 |
| 逾期帐户数 | 逾期 120 天或以上的帐户数 | 当前财务困难的指示 |
| 公开记录 | 贬损的公共记录数 | 指示先前的财务困难 |
| 术语 | 每月偿还贷款的次数。 | 贷款时间越长，潜在的违约可能性就越大。 |
| 当前总余额 | 所有帐户的当前总余额 | 孤立地没有价值。 需要相对。 |

正如我们所看到的，其中某些变量本身并没有提供含义，需要将它们组合起来以进行预测。 这将是特征工程的一个例子。 新变量的两个示例是：

<colgroup><col> <col> <col></colgroup> 
| 信贷运用 | 在所有交易中将平衡到信用额度。 当前余额与信用额度的比较。 | 较高的百分比表示借款人“已用光”，并且在获得新的信贷方面遇到困难。 |
| 债务到收入 | 使用每月总债务支付的总债务（不包括抵押和请求的贷款）除以借款人的自我报告的每月收入来计算。 | 较低的债务对收入比率表明借款人有足够的资源来偿还其债务，并且不应该有满足这些债务的问题。 |

# 数据准备

下一步是处理原始数据的数据转换层； 需要完成的一些转换是：

*   数据清理
*   过滤
*   聚合
*   增加
*   合并
*   存储

云提供商已成为主要的数据科学平台。 一些最受欢迎的堆栈是围绕以下构建的：

*   Azure ML 服务
*   AWS SageMaker
*   GCP Cloud ML 引擎
*   SAS
*   RapidMiner
*   尼姆

执行这些转换的最流行的工具之一是 Apache Spark，但它仍然需要数据存储。 对于持久性，最常见的解决方案是：

*   Hadoop 分布式文件系统（HDFS）
*   HBase 的
*   阿帕奇·卡桑德拉（Apache Cassandra）
*   亚马逊 S3
*   Azure Blob 存储

还可以在数据库内部就地处理数据以进行机器学习。 SQL Server 和 SQL Azure 等数据库正在添加特定的机器学习功能，以支持机器学习管道。 Spark 具有 Spark Streaming 内置的功能。 它可以从 HDFS，Kafka 和其他来源读取数据。

还有其他替代方法，例如 Apache Storm 和 Apache Heron。 不管管道中有什么其他内容，通常都在交互式 Jupyter 笔记本电脑或 R Studio 中完成数据的初始探索。

某些实时数据处理解决方案提供了容错，可伸缩，低延迟的数据提取。 一些最喜欢的是：

*   阿帕奇·卡夫卡
*   Azure 事件中心
*   AWS Kinesis

现在，让我们探讨数据准备的关键操作之一-数据清理。 我们需要确保数据是干净的。 数据将很可能不是完美的，并且数据质量将不会达到最佳。 数据可能由于以下原因而不合适：

## 缺少值

我们的数据经常包含缺失值，或者缺失值被零或 N / A 代替。 我们该如何处理这个问题？ 以下是处理缺失值的六种不同方法：

*   **不执行任何操作**：有时最好的操作是不执行任何操作。 根据所使用的算法，并非总是需要对缺失值进行任何操作。 XGBoost 是可以优雅处理缺失值的算法示例。
*   **使用中值进行插补**：当缺少值时，分配给丢失数据的合理值是该变量的所有其余非缺失值的中值。 此替代方案易于计算，并且快速，并且适用于小型数据集。 但是，它没有提供太多的准确性，也没有考虑与其他变量的相关性。
*   **使用最频繁的值或常量**进行插补：另一种选择是分配最频繁的值或常量（如零）。 这种方法的一个优势是它适用于非数值变量。 像以前的方法一样，它不考虑与其他变量的相关性，并且根据空值的频率，它可以在数据集中引入偏差。

## 重复的记录或值

如果两个值确实相同，则很容易创建可以查找重复值的查询或程序。 如果应该假设两个记录或值标识相同的实体，但是两个值之间存在细微差异，那么麻烦就开始了。 传统的重复数据库查询可能找不到拼写错误，缺少值，地址更改或遗漏中间名的人。 有些人使用别名。

直到最近，查找和修复重复记录一直是一个手动过程，该过程耗时且耗费资源。 但是，一些使用 AI 查找重复项的技术和研究开始兴起。 除非所有详细信息完全匹配，否则很难确定不同的记录是否引用同一实体。 另外，通常大多数重复项都是假阳性。 两个人可能具有相同的姓名，地址和出生日期，但仍然是不同的人。

识别重复项的解决方案是使用模糊匹配而不是精确匹配。 模糊匹配是一种计算机辅助技术，可对数据相似性进行评分。 它广泛用于执行模糊匹配。 讨论模糊匹配不在本书讨论范围之内，但对读者进一步研究该主题可能很有用。

## 功能缩放

数据集通常包含大小不等的特征。 要素大小的这种变化通常会对预测的准确性产生不利影响（但并非总是如此；例如，Random Forest 不需要要素缩放）。 许多机器学习算法使用数据点之间的欧几里得距离进行计算。 如果不进行此调整，则数量级高的要素将对结果产生过重的影响。

用于特征缩放的最常用的方法是：

*   重新缩放（最小-最大归一化）
*   平均归一化
*   标准化（Z 分数标准化）
*   缩放到单位长度

## 值不一致

数据可能经常包含不一致的值。 此外，数据可能以多种方式不一致。 数据不一致的一个示例是街道地址修饰符。 考虑以下数据点：

*   第五大道
*   第五大道
*   第五大道
*   第五大道

作为人类，我们可以快速确定所有这些示例确实具有相同的价值。 计算机很难得出这个结论。

解决此问题的两种方法是基于规则的和基于示例的。 当数据中的可变性较小且不会快速更改时，基于规则的系统会更好地工作。 当我们拥有快速移动的数据时，基于规则的方法就会中断。

考虑一个垃圾邮件过滤器。 我们可以创建一个规则，将带有“ Viagra”一词的任何内容标记为垃圾邮件，但是垃圾邮件发送者可能会变得很聪明，并开始更改数据以绕过该规则（“ Vi @ gra”）。 在这种情况下，基于机器学习示例的清洁器会更好地工作。

有时，我们可能想考虑混合方法并同时使用这两种方法。 例如，一个人的身高应始终为正值。 因此，我们可以为此编写一条规则。 对于具有更多可变性的其他值，我们可以使用机器学习方法。

## 日期格式不一致

*   11/1/2016
*   11/01/2016
*   11/1/16
*   16 年 11 月 1 日
*   2016 年 11 月 1 日 <sup>st</sup>

这些都是相同的值。 因此，我们需要标准化日期。

这不是完整的数据准备清单，而是旨在让您了解需要进行的不同转换才能清理和准备数据以使其有用。

# 数据隔离

按照的顺序使用已处理的数据训练模型，建议将数据分为两个子集：

*   训练数据
*   测试数据

有时分为三个：

*   训练数据
*   验证数据
*   测试数据

然后，您可以在训练数据上训练模型，以便以后对测试数据进行预测。 训练集对于模型是可见的，并根据此数据进行训练。 训练会创建一个推理引擎，以后可以将其应用于模型之前未看到的新数据点。 测试数据集（或子集）表示该看不见的数据，现在可以将其用于对该先前看不见的数据进行预测。

# 模型训练

一旦我们拆分了数据，现在就可以通过一系列模型来运行训练和测试数据，并评估各种模型的性能并确定每个候选模型的准确性。 这是一个反复的过程，可能需要测试各种算法，直到您拥有一个可以充分回答您问题的模型为止。

在后面的章节中，我们将深入研究此步骤。 本书的其余部分提供了大量的模型选择材料。

## 候选模型评估和选择

用训练模型后，各种算法又迈出了关键的一步。 现在是时候选择哪种模型最适合当前的问题。 我们并不总是选择性能最好的模型。 对训练数据执行良好的算法在生产中可能无法很好地执行，因为它可能过度拟合了训练数据。 在这个时间点上，模型选择更多的是一门艺术，而不是一门科学，但是有一些技术需要进一步探索以确定哪种模型最好。

## 模型部署

一旦选择了模型并确定了模型，即可将其用于进行预测。 它通常通过 API 公开，并作为分析解决方案的一部分嵌入到决策框架中。

如何公开和部署它应由业务需求决定。 选择部署时要考虑的一些问题：

*   系统是否需要能够进行实时预测（如果是，预测速度如何：以毫秒，秒，分钟，小时为单位？）
*   需要多久更新一次模型？
*   预计会有多少数量或流量？
*   数据集的大小是多少？
*   是否有需要遵循和遵守的法规，政策和其他约束条件？

确认要求之后，我们现在可以考虑用于模型部署的高级体系结构。 以下是多种选择。 无论如何，这并不是一个详尽的清单，但它确实包含了一些较流行的体系结构：

<colgroup><col> <col> <col> <col> <col></colgroup> 
|  | **RESTful API 架构** | **共享数据库体系结构** | **流架构** | **移动应用架构** |
| **训练方法** | 批量 | 批量 | 流媒体 | 流媒体 |
| **预测方法** | 即时的 | 批量 | 流媒体 | 即时的 |
| **结果交付** | 通过 RESTful API | 通过共享数据库 | 通过消息队列流式传输 | 通过移动设备上的进程内 API |
| **预测延迟** | 低 | 高 | 非常低 | 低 |
| **系统可维护性** | 中 | 简单 | 难 | 中 |

如表中所总结，这四个选项各有利弊。 当我们深入研究体系结构的细节时，还需要考虑更多的考虑因素。 作为示例，可以使用模块化微服务架构或以整体方式来实现这些架构中的每一个。 同样，选择应该由业务需求决定。 例如，可以选择整体方法，因为我们的用例非常有限，需要极低的延迟。

无论为模型部署选择哪种体系结构，使用以下原则都是一个好主意：

*   **可再现性**：存储所有模型输入和输出，以及所有相关元数据，例如配置，依赖项，地理位置和时区。 需要解释过去的预测。 确保每个部署捆绑包的最新版本均可用，其中还应包含培训数据。 例如，这对于受到严格监管的领域尤其重要。
*   **自动化**：尽可能早地自动化训练和模型发布。
*   **可扩展性**：如果需要定期更新模型，则需要从头开始制定计划。
*   **模块化**：尽可能地对代码进行模块化，并确保已放置控件以忠实地再现跨环境的管道（DEV，QA，TEST）。
*   **测试**：分配时间表的重要部分以测试机器学习管道。 尽可能使自动化，并从一开始就将其集成到您的过程中。 探索**测试驱动开发**（ **TDD** ）和**行为驱动开发**（ **BDD** ）。

## 性能监控

一旦模型制作成，我们的工作就不会完成。 将模型投入生产可能并不容易，但是一旦部署了模型，就必须对其进行严格监控，以确保模型运行令人满意。 使模型投入生产需要涉及多个步骤。 对该模型进行连续监控，以观察其在现实世界中的行为并进行相应的校准。 收集新数据以逐步改进它。 同样，监视部署的机器学习模型需要从各个角度进行关注，以确保模型正在运行。 让我们分析一下在监视机器学习模型时需要考虑的这些不同指标，以及为什么每个指标都很重要：

### 模型性能

数据科学环境中的性能并不意味着模型运行的速度如何，而是预测的准确性。 监视机器学习模型的数据科学家主要关注一个指标：漂移。 当数据不再是模型的相关输入或有用输入时，就会发生漂移。 数据可能会更改并失去其预测价值。 数据科学家和工程师必须不断监控模型，以确保模型特征继续与模型训练期间使用的数据点相似。 如果数据漂移，则预测结果将变得不太准确，因为输入功能已过时或不再相关。 例如，考虑一下股票市场数据。 30 年前，市场大为不同。 它与众不同的一些方式包括：

*   证券交易所的交易量大大低于今天
*   高频交易甚至不是一个主意
*   被动指数基金不那么受欢迎

可以想象，这些特征使库存性能显着不同。 如果我们使用具有 30 年历史的数据来训练模型，则很可能无法使用当今的数据来执行模型。

### 营运表现

最终，机器学习管道仍然是软件系统。 因此，监视资源消耗仍然很重要，包括：

*   **CPU 利用率**：识别峰值以及是否可以解释峰值。
*   **内存使用情况**：正在消耗多少内存。
*   **磁盘使用率**：我们的应用程序消耗了多少磁盘空间。
*   **网络 I / O 流量**：如果我们的应用程序跨越实例，则衡量网络流量非常重要。
*   **延迟**：发生数据传输所花费的时间。
*   **吞吐量**：成功传输的数据量。

如果这些指标发生变化，则需要对其进行分析以了解为什么会发生这些变化。

### 总拥有成本（TCO）

数据科学家需要根据每秒记录的数量来监视其模型的性能。 尽管这可以使您更深入地了解模型的效率，但公司还应将重点放在从模型中获得的收益与成本之间。 建议监视机器学习管道的所有步骤的成本。 如果密切跟踪此信息，则企业可以就如何降低成本以及如何把握新机遇，或者某些管道是否不能提供足够的价值而做出明智的决定，而需要进行更改或关闭 下。

### 服务表现

不在业务问题的上下文中的技术是没有用的。 企业经常与技术部门签订**服务级别协议**（ **SLA** ），或至少应该拥有。 SLA 的示例：

*   在一天内修复所有关键错误
*   确保 API 在 100 毫秒内响应
*   每小时至少处理一百万个预测
*   复杂的模型必须在 3 个月内设计，开发和部署

为了使业务最佳运行，重要的是建立，监视和满足先前商定的 SLA。

机器学习模型对于企业而言可能至关重要。 确保它们不会成为瓶颈的关键是正确监视已部署的模型。 作为您的机器学习管道的一部分，请确保监视部署的机器学习模型并与 SLA 进行比较，以确保获得令人满意的业务成果。

# 摘要

本章详细列出了创建机器学习管道所涉及的不同步骤。 此游览应被视为所涉及步骤的初步概述。 随着本书的发展，您将学习如何改善自己的管道，但是我们确实学习了一些当今用于建立管道的最佳实践和最受欢迎的工具。 在审查中，成功管道的步骤如下：

*   问题定义
*   数据提取
*   资料准备
*   数据隔离
*   候选模型选择
*   模型部署
*   性能监控

在下一章中，我们将更深入地研究机器学习管道的步骤之一。 我们将学习如何执行特征选择，并学习什么是特征工程。 这两种技术对于提高模型性能至关重要。