Salesforce开源TransmogrifAI:用于结构化数据的端到端AutoML库
选自Medium,作者:Shubha Nabar,机器之心编译,参与:Geek AI、路。
AutoML 即通过自动化的机器学习实现人工智能模型的快速构建,它可以简化机器学习流程,方便更多人利用人工智能技术。近日,软件行业巨头 Salesforce 开源了其 AutoML 库 TransmogrifAI。Salesforce Einstein 数据科学高级总监 Shubha Nabar 在 Medium 上撰文介绍了该 AutoML 库,包括工作流程和设计原则等。
- GitHub 链接:https://github.com/salesforce/TransmogrifAI
- TransmogrifAI 官网:https://transmogrif.ai/
在过去的十年中,尽管机器学习取得了巨大的进步,但是建立生产就绪的机器学习系统仍然十分困难。三年前,当我们开始将机器学习功能构建到 Salesforce 平台上时,我们发现构建企业级的机器学习系统更是难上加难。为了解决我们遇到的问题,我们构建了 TransmogrifAI,一个用于结构化数据的端到端自动机器学习库。今天,这个库已经在生产中帮助驱动我们的 Einstein AI 平台。在这里,我们很高兴与开源社区共享这个项目,使其他开发人员和数据科学家能够大规模、快速地构建机器学习解决方案。
当我们为消费类产品赋予机器学习能力时,数据科学家往往关注的是大量容易理解的用例和数据集。相反,企业中数据和用例的多样性使得用于企业级产品的机器学习需要面对另一种挑战。对于 Salesforce 来说,我们的客户希望预测一系列结果,从客户流失情况、销售预测以及商机转化率,到电子邮件营销点击率、网站购物、接受出价、设备故障、逾期付款等。对于企业客户来说,确保其数据受保护、不向其他组织或竞争者共享数据是十分关键的。这意味着我们必须为任何给定的用例构建用户定制化的机器学习模型。即使我们可以构建全局模型,但是由于每个用户的数据是唯一的,有着不同的模式、形态、由不同的业务流程引入的偏差,构建全局模型的做法是没有任何意义的。为了让机器学习真正服务于客户,我们必须针对每个用例使用每个客户的独特数据,构建和部署数千个个性化的机器学习模型。
在不雇佣大量数据科学家的情况下,唯一实现这一目标的途径就是自动化。目前,大多数 auto-ML 解决方案要么非常狭隘地关注整个机器学习工作流的一个小部分,要么就是为图像、语音和语言这样的非结构化、同质数据构建的。而我们需要的解决方案应该能够大规模地为异质结构化数据快速生成数据效率高的模型。在词典中,「Transmogrification」意为「变换的过程」,这种变换通常以一种令人惊讶或者神奇的方式进行,这也正是 TransmogrifAI 为 Salesforce 所做的——使数据科学团队将客户数据转化为有意义的、可操作的预测。如今,成千成万的用户定制化机器学习模型已经部署在了这个平台上,为每天超过 30 亿个预测赋能。
下文我们将介绍 TransmogrifAI 的工作流,讨论设计思想,并给出了一些帮助人们使用这个库或为其贡献代码的链接。
TransmogrifAI 的工作流
通常来说,构建优秀机器学习模型所需的研究和开发任务是很庞大的工作。数据准备、特征工程和模型训练的繁琐工作是一个迭代的过程,需要花费数据科学家数周甚至数月的时间才能得到成熟的自动化模型。TransmogrifAI 是一个基于 Scala 语言和 SparkML 框架构建的库,它恰好可以实现这一目标。只需短短的几行代码,数据科学家就可以完成自动化数据清理、特征工程和模型选择工作,得到一个性能良好的模型,然后进行进一步的探索和迭代。
TransmogrifAI 封装了 5 个主要的机器学习组件:
TransmogirifAI 的工作流
特征推断:任何机器学习工作流程的第一步都是准备数据。数据科学家会收集所有相关的数据,并且对不同的数据源进行压缩、连接和聚合处理,从而提取出可能具有预测能力的原始信号。接着,提取出的信号会被转存到一个灵活的数据结构(通常被称为 DataFrame)中,以便在工作流的下游进行进一步的操作。尽管这些数据结构简单且易于操作,但它们并没有保护数据科学家免于下游错误,如「关于数据类型的错误假设」或者「数据中存在空值」等。因此,数据科学家有可能整夜运行工作流程,而第二天早上才发现失败了,仅仅可能是因为她试图将两个字符串相乘(该数据类型的乘法操作通常不被允许)。
在 TransmogrifAI 中,我们通过允许用户为数据指定一个模式,并自动提取出原始预测器和作为「特征」的响应信号来解决这个问题。特征是强类型的,TransmogrifAI 支持丰富的可扩展特征类型层次结构。这种层次结构可以超越原始的类型,支持更细微的数据类型,例如地理位置、电话号码、邮编等,即数据科学家想要区别对待的数据类型。除了允许用户指定数据类型之外,TransmogrifAI 还能自己进行推断。例如,如果它检测到具有低基数(唯一值较少)的文本特征实际上是潜在的类别特征,它就会对其进行分类并且进行适当的处理。强类型特征使开发人员能够在编译时而不是运行时就发现大部分错误。它们也是自动化机器学习工作流程中常见的特定类型下游处理的关键。
TransmogrifAI 的特征类型层次图
Transmogrification(即自动化特征工程):尽管强类型特征对数据推理非常有帮助,还能将下游错误降到最低,但所有的特征最终都需要转换为一种能够展示数据规律的数值表示形式,以便机器学习算法可以很容易地利用这些特征。这个过程被称为特征工程。有数不清的方法可以对上图所示的特征类型进行转换,而如何找到最恰当的方法则是数据科学的艺术了。
举个例子,我们不妨问问自己:如何才能将美国某个州的名称(例如加利福尼亚 CA、纽约 NY、德克萨斯 TX 等)转换为一个数字。一种可能的方法是将每个州的名称映射到区间在 [1, 50] 的数字。而这种编码的问题是,它没有保存关于各个州地理位置邻近性的信息。然而,在试图对购物行为进行建模时,这种地理位置的邻近性可能是一个很重要的特征。我们可以尝试的另一种编码方法是使用每个州的中心与美国的中心之间的距离。这种方法可以在某种程度上解决上面提到的问题,但它仍然不能对各州位于美国的北部、南部、西部还是东部这类信息进行编码。这只是对于一个特征的简单例子,想象一下,如果我们面对成百上千个这样的问题,那该有多复杂!特征工程之所以极具挑战性,是因为并没有一种对于所有需要考虑的因素完全恰当的方法,而成功的方法在很大程度上取决于我们试图优化的问题。
将数十种不同的特征类型自动转换成数值向量,这就是 TransmogrifAI 名字的由来。TransmogrifAI 为所有其支持的特征类型提供大量的技术支撑,这些特征包括电话号码、电子邮件地址、地理位置甚至文本数据。这些转换不仅仅是将数据转化为算法可以使用的格式,TransmogrifAI 还对转换结果进行优化,使机器学习算法更容易利用这些数据进行学习。例如,它会将年龄等数值特征转化为最适合特定问题的年龄段,就像适用于时尚行业和财富管理行业的年龄段可能是不同的。
但是,即使我们采取了上述措施,特征工程仍然是一个无止境的游戏。因此,除了提供这些默认的技术,我们还做了大量的努力,使快速贡献代码和共享特征工程技术更加容易,以便开发人员能够以可复用的方式定制和扩展默认技术。
自动化特征验证:特征工程可能导致数据维度的爆炸。而对高维数据的处理往往面临着许许多多的问题!例如,对数据中特定字段的使用可能随着时间的推移发生变化,在这些字段上训练出的模型可能在新的数据上表现并不好。另一个巨大的(而且经常被忽视的)问题是后视偏差(hindsight bias)或 data leakage(无法正确解释因果关系)。当预测时实际不会出现的信息被「泄漏」到训练样本中时,就会出现这种情况。其结果是模型在论文中看起来效果十分好,但是实际上却毫无用处。试想一个包含多项交易信息的数据集,其任务是预测可能完成的交易。假设这个数据集中有一个字段为「已完成交易量」(Closed Deal Amount),这个字段只能在某项交易完成后才能被填充。盲目地应用机器学习算法会认为这个字段具有很强的预测性,因为所有已完成的交易都会有一个非零的「已完成交易量」。但实际上,这个字段不会被仍在进行中的交易所填充,机器学习模型在这些交易上的性能会很差,而预测对于这些交易实际上很重要!这种后视偏差在 Salesforce 尤其造成了很大问题,在 Salesforce 中,未知的自动化的业务流程常常充斥着各种用户的数据,这使得数据科学家很容易混淆因果关系。
TransmogrifAI 具有一些可以执行自动特征验证工作的算法,它们将被用来删除掉几乎没有预测能力的特征:这些特征的使用会随着时间推移而改变,特征显示出来的方差为零,或者在训练样本中的分布与其预测时的分布具有明显的差异。TransmogrifAI 使用的这些算法在处理高维数据和未知数据时十分有用,这些数据原本可能会被后视偏差所扰乱。这些算法应用了一系列基于特征类型的统计检验,并且利用特征谱(feature lineage)来检测并消除这种偏差。
自动化的模型选择:数据科学家进行数据处理的最后一个步骤是将机器学习算法应用到准备好的数据上,从而构建预测模型。数据科学家可以尝试许多不同的算法,而且可以对每种算法进行不同程度的微调。找到合适的算法和参数设置才能成就性能好的模型。
TransmogrifAI 的模型选择器在数据上运行不同的机器学习算法,利用平均验证误差自动选择出最好的算法。它还能通过适当地对数据进行采样并将预测结果重新校准到与真实先验匹配,来自动处理数据不平衡的问题。数据科学家在数据上训练出的最佳模型和最差模型之间的性能差异往往很大,而探索可能的模型空间对于避免留下太大的模型缺陷十分重要。
超参数优化:超参数优化层是以上所有步骤的基础。在如今的机器学习社区中,超参数特指机器学习算法中那些可以调节的参数。然而现实是,对以上所有步骤进行有效调节的参数各不相同。例如,在特征工程中,数据科学家可能会调节从分类预测器中得出的二值变量的数量。而处理不平衡数据的采样率是另一个可以调整之处。对所有这些参数进行调优是一件非常困难的事情,但它确实可以得出一个很棒的模型,这与随机产生的模型在性能上有很大的差别。这也正是 TransmogrifAI 提供一些自动超参数调优技术、一个扩展更多先进调优技术的框架的原因。
在 Salesforce,这样的自动化技术已经把训练模型的总时间从数周或数月减少到了几个小时。而且将这些复杂的过程封装起来的代码十分简单。只需要下面的几行代码就可以指定上面的自动化特征工程、特征验证和模型选择工作:
// Read the Deal data
val dealData = DataReaders.Simple.csvCase[Deal](path = pathToData).readDataset().toDF()
// Extract response and predictor Features
val (isClosed, predictors) = FeatureBuilder.fromDataFrame[RealNN](dealData, response = "isClosed")
// Automated feature engineering
val featureVector = predictors.transmogrify()
// Automated feature validation
val cleanFeatures = isClosed.sanityCheck(featureVector, removeBadFeatures = true)
// Automated model selection
val (pred, raw, prob) = BinaryClassificationModelSelector().setInput(isClosed, cleanFeatures).getOutput()
// Setting up the workflow and training the model
val model = new OpWorkflow().setInputDataset(dealData).setResultFeatures(pred).train()
使用 TransmogrifAI 预测交易完成的可能性
设计选择
TransmogrifAI 的设计宗旨是提升机器学习开发者的生产效率,这不仅通过机器学习自动化来实现,还需要通过能够加强编译时类型安全、模块化和复用性的 API 得以实现。下面是我们所做的一些值得注意的设计选择。
Apache Spark:出于很多因素的考虑,我们选择在 Apache Spark 框架上构建 TransmogrifAI。首先,我们需要处理数据规模的巨大变化。我们的一些用户和用例需要基于上千万条需要聚合或连接的记录来训练模型,而另外一些用户和用例则仅仅依赖于几千条记录。Spark 具有处理大数据分布式连接和聚合的基本方法,这对我们来说十分重要。其次,我们需要能够在批处理和流处理这两种模式下提供我们机器学习模型的服务。当使用 Spark 流时,我们可以很容易地将 TransmogrifAI 扩展到这两种模式中。最后,通过在一个活跃的开源库上构建 TransmogrifAI,我们可以利用开源社区对该库进行的持续改进,而不必重新造一个轮子。
特征抽象:SparkML 工作流引入了转换 DataFrame 的 Transformer 和 Estimator 的抽象。TransmogrifAI 就是构建在这些抽象(上述 Transmogrification、特征验证和模型选择,它们都由 Estimator 提供支持)之上的。此外,TransmogrifAI 还引入了特征抽象。特征本质上是一个指向数据帧(DataFrame,一种数据结构)中某个列的类型安全指针,并且包含关于该列的所有信息,即它的名称、它包含的数据类型,以及它是如何产生的谱系信息。
接着,特征成为开发人员与之交互的主要原语(primitive),定义和操作特征更像是在编程语言中处理变量,而不是在数据帧(DataFrame)中处理列。特征也是可以共享的,它允许开发人员之间的协作和复用。此外,TransmogrifAI 还能够容易地定义复杂时间序列聚合和连接结果的特征,但要讨论这个主题可能就要再写一篇博文专门介绍了。
类型安全:特征是强类型的。这允许 TransmogrifAI 对整个机器学习工作流进行类型检查,并确保尽早发现错误,而不是在一个运行流程中花费几个小时才找出错误。类型安全还带来了其它有利于提高开发人员生产效率的优点,包括支持智能化的集成开发环境(IDE)为完成代码提出建议。在下图中,你可以看到你能为一个数值特征执行的所有可能的转换操作,并且选择其中之一。
对数值特征进行转换的 IDE 代码完成
类型安全还在机器学习工作流的每个阶段提高了预期输入和输出的透明度。这大大减少了在任何特别复杂的机器学习工作流中不可避免地积累的知识量。
最后,特征类型是针对特定类型的下游处理工作的关键,尤其是对于自动化特征工程和特征验证。
可定制性和可扩展性:尽管开发人员可以使用自动估计器快速地对模型性能进行调优,对于那些希望对模型具有更多控制能力的用户,每个开箱即用的估计器都是参数化的,这些参数可以由数据科学家直接设置并调优。此外,人们可以很容易地指定定制的转换器和估计器用。指定一个定制的转换器就像定义 lambda 表达式一样简单,TransmogrifAI 负责维护所有为你进行序列化和反序列化操作的样板文件。
val lowerCaseText = textFeature.map[Text](_.value.map(_.toLowerCase).toText)
规模和性能:通过自动化特征工程,数据科学家可以很容易地扩展特征空间,并最终得到让 Spark 难以处理的大规模数据帧。TransmogrifAI 的工作流通过推断出实现这些特征所需转换的有向无环图(DAG)来解决这个问题,并且通过将在 DAG 同一层次上进行的所有转换压缩成同一个操作来优化 DAG 的执行。同时,由于 TransmogrifAI 是建立在 Spark 框架之上的,它会自动地从不断进行的底层 Spark 数据帧的优化中受益。
结果是,我们可以将自动化的机器学习技术应用在上百万行、上百列的数据上,并且将处理过程中的特征空间扩展到数万列。
方便所有人使用 TransmogrifAI
TansmogrifAI 为我们带来了巨大的变革,它使我们的数据科学家在生产中使用最少的手动调参就能部署数千个模型,将训练一个性能优秀模型的平均时间从数周减少到几个小时。这种水平的自动化对于我们为企业提供机器学习服务十分重要,我们相信现在每家企业所拥有的机器学习用例超过它们所拥有的数据科学家,自动化是使机器学习技术普及的关键。
Salesforce 是 Apache Spark 项目长期的用户和贡献者,我们很高兴能够继续在开源社区中构建 TransmogrifAI。机器学习具有转变企业运作模式的潜力,我们相信只有思想和代码的开放性交流才能降低使用它的门槛。通过在开源的环境中工作,我们可以将不同的视角聚集在一起,继续推动技术向前发展,让每个人都能够使用它。
想要获取更多 TransmogrifAI 的入门资料,请查看项目链接:https://github.com/salesforce/TransmogrifAI。