终结谷歌AutoML的真正杀手!Saleforce开源TransmogrifAI
来源:AI前线
本文共4739字,建议阅读10分钟。
本文我们介绍了 TransmogrifAI 的工作流程并讨论其背后的设计决策。
[ 导读 ]尽管机器学习在过去十年中取得了巨大进步,但构建生产就绪的机器学习系统仍然很难。三年前,我们开始着手为 Salesforce 平台搭建机器学习系统,也因此了解到构建企业级机器学习系统是有多么困难。为了解决我们遇到的问题,我们构建了 TransmogrifAI,一种自动化的端到端结构数据机器学习库, 并在近日将它开源了。
如今,大多数自动化机器学习解决方案要么只专注于整个机器学习工作流程的一小部分,要么专为图像、语音和语言的同质非结构化数据而构建。但我们更需要一种能够为大规模异构结构化数据快速生成模型的解决方案,TransmogrifAI 就是这样一个解决方案。如果说前不久美国德州农工大学开源的 AutoKeras 相比谷歌 AutoML 主要赢在开源,那么 TransmogrifAI 的优势则更加明显,或许它才是真正的 AutoML“杀手”。
在为消费级产品构建机器学习时,数据科学家通常会关注一些易于理解的用例和数据集。然而,企业的数据和用例存在多样性,因此为企业产品构建机器学习成为一种完全不同的挑战。在 Salesforce,我们的客户希望能够预测一系列结果——从客户流失、销售预测和潜在客户转换,到电子邮件营销、网购、设备故障、延迟付款等等。对于企业客户而言,保护好数据不让它们与其他组织或竞争对手共享是至关重要的。这意味着我们必须为特定的用户需求构建特定的机器学习模型。我们能够构建全局模型,但这样做是毫无意义的,因为每个客户的数据都是唯一的,具有不同的模式、不同的形状和不同的业务流程引入的不同偏差。为了让机器学习能够真正为我们的客户带来价值,我们必须构建和部署数千个机器学习模型,它们都是针对每个客户的不同用例并基于每个客户自己的数据训练得出的。
要在不聘请大量数据科学家的情况下实现这一目标,唯一方法就是进行自动化。如今,大多数自动化 ML 解决方案要么只专注于整个机器学习工作流程的一小部分,要么专为图像、语音和语言的同质非结构化数据而构建。但我们需要一种能够为大规模异构结构化数据快速生成模型的解决方案。在词典中,Transmogrification 的意思是“以令人惊讶或神奇的方式进行转换”,这也正是 TransmogrifAI 为 Salesforce 所做的事情——让数据科学团队能够将客户数据转换为有意义的预测。如今,整个平台已经部署了数千个特定的机器学习模型,每天为超过 30 亿次预测提供支持。
在本文中,我们将介绍 TransmogrifAI 的工作流程,讨论其背后的设计决策。
TransmogrifAI 工作流程
构建机器学习模型通常涉及大量的研发工作。数据准备、特征工程和模型训练是一个迭代的过程,要对它们进行成熟的自动化,需要数周甚至数月的时间。
TransmogrifAI 是一个基于 Scala 和 SparkML 构建的库,就是为了完成这项任务应运而生的。数据科学家只需几行代码就可以自动完成数据清理、特征工程和模型选择,从而获得一个高性能的模型,并在后续进一步的探索和迭代。
TransmogrifAI 封装了机器学习过程的五个主要组件:
特征推理
机器学习管道的第一步通常是进行数据准备。数据科学家收集所有相关数据,并扁平化、连接和聚合不同的数据源,提取可用于预测的原始信号。然后,提取的信号被填充到一种灵活的数据结构中,通常称为 DataFrame。虽然这些数据结构简单易用,但它们不能让数据科学家免受下游错误的影响,例如对数据类型或空值的错误假设。因此,数据科学家可能通宵达旦运行一个管道却以失败告终,因为她试图将两个字符串相乘。
在 TransmogrifAI 中,我们允许用户为他们的数据指定模式,并自动将原始预测变量和响应信号提取为“特征”,以此来解决这个问题。特征是强类型的,TransmogrifAI 还支持丰富且可扩展的特征类型层次结构。这种层次结构超越了原始类型,支持更细化的类型,例如地理位置、电话号码、邮政编码等。除了允许用户指定类型之外,TransmogrifAI 还可以自行推断类型。例如,如果它检测到具有低基数的文本特征实际上是伪装的分类特征,就会对它进行编目和适当的处理。强类型特征可以让开发人员在编译时而不是在运行时捕获大多数错误。它们也是对机器学习管道中常见的特定类型处理进行自动化的关键。
Transmogrification(也就是自动化特征工程)
虽然强类型特征有助于大量推理数据,并最大限度地减少下游错误,但所有特征最终仍然需要转换为数字表示,以便暴露出数据的规律性,这样机器学习算法才能轻松地利用这些数据。这个过程称为特征工程。有无数种方法可用于转换上图中所示的特征类型,选择正确的方法是一门数据科学艺术。
举个例子,如何将美国的州(例如 CA、NY、TX 等)转换成数字?一种方法是将每个州与 1 到 50 之间的数字映射起来。这种方法的问题在于它无法保留有关州的地理接近度信息。但在模拟用户购物行为时,接近度可能是一个重要特征。我们可以尝试另一种方法,就是使用州中心与美国中心之间的距离。这样可以解决第一个问题,但仍然不包含一个州是否位于美国的北部、南部、西部或东部的信息。这还只是一个简单的特征——想象以下数百或数千个特征!这个过程之所以如此具有挑战性,是因为还不存在一种万能的正确方法,因为成功的方法在很大程度上取决于具体的问题。
将一组不同的特征类型自动转换成数字向量,这也正是 TransmogrifAI 名称的由来。TransmogrifAI 为所有受支持的特征类型提供了大量的技术支持,从电话号码、电子邮件地址、地理位置到文本数据。TransmogrifAI 不仅仅是将数据转换为算法可以使用的格式,它还对转换进行优化,让机器学习算法更容易从数据中学习。例如,它可能会将年龄转换成适合某个特定问题的年龄段——时尚行业的年龄段可能与财富管理的年龄段不同。
但即使具备上述所有功能,特征工程仍然是一趟没有终点的旅程。因此,除了提供默认技术之外,我们还投入了大量精力,让共享特征工程技术变得更容易,这样开发人员就可以对默认值进行定制和扩展。
自动特征验证
特征工程可能会出现数据维度的爆炸性增长。高维数据经常会出问题!例如,数据的特定字段可能会出现漂移,而且基于这些字段训练的模型可能在新数据上表现不佳。另一个(通常被忽略的)问题是事后偏见或数据泄漏。当在预测时没有出现的信息泄漏到训练样本中时就会发生这种情况。结果就是看起来很好的模型在实际当中就完全没有用。假设我们有一个包含交易信息的数据集,我们的任务是预测密集交易。想象一下,这个数据集中有一个字段叫作“已结算交易金额”,这个字段只在交易结束后才有。一个盲目的机器学习算法会认为这个字段具有高度的可预测性,因为所有已完成的交易都具有非零的“已结算交易金额”。实际上,对于仍在进行中的交易,这个字段永远不会有值,所以会导致机器学习模型表现不佳!在 Salesforce,这种后见之明的偏见也很成问题,因为未知和自动化的业务流程通常会填充大部分客户数据,很容易让数据科学家混淆因果关系。
TransgmogrifAI 提供了可用于执行自动特征验证的算法,用来删除几乎没有预测能力的特征——随着时间的推移而发生漂移的特征、呈现零方差的特征,或者在训练样本中的分布与预测时的分布显著不同的特征。这些算法对于处理可能充满事后偏见的高维和未知数据特别有用。它们应用了一系列基于特征类型的统计测试,并利用特征沿袭来检测和丢弃数据中的偏见。
自动模型选择
流程的最后阶段涉及将机器学习算法应用于准备好的数据上,并构建出预测模型。他们可以尝试许多不同的算法,每种算法都有相应的调节参数。找到正确的算法和参数设置就可以获得高性能的模型。
TransmogrifAI 模型选择器在数据上运行几种不同的机器学习算法,并基于平均验证错误自动选择最佳的算法。它还会对数据进行采样并重新校准预测来自动处理不平衡数据问题。数据科学家训练得出的最佳和最差模型的性能通常存在显著差距,而探索模型空间对于避免错过更好的模型来说是至关重要的。
超参数优化:上述所有阶段的基础是超参数优化。在现今的机器学习社区,超参数指的是机器学习算法上的可调节参数。然而现实情况是,上述所有阶段都带有各种重要的调节参数。例如,在特征工程阶段,我们可以调整从分类预测器输出的二元变量的数量。处理不平衡数据的采样率是另一个可以调整的参数。调整所有这些参数对于数据科学家来说可能是个很大的负担,但这样可以让好的模型跟差的模型之间拉开差距。这就是为什么 TransmogrifAI 提供了一些自动调整这些超参数的技术和一个可扩展到更高级调优技术的框架。
在 Salesforce,自动化将模型训练所需的总时间从几周和几个月缩短到几个小时。封装所有这些复杂性的代码非常简单,只需几行代码就可以搞定上述的自动化特征工程、特征验证和模型选择:
// 读取交易数据
val dealData = DataReaders.Simple.csvCase[Deal](path = pathToData).readDataset().toDF()
// 抽取特征
val (isClosed, predictors) = FeatureBuilder.fromDataFrame[RealNN](dealData, response = "isClosed")
// 自动化特征工程
val featureVector = predictors.transmogrify()
// 自动化特征验证
val cleanFeatures = survived.sanityCheck(featureVector, removeBadFeatures = true)
// 自动化模型选择
val (pred, raw, prob) = BinaryClassificationModelSelector().setInput(isClosed, cleanFeatures).getOutput()
// 建立工作流并开始训练模型
val model = new OpWorkflow().setInputDataset(dealData).setResultFeatures(pred).train()
设计决策
TransmogrifAI 的设计目标是提高机器学习开发人员的工作效率——不仅对机器学习进行自动化,还提供了一组 API 来实现编译时类型安全、模块化和重用。以下是我们的一些设计决策。
Apache Spark
出于多种原因,我们选择在 Apache Spark 之上构建 TransmogrifAI。首先,我们需要能够处理各种大小的数据量。我们的一些客户和用例需要数千万条经过聚合或连接的数据记录来训练模型,但也有一些客户和用例只需要几千条记录。Spark 提供了连接和聚合分布式大数据的原语,这对我们来说很重要。其次,我们需要能够按照批量和流式的方式提供机器学习模型。Spark Streaming 可以让 TransmogrifAI 在这两种模式下工作。最后,基于一个活跃的开源库构建 TransmogrifAI,就可以充分利用这个库持续改进的特性,而无需为所有东西重新发明轮子。
特征抽象
SparkML Pipelines 引入了 Transformer 和 Estimator 的抽象,用于转换 DataFrame。TransmogrifAI 建立在这些抽象的基础之上(上面的特征转换、特征验证和模型选择,都由 Estimator 提供),此外,还引入了特征抽象。特征本质上是一个类型安全的指向 DataFrame 列的指针,它包含了所指列的所有信息——它的名称、它包含的数据类型,以及它的沿袭信息。
特征是开发人员主要的交互原语,定义和操作特征变得更像是在编程语言中使用变量,而不是操作 DataFrame 中的列。特征也是可共享的,可在开发人员之间重用。此外,TransmogrifAI 还提供了用于定义复杂时间序列聚合和连接的结果的能力。
类型安全
特征是强类型的,所以 TransmogrifAI 可以在整个机器学习工作流程中进行类型检查,确保尽早捕获错误,而不是在数小时后进入管道之后才发现。类型安全还与开发人员生产力的其他细节有关,比如智能 IDE 代码建议。你可以在下面看到可以对数字进行的所有可能转换,并选择其中一个。
类型安全还可以提高机器学习工作流程每个阶段预期输入和输出的透明度,这反过来又大大减少了部落知识的数量,这些知识不可避免地在足够复杂的机器学习工作流程中积累起来。
最后,特征类型对于下游的处理(特别是自动化特征工程和特征验证)而言至关重要。
可定制性和可扩展性:开发人员可以利用自动 Estimator 快速获得高性能模型,而对于需要更多控制的用户,每个开箱即用的 Estimator 都可以被参数化,并可以直接设置和调整这些参数。此外,用户也可以指定要在管道中使用的自定义 Transformer 和 Estimator。指定自定义 Transformer 就像定义 lambda 表达式一样简单,TransmogrifAI 负责处理所有用于序列化和反序列化 Transformer 的样板代码。
val lowerCaseText = textFeature.map[Text](_.value.map(_.toLowerCase).toText)
伸缩性和性能
通过自动化特征工程,数据科学家很容易就让特征空间膨胀,最终得到 Spark 都难以处理的 DataFrame。TransmogrifAI 工作流通过推断实现特征所需的整个转换 DAG 来解决这个问题。另外,因为 TransmogrifAI 是建立在 Spark 之上,所以可以直接从 Spark DataFrame 的优化改进中获益。
结果是,我们可以将自动化机器学习技术应用于具有数百万行和数百列的数据上,将特征空间扩展到数万个列。
TransmogrifAI 为每一个人赋能
对我们来说,TransmogrifAI 就像一场巨变,让我们的数据科学家能够以最少的手动调整生成数千种模型,并将训练高性能模型的平均时间从几周缩短到几个小时。这种自动化水平对于我们为企业提供服务来说至关重要,我们也相信,如今的每个企业的机器学习场景一定多过他们的数据科学家的数量,而自动化是实现机器学习能力的关键。
Salesforce 一直是 Apache Spark 的用户和贡献者,我们很高兴继续与社区一起构建 TransmogrifAI。机器学习有可能改变企业的运营方式,我们认为只有通过公开交换思想和代码才能降低采用障碍。通过公开合作,我们可以将不同的观点汇集在一起,继续推动技术的发展,惠及每一个人。
英文原文:
https://engineering.salesforce.com/open-sourcing-transmogrifai-4e5d0e098da2
运营人员:冉小山