当前关于人工智能(AI)和机器学习(ML)的讨论很大程度上是以模型为中心的,关注ML和深度学习的最新进展。这种以模型为先的方法通常在最好的情况下对用于训练模型的数据付之一笑,而在最坏的情况下则完全忽视了数据。MLOps等领域正出现着系统性地训练和利用ML模型的方法,以尽量减少人为干预,以“释放”工程师的时间。
许多杰出的AI人物敦促数据科学家更多地关注ML的以数据为中心的观点,该观点不太关注模型选择和超参数调整过程,而更多地关注增强所摄取的数据以及用于训练模型的技术。安德鲁·吴曾经说过“机器学习基本上是特征工程”,并且我们需要更多地朝着以数据为中心的方法发展。采用以数据为中心的方法在以下情况下特别有用:
- 数据集观测点较少(<10 K),因此我们可以从较少的行中提取尽可能多的信息。
- 数据集的列数远远多于观测点的数量。这可能导致所谓的维度灾难,描述了ML模型难以从极其稀疏的数据宇宙中学习的情况。
- 数据和模型的可解释性是关键。
- 数据领域本质上复杂(例如,没有干净和完整的数据几乎不可能进行准确的金融建模)。
我们应该关注ML流水线中需要最微妙和仔细思考的部分之一:特征工程。
在本书中,我们将深入探讨用于识别最强特征、创建新特征和衡量ML模型成功与这些特征的强度相关性的不同算法和统计测试程序。在我们的定义中,特征是对ML模型有意义的数据属性或列。我们将通过多个案例研究来进行这些深入探讨,每个案例研究属于不同的领域,包括医疗保健和金融,涉及多种类型的数据,包括表格数据、文本数据、图像数据和时间序列数据。
什么是特征工程,为什么它重要?
特征工程这个术语在不同的数据科学家眼中可能有不同的含义。对于一些数据科学家来说,特征工程是指缩小用于监督模型的特征集的过程(例如,尝试预测响应或结果变量所需的特征)。对于其他人来说,它是从非结构化数据中提取数值表示以供无监督模型使用的方法(例如,尝试从先前非结构化的数据集中提取结构)。特征工程既包括这两个方面,也包括更多内容。
在本书中,特征工程是指将数据进行操作和转换,以使其以最佳方式表示机器学习算法试图建模的底层问题,并减轻数据内在的复杂性和偏差。数据从业者通常依赖于机器学习和深度学习算法,即使他们使用的数据格式不佳且不是最佳的。这种情况的原因多种多样,从从业者过分信任他们的机器学习模型,到简单地不了解处理混乱和不一致数据的最佳实践,希望机器学习模型能够为他们“自动解决”问题。这种方法甚至不会给机器学习模型一个从良好数据中学习并做好的机会,而是从一开始就让数据科学家陷入困境。
关键在于数据科学家是否愿意或能够尽可能多地利用他们的数据,通过为机器学习任务工程化最佳特征。如果我们不工程化合适的特征,而是依赖复杂和慢的机器学习模型来为我们解决问题,那么我们可能会得到性能较差的机器学习模型。如果我们相反花时间了解我们的数据,并为我们的机器学习模型创建特征,使其能够从中学习,那么我们可以得到规模较小、速度较快、性能达到或甚至超越预期的模型。
归根结底,我们希望我们的机器学习模型在我们选择的任何度量标准下表现得尽可能好。为了实现这一目标,我们可以操纵数据和模型(如图1.1所示)。
本书的重点不是如何优化机器学习模型,而是关于如何通过转换和操作数据,使其更容易被机器学习模型处理和学习的技术。我们将展示,有许多特征工程技术可以帮助整个机器学习流程,而不仅仅是选择一个具有更好超参数的模型。
谁需要特征工程?
根据Anaconda公司2020年的“数据科学现状”调查(请参阅www.anaconda.com/state-of-da…),数据整理(我们可以将其视为特征工程的代名词,还包括数据加载这一步骤)占用了不成比例的时间,因此每个数据科学家都关注着这一问题。该调查显示,数据管理仍然占据了数据科学家大部分时间。几乎一半的时间用于数据加载和“清理”。该报告称这一点“令人失望”,并且“数据准备和清理占用了宝贵的时间,使真正的数据科学工作受到了影响。”值得注意的是,“数据清理”是一个相当模糊的术语,很可能被用作探索性数据分析和所有特征工程工作的综合术语。我们认为数据准备和特征工程是数据科学家工作中一个真正重要且几乎不可避免的部分,应该受到与侧重于数据建模的流程一样多的尊重。
本书致力于展示强大的特征工程方法,包括模型公平性评估(在我们的公平性案例研究章节中)、基于深度学习的表示学习(在我们的自然语言处理和图像分析案例研究章节中)、假设检验(在我们的医疗保健案例研究中)等等。这些特征工程技术对模型性能的影响可能与模型选择和训练过程一样大。
什么是特征工程不能做的?
重要的是要提到,良好的特征工程并不是一种万能解决方案。例如,特征工程无法解决我们的ML模型数据过少的问题。虽然没有一个魔法的门槛来确定多少数据算太少,但在大多数情况下,当处理少于1,000行的数据集时,特征工程只能尽力从这些观察结果中挤取尽可能多的信息。当然,也有例外情况。当我们在自然语言处理和图像案例研究中涉及迁移学习时,我们将看到预训练的ML模型如何从仅有的几百个观察结果中学习,但这仅仅是因为它们已经在数十万观察结果上进行了预训练。
特征工程也不能在特征和响应之间建立联系,如果原本不存在这种联系的话。如果我们起初使用的特征在隐含上对我们的响应变量没有任何预测能力,那么无论特征工程做多少,都无法创建这种联系。我们可能会在性能上取得小幅提升,但不能指望特征工程或ML模型会为我们神奇地创建特征和响应之间的关系。
优秀的数据,出色的模型
出色的模型无法存在于优秀的数据之外。在没有深刻反映所面临问题的良好结构化数据的情况下,几乎不可能保证一个准确且公平的模型。
我在机器学习领域的大部分职业生涯中都致力于自然语言处理(NLP)。具体而言,我专注于构建可以从非结构化历史文本和知识库中自动推导和优化对话人工智能架构的机器学习流程。早期,我大部分时间都在专注于推导和实施知识图谱,使用最先进的迁移学习和序列到序列模型来开发对话人工智能流程,这些流程可以从原始人际对话中学习,并能够根据新的对话话题进行更新。
直到我的最新人工智能初创公司被收购后,我才认识到对话架构设计师和语言学家Lauren Senna,她向我介绍了对话中的深层结构,她和她的团队用来构建能够在任何时候胜过我的自动推导机器人的机器人。Lauren告诉我人们与机器人交流的方式以及为什么与知识库文章的编写方式不同,我才终于意识到我需要花更多时间将我们的机器学习工作集中在前期处理工作上,以发掘这些潜在的模式和结构,这样预测系统就能够抓住它们,并变得比以往更加准确。她和我在某些情况下提高了高达50%的机器人性能,我曾在各种会议上演讲,讲述数据科学家如何利用类似的技术来解锁他们自己数据中的模式。
如果不理解和尊重数据,我就永远无法挖掘出模型的潜力,这些模型正在尽力捕捉、学习和扩展数据中锁定的模式。
特征工程流程
在我们深入讨论特征工程流程之前,我们需要稍微回顾一下整个机器学习(ML)流程。这很重要,因为特征工程流程本身是更大的ML流程的一部分,因此这将为我们提供理解特征工程步骤所需的视角。
机器学习流程
机器学习流程通常包括五个步骤(图1.2):
- 定义问题领域:我们尝试用机器学习解决什么问题?这是定义任何我们想要优先考虑的特性的时候,比如模型预测速度或可解释性。这些考虑在模型评估时将至关重要。
- 获取准确代表我们尝试解决的问题的数据:考虑并实施数据收集方法,这些方法要公平、安全,并尊重数据提供者的隐私。这也是进行探索性数据分析(EDA)的好时机,以更好地了解我们正在处理的数据。我假设您已经对数据进行了足够的EDA,我将在本书中尽力帮助您尽可能多地了解我们的数据。如果这是一个监督问题,我们是否要处理类别不平衡的情况?如果这是一个无监督问题,我们是否有足够代表总体的数据样本,以从中获取足够好的洞察?
- 特征工程:这是本书的主要重点,也是我们机器学习流程的关键点。这一步涉及创建能够输入机器学习模型的最佳数据表示的所有工作。
- 模型选择和训练:这是数据科学家流程的一个重要组成部分,应该仔细和谨慎地完成。在这个阶段,我们正在选择最适合我们的数据和第1步中的考虑的模型。如果模型的可解释性被强调为首要考虑因素,也许我们将选择基于树的模型而不是深度学习驱动的模型。
- 模型部署和评估:在这个阶段,我们的数据已经准备好,模型已经训练好,现在是将我们的模型投入生产的时候。在这一点上,数据科学家可以考虑模型版本管理和预测速度作为他们的模型准备就绪的因素。例如,我们是否需要某种用户界面来同步获取预测,还是可以离线执行预测?必须部署评估流程,以跟踪模型随时间的性能,并注意模型退化的情况。
谈到问题领域,作为在某个领域工作的数据科学家,并不需要成为该领域的专家。不过,我强烈鼓励您至少要与领域专家联系,并进行一些研究,以便自己能够理解可能会影响人们的ML流程架构的潜在利弊。
在ML流程的最后一步,我们还需要注意概念漂移(当我们对数据的解释发生变化时)和数据漂移(当我们的数据的基础分布发生变化时)。这些都是关于数据随时间变化的参考。在本书中,我们不需要担心这些概念,但值得深入探讨一下。
概念漂移是指随时间推移,某个特征或响应的统计属性发生了变化的现象。如果我们在某个时间点上对数据集进行训练,那么根据定义,我们拥有一个将我们的特征与响应相关联的函数的快照。随着时间的推移,该数据所代表的环境可能会发生变化,我们对这些特征和响应的认知也可能会发生变化。这个想法通常适用于响应变量,但也可以考虑我们的特征。
想象一下,我们是一家流媒体平台的数据科学家。我们的任务是构建一个模型,以预测何时向用户显示一个减速带,并询问他们是否仍在观看。我们可以使用诸如自按下按钮以来的分钟数或当前正在观看的节目的平均长度等指标来构建一个基本模型,我们的响应将是一个简单的True或False,表示我们是否应该显示减速带。在模型创建时,我们的团队坐下来,作为领域专家,思考了所有我们可能想要显示这个减速带的方式。也许他们入睡了。也许他们因为有事而不小心离开了。因此,我们构建了一个模型并部署了它。两个月后,我们开始收到要求增加显示减速带所需时间的请求,我们的团队重新聚集在一起阅读这些请求。事实证明,有一大群人(包括本文作者在内)使用流媒体应用来为他们的狗和猫播放舒缓的纪录片,以帮助他们减轻分离焦虑。这是我们的模型没有尝试考虑的一个概念。现在,我们必须添加观察和特征,比如节目是否涉及动物?以帮助考虑这个新概念。
数据漂移是指我们的数据的基础分布由于某种原因发生了变化,但我们对该特征的解释保持不变。当我们的模型没有考虑到行为变化时,这是常见的情况。再次想象一下我们回到了流媒体平台。我们在2019年底构建了一个模型,以预测一个人会观看多长时间的节目,考虑到他们以往的观看习惯、他们喜欢的节目类型等变量,效果很好。突然,一场全球大流行爆发了,我们中的一些人(不要判断)开始更频繁地在线观看媒体,甚至可能在我们独自在家时也观看,以使人们感到周围仍然有人在。我们的响应变量的分布(以观看时间的小时数来衡量)将急剧向右移动,鉴于这种分布的变化,我们的模型可能无法维持其过去的性能。这就是数据漂移。观看的小时数的概念没有改变,但是我们的响应的基础分布已经改变了。
这个想法同样可以轻松应用于一个特征。如果观看的小时数是一个新的响应变量的特征,即我们是否会向这个人提供下一集的观看机会?同样的原则适用,我们的模型以前从未见过这种分布的急剧变化。
如果我们将焦点放在ML流程的中间部分,我们会看到特征工程。特征工程作为更大的ML流程的一部分,可以被视为具有自己步骤的独立流程。如果我们双击并打开ML流程中的特征工程框,我们会看到以下步骤:
- 特征理解——识别我们正在处理的数据级别至关重要,并将影响我们可以使用哪种类型的特征工程。在这个阶段,我们将不得不确定我们的数据属于什么级别。不要担心,我们将在下一章中深入探讨数据级别。
- 特征结构化——如果我们的数据中有任何非结构化的部分(例如文本、图像、视频等;见图1.3),我们必须将它们转换为结构化格式,以便我们的ML模型可以理解它们。一个示例是将文本片段转换为矢量表示或将图像转换为矩阵形式。我们可以使用特征提取或学习来实现这一点。
-
特征优化——一旦我们为数据创建了结构化表示,就可以应用优化方法,例如特征改进、提取、构建和选择,以获得最适合我们模型的最佳数据。通常,日常特征工程工作的大部分工作都属于这个类别。本书中的大多数代码示例将围绕特征优化展开。每个案例研究都会包含一些特征优化的实例,在这些实例中,我们将不得不创建新特征或将现有特征变得更加强大,以适应我们的ML模型。
-
特征评估——当我们修改特征工程管道以尝试不同的场景时,我们希望看到我们应用的特征工程技术将会有多有效。我们可以通过选择一个单一的学习算法,也许是一些参数选项以进行快速调整来实现这一点。然后,我们可以将不同特征工程管道的应用与一个恒定模型进行比较,以排名管道步骤的性能,考虑到有人的变化,有人没有的变化。如果我们没有看到需要的性能,我们将返回到以前的优化和结构化步骤,尝试获得更好的数据表示(见图1.4)。
本书的组织方式
一个由许多案例研究组成的书籍可能难以组织。一方面,我们希望提供有关我们将用来进行特征工程的技术的充分背景和直觉。另一方面,我们认识到示例和代码示例的价值,可以帮助巩固概念。
为此,我们将双手合十,围绕每个案例研究构建叙述,展示端到端的代码,解决特定领域的问题,同时使用书面部分来解释为什么我们刚刚做了什么,以及为什么我们即将要做什么。我希望这将为读者提供最佳的两种世界,既展示实际的代码,又提供有关正在处理的问题的高层次思考。
特征工程的五种类型
本书的主要重点是五个主要特征工程类别。我们将在下一章中涉及到这五个类别,并在整本书中不断提到它们:
-
特征改进:通过数学变换使现有特征更易于使用。
- 例子:通过从其他列推断出来填补天气数据集中的缺失温度,以提高其可用性。
-
特征构建:通过从现有可解释特征创建新的可解释特征来增加数据集。
- 例子:在家庭估值数据集中,将房屋的总价特征除以房屋的平方英尺特征,以创建每平方英尺价格特征。
-
特征选择:从现有特征集中选择最佳子集。
- 例子:创建每平方英尺价格特征后,如果它们不再为ML模型增加价值,可能会删除之前的两个特征。
-
特征提取:依靠算法自动创建新的、有时是不可解释的特征,通常基于对数据的参数假设。
- 例子:依靠预训练的迁移学习模型,如Google的BERT,将非结构化文本映射到结构化且通常不可解释的向量空间。
-
特征学习:通常使用深度学习从原始的非结构化数据(如文本、图像和视频)中生成全新的特征集,通常使用深度学习。
- 例子:训练生成对抗网络(GANs)来解构和重构图像,以便学习给定任务的最佳表示。
需要注意的是,首先,无论我们使用的是有监督还是无监督的ML模型,都没有关系。这是因为我们定义的特征是对我们的ML模型有意义的属性。因此,无论我们的目标是将观测结果聚类在一起还是预测几小时内股票价格的变动,我们如何设计特征将决定一切。其次,通常人们会对数据执行与特征工程一致的操作,但没有将数据输入ML模型的意图。例如,有人可能希望将文本转换为词袋表示,以创建词云可视化,或者一家公司需要填补客户数据中的缺失值以突出客户流失统计数据。这当然是有效的,但它不符合我们对特征工程的相对严格的ML相关定义。
如果我们看一下特征工程的四个步骤以及我们的五种特征工程如何适应其中,我们将得到一个管道,显示了如何摄取和操作数据以工程化特征,以最好地帮助ML模型解决手头的任务。这个管道会类似于图1.5。
本书的案例研究简要概述
本书的目标是展示越来越复杂的特征工程过程,并通过示例、代码样本和案例研究提供使用这些过程的基础。本书中的前几个案例研究侧重于核心特征工程过程,任何数据科学家都应该掌握,并适用于几乎所有的数据集。随着我们在本书中呈现的案例研究的进展,技术将变得更加高级,并更专注于不同类型的数据。
这些案例研究也以一种方式呈现,如果您决定回来(我们希望您这样做),您可以自由地直接跳到使用您想要使用的特征工程技术的任何特定案例研究,并立即开始。本书共有六个案例研究,每个案例来自不同的领域,使用不同类型的数据。每个案例研究都将基于之前的案例,引入越来越高级的特征工程技术。
我们的第一个案例研究是医疗保健/COVID-19诊断案例研究,在这个案例研究中,我们将使用与全球COVID-19大流行有关的结构化数据。在这个案例研究中,我们将尝试对COVID进行预测性诊断,使用表格格式的数据。我们将了解不同级别的数据:特征改进、特征构建和特征选择。
我们接下来的案例研究是公平性/预测法学成功数据集,其中偏见和伦理道德将占据主要位置。这个案例研究侧重于超越传统的ML指标,以及当真实人们的福祉受到威胁时,我们盲目遵循算法建议时会出现什么问题。我们将探讨如何通过引入不同的公平性定义和识别数据中的受保护特征来保护模型免受数据固有偏见的潜在危害。特征选择和特征构建将起到一定作用,因为它们与减轻数据中的偏见相关。
然后,我们将看看我们的NLP/分类推文情感案例研究,在这里,我们将开始看到更高级的特征工程技术,如特征提取和特征学习。这里的问题陈述相对简单:这个推文的作者是快乐的、中立的还是不快乐的?我们将研究传统的参数特征提取方法,如主成分分析,与更现代的特征学习方法相比,如迁移学习和自编码器。
在处理文本数据后,接下来是图像/对象识别案例研究。我们将使用两个不同的图像数据集,尝试教模型如何识别各种对象。我们将看到传统的参数特征提取方法(例如,梯度方向直方图)与现代特征学习方法(如生成对抗网络)之间的另一场比较,以及不同的特征工程技术在模型性能和可解释性之间的权衡。
接下来是时间序列/深度学习日交易案例研究,我们将寻找阿尔法(试图击败市场),并尝试部署深度学习来执行最基本的日交易问题:在接下来的几个小时内,股票价格会大幅下跌、上涨还是保持差不多不变?这似乎很简单,但是涉及到股票市场就没有什么简单的了。在这个案例研究中,时间序列技术占据主要位置,特征选择、改进、构建和提取都将发挥作用。
最后一个案例研究将沿着一个美丽而常常被忽视的小路前进。特征存储/使用Flask流数据研究将研究如何将特征工程技术部署到Flask服务中,以使我们的特征工程工作更加高效,广泛地提供给更多的工程师。我们将在Flask中建立一个Web服务,创建一个特征存储,以存储和提供来自我们之前的日交易案例研究的实时数据。
在每个案例研究中,我们将遵循相同的学习模式:
- 我们将介绍数据集,通常会伴随着一个简短的探索性数据分析步骤,以帮助我们更好地了解原始数据集。
- 然后,我们将设置问题陈述,以帮助我们了解什么样的特征工程技术将是合适的。
- 接下来是特征工程过程的实现,按照特征工程类型分组。
- 代码块和可视化将帮助我们沿着管道引导我们,并更清楚地了解特征工程技术是如何影响ML模型的。
- 最后,我们将进行总结和结论,以总结每个案例研究的主要要点。