特征工程自动化实现的是更聪明地工作而不是更努力地工作!

点击上方关注,All in AI中国

特征工程自动化将节省您的时间,构建更好的预测模型,创建有意义的功能并防止数据泄漏。

数据科学中几乎没有确定性,因为它总是随着更好的方法开发,库、工具和算法不断变化。然而,有一个不会消失的趋势就是自动化水平在不断提高中。

近年来,在自动化模型选择和超参数调整方面取得了进展,但机器学习流程(特征工程)最重要的方面在很大程度上被忽略了。这个关键领域中最有能力的入口是Featuretools,它是一个开源的Python库。在本文中,我们将使用此库来了解特征工程自动化将如何改变您机器学习的方式,使得它变得更好。

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

Featuretools是一个用于自动化功能工程的开源Python库

特征工程自动化是一种相对较新的技术,但在使用它来解决使用真实数据集的大量数据科学问题之后,我认为它应该是每一个机器学习工作流程的标准部分。在本文中,我们一起看看其中两个项目的结果和结论,以及GitHub上的Jupyter Notebooks提供的完整代码。( https://github.com/Featuretools/Automated-Manual-Comparison)

每个项目都强调了特征工程自动化的一些优点:

  • 贷款还款预测:与手动特征工程相比,自动化特征高工程可将机器学习开发时间缩短10倍,同时提供更好的建模性能。
  • 零售支出预测:自动化特征工程通过内部处理时间序列筛选器来创建有意义的功能并防止数据泄漏,从而实现成功的模型部署。

特征工程:手动VS自动

特征工程是获取数据集和构建解释变量的过程,它们可用于训练预测问题的机器学习模型。通常,数据分布在多个表中,并且必须收集到一个表中,其中的行包含列中的观察数据和特性。

特征工程的传统方法是使用领域知识一次构建一个功能,这是一个繁琐、耗时且容易出错的过程,称为手动特征工程。手动特征工程的代码与问题有关,必须为每个新数据集重写。

特征工程自动化通过从一组相关数据表中自动提取有用且有意义的特征,并使用可应用于任何问题的框架,改进了此标准工作流程。它不仅减少了特征工程所花费的时间,还创建了可解释的功能,并通过过滤与时间相关的数据来防止数据泄漏。

与手动特征工程相比,自动化特征工程更高效、更可重复,使您能够更快地构建更好的预测模型。

贷款还款:更快地建立更好的模型

数据科学家面临的主要的困难是数据的大小和传播范围,目前在Kaggle上运行的机器学习竞赛,其目标是预测贷款是否将由客户偿还。看一下完整的数据集,你就会遇到分散在七个表中的5800万行数据。机器学习需要一个表进行训练,因此特征工程意味着在一个表中整合关于每个客户端的信息。

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

特征工程需要将一组相关表中的所有信息捕获到一个表中

我对该问题的第一次尝试使用了传统的手动特征工程:总共花了10个小时手工创建一组功能。首先,我阅读其他数据科学家的工作,探索数据,并研究问题领域,以获得必要的领域知识。然后我将这些知识翻译成代码,一次构建一个功能。作为单个手动功能的一个示例,我找到了客户对之前贷款的延迟付款总数,这项操作需要使用3个不同的表格。

最终的手动工程功能表现相当不错,比基线功能(相对于最高排行榜得分)提高了65%,表明了正确的特征工程的重要性。

然而,效率低下甚至没有开始描述这个过程。对于手动特征工程,最终每个功能花费超过15分钟,因为我使用传统方法一次制作一个功能。

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

手动特征工程过程

除了繁琐耗时外,手动特征工程还包括:

  • 具体问题:我写了几个小时的所有代码都不能应用于任何其他问题
  • 容易出错:每一行代码都是有可能犯错此外,最终的手工设计功能受到人类创造力和耐心的限制:

我们可以考虑构建的功能只有这么多,我们制作它们的时间也只有这么多。

从手动到自动特征工程

正如Featuretools中实现的那样,自动化特征工程甚至允许像我这样的领域新手从一组相关数据表中创建数千个相关功能。我们需要知道的是我们表的基本结构以及它们之间的关系,我们在称为实体集的单个数据结构中跟踪它们。一旦我们有一个实体集,使用一个名为深度特征合成(DFS)的方法,我们就能够在一个函数调用中构建数千个特性。

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

使用Featuretools的自动化特征工程流程

DFS使用称为“基元”的函数来聚合和转换我们的数据。这些原语可以像获取列的平均值或最大值一样简单,或者它们可以是复杂的并且基于主题专业知识,因为Featuretools允许我们定义自己的自定义基元。

特征原语包括我们已经手动完成的许多操作,但是使用Featuretools,而不是重写代码以在不同的数据集上应用这些操作,我们可以在关系数据库中使用相同的确切语法。此外,当我们将基元堆叠在一起以创建深层特征时,DFS的强大功能就出现了。

深度特征合成是灵活的,允许它应用于任何数据科学问题,并且功能强大,通过创建深层特征来揭示我们数据中的洞察力。

我将为您节省设置所需的几行代码,但DFS的操作只需一行。在这里,我们使用数据集中的7个表为每个客户端创建数千个功能(ft是导入的featuretools库):

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

以下是我们从Featuretools库自动获得的1820个功能中的一些:

  • 客户以前贷款支付的最高总额。在这3个表中是使用MAX和SUM原语创建的。
  • 按以前平均信用卡债务计算的百分比排名,在这两个表中使用了PERCENTILE和MEAN原语。
  • 客户是否在申请过程中提交了两份文件。这使用了AND转换原语和1个表。

这些功能中的每一个都使用简单的聚合构建,因此是人类可解释的。 Featuretools创建了许多与我手动构建相同的功能,但也有成千上万的功能我从未想过 ,或者说是有时间实现。并非每个特征都与问题相关,并且某些特征具有高度相关性,但多一些总比少一些要好。

经过一些特征选择和模型优化后,与手动功能相比,这些功能在预测模型中略胜一筹,总体开发时间为1小时,与手动过程相比减少了10倍。 Featuretools要快得多,因为它需要较少的域知识,并且因为编写的代码行数要少得多。

我承认学习Featuretools需要花费一些时间,但这是一项可以带来回报的投资。花了一个小时左右来学习Featuretools后,您可以将其应用于其他机器学习问题。

以下图表总结了我对贷款偿还问题的经验:

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

自动和手动特征工程的时间、功能数量和性能之间的比较

  • 开发时间:考虑制作最终特征工程代码所需的一切:手动10小时与自动1小时
  • 该方法生成的特征数量:30个特征手册VS1820自动化
  • 相对于基线的改进是使用受过特征训练的模型与基线公共排行榜得分相比的基线增益百分比:65%手动与66%自动化

我的想法是,自动化特征工程不会取代数据科学家,而是通过显著提高效率,使她可以将更多时间花在机器学习管道的其他方面。

此外,我为第一个项目编写的Featuretools代码可以应用于任何数据集,而手动工程代码必须被丢弃并完全重写为下一个数据集!

零售支出:构建有意义的功能并防止数据泄漏

对于第二个数据集,一个记录客户交易在线时间戳的数据集,预测问题是将客户分为两个部分,即下个月花费超过500美元的人和不会花费超过500美元的人。但是,不是对所有标签使用一个月,而是每个客户多次成为标签。我们可以将他们在5月份的支出用作标签,然后在6月份使用,依此类推。

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

每个客户多次用作训练示例

多次使用多个客户作为观察结果会给创建训练数据带来困难:在为特定月份的客户制作功能时,即使我们可以访问这些数据,我们也不能使用未来几个月的任何信息。在部署中,我们永远不会拥有未来的数据,因此无法使用它来训练模型。公司经常在这个问题上挣扎,并且经常部署一个在现实世界中比在开发中更糟糕的模型,因为它是使用无效数据进行训练的。

幸运的是,在Featuretools中,确保我们的数据在时间序列问题中有效是很简单的。在深度特征合成功能中,我们传递如上所示的数据帧,其中截止时间表示我们不能为标签使用任何数据,并且Featuretools在构建特性时自动考虑了时间。

客户在给定月份的特征是使用过滤到月份之前的数据构建的。请注意,创建我们的功能集的调用与添加cutoff_time的贷款还款问题的调用相同。

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

运行Deep Feature Synthesis的结果是得到一个特征表,每个客户每月一个。我们可以使用这些功能来训练带有我们标签的模型,然后对任何月份都进行预测。此外,我们可以放心,我们模型中的功能不会使用未来的信息,这将导致不公平的优势并产生误导性的训练分数。

通过自动化功能,我能够构建一个机器学习模型,ROC-AUC曲线它达到了0.90 ,而基准线(猜测与上月相同的支出水平)为0.69。

除了提供令人印象深刻的预测性能外,Featuretools实现还为我提供了同样有价值的东西:可解释的特征。看看随机森林模型中15个最重要的特征:

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

15种随机森林模型中最重要的Featuretools功能

特征重要性能够告诉我们,客户将在下个月花多少钱的预测因素是根据他们之前花费了多少钱和购买数量。这些是我们可以手工构建的特征,但是我们将不得不担心泄漏数据并创建一个在开发中比在部署中做得更好的模型。

如果该工具已经存在,可以创建有意义的特征而无需担心我们的有效性,那么为什么要手工实现呢?此外,自动化的特征在问题的背景下是完全清晰的,并且可以为我们的现实世界的推理进行推理。

自动化特征工程确定了最重要的信号,实现了数据科学的主要目标:揭示隐藏在大量数据中的洞察力。

即使花在手动特征工程上的时间比使用Featuretools花费的时间多得多,我也无法开发出一组性能接近的特征。下图显示了使用在两个数据集上训练的模型对未来一个月的客户销售进行分类的ROC曲线。左侧和顶部的曲线表示更好的预测:

特征工程自动化实现的是更聪明地工作而不是更努力地工作!

ROC曲线比较了自动和手动特征工程的结果。左侧和顶部的曲线表示具备更好的性能

我甚至不完全确定是否使用了有效的数据来实现手动特征,但是使用Featuretools实现,我不必担心时间相关问题中的数据泄漏。也许这种无法手动设计一组有用的有效功能说明了我作为数据科学家的失败,但是如果该工具是为了我们安全地做到这一点,为什么不使用它呢?

我们在日常生活中使用自动安全系统,Featuretools中的自动化特征工程是在时间序列问题中构建有意义的机器学习功能的同时提供卓越预测性能的安全方法。

结论

离开这些项目,我确信自动化特征工程应该是机器学习工作流程中不可或缺的一部分。该技术并不完美,但仍能显著提高效率。

主要结论是自动化特征工程:

  • 将实施时间缩短了10倍
  • 在相同级别或更高级别实现建模性能
  • 提供具有现实意义的可解释功能
  • 防止不适当的数据使用会使模型失效
  • 适合现有的工作流程和机器学习模型

“更聪明地工作,而不是更努力地工作”可能是陈词滥调,但有时候陈词滥调是有道理的:如果有一种方法可以在较小的时间投入中以相同的表现完成相同的工作,那么显然这是一种值得学习的方法。

特征工程自动化实现的是更聪明地工作而不是更努力地工作!


分享到:


相關文章: