大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
个人主页-Sonhhxg_柒的博客_CSDN博客
欢迎各位→点赞 + 收藏⭐️ + 留言
系列专栏 - 机器学习【ML】 自然语言处理【NLP】 深度学习【DL】
foreword
✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。
如果你对这个系列感兴趣的话,可以关注订阅哟
文章目录
回顾 ML 平台的全貌
了解业务问题
数据收集、处理和清理
了解数据源、位置和格式
了解数据处理和清洗
进行探索性数据分析
了解样本数据
箱线图
直方图
密度图
了解特征工程
数据增强
构建和评估 ML 模型
选择评价标准
构建模型
部署模型
再现性
概括
到目前为止,您已经了解了该平台的一些组件以及它的工作原理。您将从宏观层面了解平台开始本章。整体视图将帮助您了解组件如何为您的机器学习( ML ) 需求编织完整的解决方案。
在本章的后面部分,您将看到如何使用一个简单的示例来启动一个 ML 项目,以及团队和平台将如何帮助您实现所需的目标。
在本章中,您将了解以下主题:
在前面章节,您已经在 Kubernetes 之上构建了一个完整的 ML 平台。您已经安装、配置和探索了平台的不同组件。在开始使用该平台之前,让我们退后一步,从工具的角度看一下您构建的平台。图 8.1展示了平台的完整逻辑架构:
图 8.1 – 逻辑平台架构
图表图8.1中还显示了每个平台组件的交互。整个平台在 Kubernetes 内部运行,完全由开放数据中心( ODH ) 运营商管理。虽然MinIO 不是 ODH 项目的正式组成部分,我们已将其添加为另一个ODH 算子在你刚搭建的平台上操作的组件。在现实世界中,您将拥有一个 S3 存储服务器,并且您不需要在Kfdef文件中包含 MinIO。还需要注意的是,ODH 运算符允许您添加或删除工具或将一种工具换成另一种。例如,您可以使用 Argo CD 代替 Airflow 进行模型部署。Keycloak 也不属于 ODH 项目。但是,必须通过单点登录机制保护组件,而 Keycloak 是最好的开源工具之一,可用于向平台添加单点登录功能。
从图表顶部开始,您可以看到最终用户与 Jupyter 笔记本以及 Spark、Airflow 和 MLflow UI 进行交互。在前面的章节中,您已经看到并经历了这些交互。然后,应用程序可以通过 REST API 调用将部署的 ML 模型用于推理。
在图的中间,您可以看到组件之间的交互以及它们彼此之间执行的交互类型。Jupyter 服务器和 Airflow 作业可以将 Spark 应用程序提交到托管的 Spark 集群。Airflow 与 MLflow 模型注册表交互,而 Jupyter 笔记本可以与 MLflow 交互以记录实验运行。Airflow 还创建 Seldon 部署对象,然后 Seldon 控制器将其转换为运行中的 Pod,其中 ML 模型公开为 REST 服务。一个组件与其他平台组件的交互方式没有限制。
在图的底部,ODH 操作员管理和操作平台组件。ODH 操作员处理这些组件的安装和更新。Spark、JupyterHub 和 Seldon 控制器也是 Kubernetes 运营商,分别管理 Spark 集群、Jupyter 笔记本服务器和 Seldon 部署的实例。
最后,ODH 操作员还管理 Prometheus 和 Grafana 实例。Prometheus 用于收集每个组件的指标,包括 Seldon 部署的统计信息。然后,Grafana 可以可视化这些指标,并可以配置为发出警报。
ODH 项目仍在不断发展。将来项目中将包含或排除哪些组件可能会发生变化。随着时间的推移,一些官方支持的组件可能会被另一个组件替换。因此,重要的是要了解架构以及 ODH 运算符的工作原理,以便您保持最新状态。
在接下来的部分中,我们将退后一步,更多地了解 ML 项目,从识别适合 ML 解决方案的机会开始。您将通过一个场景来创建一个完整的 ML 项目。
与任何软件项目,首先要就您要解决的业务问题达成一致。我们为本书选择了一个虚构的场景,以保持简单,同时专注于过程。您可以将相同的方法应用于更复杂的项目。
假设您在一家航空公司预订公司担任首席数据分析师。贵公司的业务团队报告说,许多客户抱怨航班延误。这导致公司的客户体验不佳,电话工作人员花费大量时间向客户解释细节。该公司希望您提供一种解决方案,以确定哪些航空公司以及哪些航班和时间的延误概率较低,以便网站可以优先考虑这些航空公司,从而减少客户延误。
让我们在这里喘口气,分析一下如何解决这个问题。我们这里需要机器学习吗?如果我们获取历史数据并将航空公司放入延迟和准时两个桶中,每个桶将航空公司放入正确的类别中,然后可以在客户搜索具有更好准点性能的航空公司时使用此属性。一组数据分析师将分析数据并分配评级。任务完成!
在探索这一套时,该企业曾提到,每家航空公司一个存储桶可能无法提供解决方案所需的粒度。他们希望评估绩效,而不是在航空公司层面,而是使用其他因素,如出发地和目的地机场和一天中的时间。因此,从悉尼飞往墨尔本的航空公司 A 可能会进入准点时段,而从东京飞往大阪的同一家航空公司可能会进入延误时段。这突然扩大了问题的范围。如果您需要以这种粒度分析数据,则需要花费大量时间来处理和分配正确的类别,并且您可能需要非常频繁地分析这些数据。
您是否开始考虑如何实现自动化?企业随后提到天气在这个问题中起着至关重要的作用,需要从气象局获取和预处理预测数据以执行分析。您意识到与人力团队一起执行这项工作将是缓慢而复杂的,并且无法提供业务正在寻找的解决方案。然后,您向企业提及您需要调查现有数据,这些数据可用于预测特定航班的正确类别。您和商家同意,目标是在预定时间前 10 天以至少 75% 的准确率预测航班延误,以改善客户体验。
您刚刚定义了该项目的成功标准。您已向业务部门传达,您的团队将分析可用数据以评估其对项目的适用性,然后规划后续步骤。您已要求企业联系一位主题专家( SME ),他在这个阶段可以协助数据探索。
总而言之,您已经概述了项目的业务目标和范围。您还定义了衡量项目成功与否的评估标准。在 ML 的每个阶段记录业务价值至关重要生命周期。
定义标准后,下一步就是开始查看可用数据。对于这个用例,数据可在2015 Flight Delays and Cancellations | Kaggle获得。
在这个阶段,您将从已确定的来源收集原始数据开始。您将编写数据管道来准备和清理原始数据以进行分析。
你有开始在职的与 SME 访问飞行数据的子集。您将了解访问此数据所需的数据格式和集成过程。数据可以是 CSV 格式,也可以在某些关系数据库管理系统( RDBMS ) 中可用。了解这些数据如何可用至关重要为您的项目以及最终如何维护这些数据。
通过确定哪些数据易于获得来开始此过程。SME 提到,航班记录数据包括航班信息、预定和实际起飞时间以及预定和实际到达时间都是现成的。此信息在您组织的对象存储中可用。这可能是一个很好的起点。
数据集从原始数据来源可能会有很多问题。收集的数据可能有重复、缺失值和/或无效记录。例如,您可能会发现字符串类型的列中可能包含数字数据。然后,您将与 SME 一起找出处理异常的方法。
您将如何处理丢失的数据?从现有集合中选择缺失数据的估计值。或者,如果有许多缺失值并且您找不到任何方法来估算缺失值,您可能会决定完全删除该列。
实施数据验证检查以确保清理后的数据集具有一致性,并且此处描述的数据质量问题得到妥善处理。假设年龄列的值为250。尽管我们都想活这么久或更长,但显然这些数据是无效的。在此阶段,您会发现数据中的差异并制定处理方法。
您可能会发现航班到达和离开时间是在当地时区,您可以选择添加一个以 UTC 格式表示时间的新列以便于比较。
数据清洗可以发生在数据工程阶段和模型开发阶段。与领域或业务逻辑相关的数据异常可以在数据工程阶段发现和处理,而数据扩充和数据编码则在模型开发阶段完成。这是因为数据科学家或 ML 工程师最了解模型训练所需的数据格式,而数据工程师则更接近业务领域专家。
在数据工程阶段实现此类数据验证的一种方法是通过 Apache Spark。Spark 具有一组可用于数据清理的内置函数。以下代码显示了如何在从数据源读取时过滤掉无效行或包含格式错误数据的行的示例:
dataframe = spark.read.option("header", True).option("mode", 'DROPMALFORMED').csv('flights.csv')
另一个例子是fillna()函数。它用于将空值替换为任何其他值。以下示例显示如何用零替换数据框中的所有空值:
dataframe = dataframe.fillna(value=0)
在模型开发方面,有几种技术可以使用 pandas 来执行相同的操作来操作数据帧。您将在接下来的章节中看到这一点。
一旦您执行了数据清理管道并创建了一个中间数据集,该数据集可以是用于下一阶段,下一步是查看可用数据是否有助于您实现业务目标。
在这个阶段,你分析数据以评估其对给定问题的适用性。数据分析对于构建 ML 模型至关重要。在创建 ML 模型之前,您需要了解数据的上下文。分析大量的公司数据并将其转换为有用的结果是极其困难的,而且对于如何做到这一点没有单一的答案。弄清楚哪些数据是有意义的,哪些数据对业务至关重要,这是您的机器学习模型的基础。
这是一个初步的分析,并不保证模型会带来预期的结果。但是,它提供了在更高级别理解数据并在需要时进行调整的机会。
当你得到一组数据,您首先尝试通过仅查看它来理解它。然后,您将处理业务问题并尝试确定哪些模式集有助于给定情况。很多时候,您需要与具有相关领域知识的 SME 合作。
在这个阶段,您可以选择将数据转换为表格形式以便更好地理解它。根据数据值对列进行分类。了解数据集中的每个变量,并找出这些值是否是连续的,或者它是否代表一个类别。然后,您将使用描述性统计来汇总列,以了解您的列包含的值。这些统计数据可以是平均值或中值或任何有助于您理解数据的东西。
理解数据方差。例如,您的数据中只有 5% 的航班延误记录,其余航班准点。这个数据集对你想要的结果有好处吗?你需要得到一个更好的数据集来代表更平衡的分布。如果数据集高度不平衡,您可以选择通过减少多数类的示例来对数据集进行下采样。
人类擅长可视化数据,因此,为了更好地理解数据,您需要使用图表可视化列。有一系列不同的图表可以帮助您可视化数据。我们在这里展示的平台将帮助您编写代码以使用流行的库(如 Matplotlib 或 Seaborn)来可视化数据。在您选择使用图表可视化数据之前,请考虑您希望获得什么样的信息从图表以及它如何帮助您理解数据。
例如,我们定义了三个基本图表及其特征,在以下小节中给出。
一个盒子情节(Box plot review (article) | Khan Academy)是一个可视化和理解数据差异的绝佳方式。箱线图以四分位数显示结果,每个四分位数包含数据集中 25% 的值;绘制这些值以显示数据的分布方式。图 8.2显示了一个示例箱线图。注意黑点是异常值:
图 8.2 – 箱线图
箱线图的第一个组成部分是数据集的最小值。然后是下四分位数,或最低 25% 的值。之后,我们得到数据集 50% 的中值。然后,我们有上四分位数,最大 25% 的值。在顶部,我们有基于数据集范围的最大值。最后,我们有异常值。异常值是极端数据点——无论是偏高还是偏低——可能潜在的影响分析。
直方图代表_数值数据分配。要创建直方图,首先将值范围拆分为间隔称为bins。一旦您定义了存放数据的 bin 数量,然后将数据放入适当 bin 中的预定义范围内。直方图根据预定义的 bin 显示数据的分布。图 8.3显示了一个示例直方图。请注意,箱子位于绘图的x轴上。下图显示了仅在两个 bin 中的分布。您可以看到分布偏向第一个 bin。
图 8.3 – 直方图
中的一个直方图的缺点是它们对 bin 边距和 bin 数量敏感。分布形状受 bin 定义方式的影响。如果您的数据包含更多离散值(例如性别或邮政编码),则直方图可能更适合。否则,另一种方法是使用密度图,它是直方图的更平滑版本。图 8.4显示了一个样本密度图:
图 8.4 – 密度图
完成探索性数据分析后,您可以选择返回并收集更多来自现有来源的数据或寻找新的数据来源。如果您在此阶段确信您捕获的数据可以帮助您实现业务目标,那么您将进入下一个阶段,特征工程。
机器学习就是一切数据。无论我们的算法多么先进,如果数据不正确或不够,我们的模型将无法按预期执行。特征工程将输入数据转换为与模型目标紧密一致的特征,并将数据转换为有助于模型训练的格式。
有时,有些数据可能对给定的训练问题没有用处。我们如何确保算法只使用正确的信息集?那些不是单独有用的字段怎么办,但是当我们将一个函数应用于一组字段时,数据变得特别有用?
使您的数据对算法有用的行为称为特征工程。大多数时候,数据科学家的工作是为给定问题找到正确的数据集。特征工程需要了解特定领域的技术,您将与业务 SME 合作以更好地理解数据。
特征工程不仅是从现有数据中找到正确的特征,而且您可能需要创建新的现有数据的特征。这些特征被称为工程特征。
想象一下,在你的航班数据集,有字段提到schedule_departure_time和leave_time。这两个字段都会告诉您航班是否晚点。但是,您的企业正在寻求对航班是否晚点进行分类。您和企业同意将延迟分为以下三类:
短暂延迟捕获的航班起飞时间最长为 30 分钟。所有其他延误航班均按延误列中的长时间延误值分类。您需要将此列或特征添加到数据集中。
您最终可能会删除对给定问题可能无用的列。您认为“取消原因”列可能对预测航班延误有用吗?如果没有,您可以选择删除此列。
您还将表示可以被 ML 算法轻松消化的数据。很多机器学习算法都对数值进行操作;但是,并非所有数据都采用数字格式。您将应用技术例如one-hot 编码将列转换为数字格式。
通常,ML 算法在–1和1之间的值范围内工作得很好,因为它更快收敛并导致更好的训练时间。即使您有数字数据,将其转换为范围也是有益的,并且这样做称为缩放。在此阶段,您可以编写代码来扩展数据集。
在一些情况下,您可能需要创建其他数据集中的记录有几个原因。一个原因是您没有足够的数据来训练一个有意义的模型,而另一个原因是您故意想要影响模型的行为以支持一个答案而不是另一个答案,例如纠正过拟合。这个创建合成数据的过程称为数据增强。
与数据收集、处理、清理、数据分析、特征工程和数据增强相关的所有活动都可以通过使用 Jupyter 笔记本和可能的 Apache Spark 在平台中完成。
清理、分析和转换数据集后,下一步就是构建和训练 ML 模型。
恭喜!你是现在准备好训练你的模型了。您将首先评估哪组算法非常适合给定问题。是回归问题还是分类问题?您如何评估模型是否实现了业务描述的 75% 的正确可预测性?
让我们从精度作为模型评价标准。这记录了预测值与测试数据集中的标签相同的次数。但是,如果数据集没有正确的方差,模型可能会猜测每个示例的多数类,这实际上并没有学到关于少数类的任何信息。
您决定使用混淆矩阵来查看每个类的准确性。假设您的数据中有 1,000 条记录,其中 50 条被标记为延迟。因此,有 950 个带有准时标签的示例。现在,如果模型正确预测了 950个中的920个准时和50 个中的12个延迟标签,则矩阵将类似于图 8.5中的表格:
图 8.5 – 混淆矩阵
对于不平衡的数据集,建议选择召回率和精度或F-score等指标至得到一个完整的图片。在这种情况下,精度为 31% (12/38),召回率为 24% (12/50),而准确度为 93.2% (932/1000),这在您的场景中可能会产生误导。
你将从将数据拆分为训练集、验证集和测试集。考虑一个场景,您将数据拆分为这些集合并训练模型;我们称这个实验为 1。现在,您想使用不同的超参数重新训练模型,然后再次拆分数据以进行新的迭代并训练模型;我们称之为实验 2。如果两个实验的数据拆分不一致,你能比较两个实验的结果吗?至关重要的是,您的数据拆分是可重复的,以比较您的训练练习的不同运行。
您将尝试不同的算法或一组算法来评估数据验证集的性能并查看预测的质量。在此阶段,每次您尝试对模型进行新的调整(例如,超参数或不同的算法)时,您都会测量并记录在了解业务问题阶段与 SME 设置的评估指标。
建模阶段的大部分步骤都是迭代的。根据您的实验结果,您可能会意识到模型性能不如预期。在这种情况下,您可能希望返回到生命周期的先前步骤,例如特征工程。或者,您可能需要重新进行数据分析以确保正确理解数据。在培训期间,您将重新审视业务目标和数据以找到适当的平衡点。您可能会决定需要来自新来源的额外数据点来增强训练数据。强烈建议您在此阶段向业务利益相关者展示结果。这种沟通会在初始阶段将模型的价值分享给业务,收集早期反馈,并给团队一个如果需要,有机会改正。
下一阶段是部署您的模型进行推理。
一旦您已经训练了您的模型,下一阶段是在 MLflow 中对模型进行版本控制,并将其部署到模型可用于对传入请求进行预测的环境中。模型的版本控制将允许您跟踪模型并在需要时回滚到旧版本。
在本书中,我们将使用在线模型推理方法。该模型已使用平台的 Seldon 组件进行容器化,并作为 REST API 公开。对该 REST API 的每次调用都会产生一个预测。由于容器固有的扩展能力,运行在 Kubernetes 上的无状态容器将扩展数十万个请求。
另一种方式是批量处理传入的请求。想象一个场景,您有数十万条标记数据记录,并且您想要测试所有这些记录的模型行为。在这种情况下,进行单独的 REST API 调用可能不是正确的方法。相反,批量推理提供了一种异步方法来对数百万条记录进行预测。Seldon 有能力推断成批的数据,但这超出了本书的范围。
Web 应用程序可以利用您为航班延误预测公开的 REST API 来进一步增强客户体验。
现在你知道了ML 生命周期是什么样的,以及该平台如何在您旅程的每一步中为您提供帮助。作为个人,您可以在单个笔记本中编写数据管道和模型训练和调整的每一步。但是,这可能会在不同的人在生命周期的不同部分工作的团队中引起问题。假设有人想要运行模型训练部分,但整个过程相互关联。您的团队可能无法使用这种方法进行扩展。
一种更好且更具可扩展性的方法是为项目生命周期中的各个阶段(例如数据处理和模型训练)编写不同的 notebook,并使用工作流引擎将它们捆绑起来。使用 Kubernetes 平台,所有阶段都将使用容器执行,并在不同运行之间为您的项目提供一致的环境。该平台提供 Airflow,这是一个可用于创建和执行工作流的引擎。
在这个简短的章节中,我们想退后一步,向您展示平台和模型生命周期的大图。我们鼓励您参考第 2 章,了解 MLOps,我们在其中介绍了典型的 ML 生命周期,以进行更详细的讨论。回想一下跨多个团队协作的重要性,以及如何投入更多时间来了解可用数据将产生一个提供预期业务价值的模型。
现在您知道项目的各个阶段会是什么样子。在接下来的两章中,您将使用我们在本书中介绍的机器学习平台来实现航班延误预测服务,并且您将执行我们在本章中描述的每个阶段。这个想法是向您展示该平台如何满足您项目的每个阶段以及您如何在您的组织中实施该平台。