点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”
导读作者:Will Koehrsen
编译:ronghuaiyang
自动特征工程可以节省大量时间,构建更好的预测模型,构建更加有意义的特征,还可以防止数据泄露。
在数据科学中,几乎没有什么是确定的—随着更好的方法的开发,库、工具和算法不断发生变化。然而,一个不会消失的趋势是自动化水平的提高。
近年来,在自动选择模型和超参数调优方面取得了进展,但机器学习管道中最重要的方面在很大程度上被忽视了。这个关键领域中最有潜力的就是Featuretools,这是一个开源Python库。在本文中,我们将使用这个库来了解自动化特性工程将如何更好地改变你进行机器学习的方式。
自动化特征工程是一项相对较新的技术,但是,在使用它来使用真实的数据集解决许多数据科学问题之后,我确信它应该成为任何机器学习工作流的“标准”部分。在这里,我们将查看其中两个项目的结果和结论,并提供完整的代码:https://github.com/Featuretools/Automated-Manual-Comparison
每个项目都突出了自动化特征工程的一些好处:
贷款偿还预测:自动化特征工程可以比手工特征工程减少10倍的机器学习开发时间,同时提供更好的建模性能。
零售支出预测:自动化特征工程通过内部处理时间序列滤波器创建有意义的功能,并防止数据泄漏,使模型部署成功。
请随意钻研代码并尝试特征工具!(完全披露:我在Feature Labs工作,该公司正在开发这个库。)这些项目都是使用Featuretools的免费开源版本完成的)。
特征工程:手动 vs 自动
特征工程是一个获取数据集并构造解释变量(特征)的过程,这些解释变量可用于训练机器学习模型来解决预测问题。通常,数据分布在多个表中,必须收集到一个表中,其中的行包含列中的观察结果和特征。
特征工程的传统方法是使用领域知识一次构建一个特征,这是一个冗长、耗时且容易出错的过程,称为手工特征工程。手工特征工程的代码是“问题相关的”,必须为每个新数据集重新编写。
自动化特征工程通过自动从一组相关的数据表中提取有用和有意义的特性,并使用一个可以应用于任何问题的框架,从而改进了这个标准工作流。它不仅减少了在特性工程上花费的时间,而且创建了可解释的特性,并通过过滤与时间相关的数据来防止数据泄漏。
自动化的特征工程比手工的特征工程更有效和可重复性,允许你更快地构建更好的预测模型。
贷款偿还:更快地构建更好的模型
数据科学家在处理住房信贷问题时面临的主要困难是数据的规模和传播。查看完整的数据集,你将面对分布在7个表中的5800万行数据。机器学习需要一个表来进行训练,因此特征工程意味着将关于每个客户的所有信息合并到一个表中。
我第一次尝试使用传统的手工特性工程:我总共花费了10小时手工创建一组特性。首先,我阅读了其他数据科学家的工作,研究了数据,研究了问题区域,以便获得必要的领域知识。然后我将这些知识转换成代码,一次构建一个特性。作为一个单独的手工特性的例子,我发现了一个客户在以前的贷款中逾期付款的总数,这个操作需要使用3个不同的表。
最终手工设计的特征执行得相当好,比基准特征(相对于最高的排行榜得分)提高了65%,表明了适当的特征工程的重要性。
然而,低效甚至还没有开始描述这个过程。对于手工特性工程,我最终在每个特征上花费了超过15分钟的时间,因为我使用的是每次生成一个特性的传统方法。
手工特征工程除了繁琐耗时外,还有:
具体问题:我花了很多时间编写的所有代码都不能用于任何其他问题
容易出错:每一行代码都是犯错误的机会
此外,最终手工设计的特征受到人类创造力和耐心的限制:我们可以考虑构建的特征只有那么多,我们必须花的时间也只有那么多。
自动化特征工程是通过获取一组相关的表,并使用可以应用于所有问题的代码自动构建数百个有用的特性,从而超越这些限制。
从手工到自动特征工程
正如在Featuretools中实现的那样,自动化特征工程甚至允许像我这样的领域新手从一组相关数据表中创建数千个相关特征。我们只需要知道表的基本结构以及它们之间的关系,我们在一个名为entity set的数据结构中跟踪它们。一旦我们有了一个entity set,使用一个名为Deep Feature Synthesis (DFS)的方法,我们就能够在一个函数调用中构建数千个特征。
DFS使用"原语" 来聚合和转换数据。这些原语可以简单到取列的平均值或最大值,也可以复杂到基于主题专业知识,因为Featuretools允许我们定义自己的自定义原语。
Feature原语包含许多我们已经手工完成的操作,但是使用Featuretools,我们可以在任何关系数据库中使用相同的语法,而不是重新编写代码来在不同的数据集中应用这些操作。此外,当我们将原语堆叠在一起以创建深层特征时,DFS的强大功能就显现出来了。(有关DFS的更多信息,请查看该技术的发明者之一所写的这篇博客文章。)
深度特征综合是灵活的—允许它应用于任何数据科学问题—和强大的—揭示我们的数据通过创建深度特征的洞察力。
我将省去设置所需的几行代码,但是DFS的操作只需要一行。在这里,我们使用数据集中的所有7个表为每个客户端创建了数千个特征( ft
是导入的featuretools 库):
# Deep feature synthesis
feature_matrix, features = ft.dfs(entityset=es,
target_entity='clients',
agg_primitives = agg_primitives,
trans_primitives = trans_primitives)
下面是我们从Featuretools自动获得的1820特征中的一部分:
客户在过往贷款上所支付的最高金额。这是使用
MAX
和SUM
原语跨3个表创建的。客户过去平均信用卡债务的百分位排名。这在两个表中使用了
PERCENTILE
和MEAN
原语。客户是否在申请过程中递交了两份文件。它使用
AND
转换原语和一个表。
这些特征中的每一个都是使用简单的聚合构建的,因此是人类可解释的。Featuretools创建了许多与我手工创建的相同的功能,但也有成千上万个我从未想过的特征,或者是我没有时间去实现的特征。并不是每个单独的特征都与问题相关,而且有些特征是高度相关的,尽管如此,拥有太多的特征要比拥有太少更好!
在进行了少量的特征选择和模型优化之后,这些特征在预测模型中的表现略好于总体开发时间为1小时的手动特性,比手动过程减少了10倍。Featuretools要快得多,这是因为它需要的领域知识更少,而且需要编写的代码行也更少。
我承认学习Featuretools需要花费一点时间,但这是一项会有回报的投资。花一个小时左右的时间来学习Featuretools,你可以把它应用到任何机器学习问题上。
下面的图表总结了我在还款问题上的经验:
开发时间:占所有需要作出最终功能工程代码:10小时手工 vs . 1小时自动化
该方法产生的特征数量:30个特征手动,1820个特征自动
相对于基准的改进是,使用基于以下特征的模型(65%手动 vs . 66%自动)
我的结论是,自动化特征工程不会取代数据科学家,而是通过显著提高效率,让她有更多的时间花在机器学习管道的其他方面。
此外,我为第一个项目编写的Featuretools代码可以应用于任何数据集,而手工工程代码必须被丢弃,并为下一个数据集完全重写!
零售支出:构建有意义的功能并防止数据泄漏
对于第二个数据集,一个在线时间戳客户交易记录,预测问题是将客户分为两类,一类是下个月将花费超过500美元的客户,另一类则不会。但是,每个客户都是每个月会标记好几次,而不是一个月只标记一次。我们可以把他们5月份的消费作为一个标签,然后是6月份,以此类推。
将每个客户多次作为观察对象使用会给创建训练数据带来困难:当为给定月份的客户创建特征时,我们不能使用来自未来月份的任何信息,即使我们可以访问这些数据。在部署中,我们“永远不会有未来的数据”,因此不能使用它来训练模型。公司经常与这个问题作斗争,并且经常部署一个在现实世界中比在开发中做得差得多的模型,因为它是使用无效数据进行训练的。
幸运的是,确保我们的数据在时间序列问题中是有效的在features tools中很简单,在深度特征综合函数中,我们传入一个类似于上面所示的dataframe ,其中截止时间表示我们不能为标签使用任何数据的时间点,Featuretools自动在构建特征时考虑了时间。
给定月份中客户的特征是使用筛选到当月之前的数据构建的。请注意,创建我们的功能集的调用与添加 cutoff_time
的贷款偿还问题的调用是相同的。
# Deep feature synthesis
feature_matrix, features = ft.dfs(entityset=es,
target_entity='customers',
agg_primitives = agg_primitives,
trans_primitives = trans_primitives,
cutoff_time = cutoff_times)
运行深度特征综合的结果是一个特征表,每个客户每个月一个。我们可以使用这些特征用我们的标签训练一个模型,然后对每个月进行预测。此外,我们可以放心,我们模型中的特征不会使用未来的信息,这将导致不公平的优势和产生误导的训练分数。
通过自动化特征,我能够构建一个机器学习模型,在预测一个月的客户支出类别时,ROC AUC达到0.90,而基线(猜测与前一个月相同的支出水平)为0.69。
除了提供令人印象深刻的预测性能之外,Featuretools实现还提供了一些同样有价值的东西:可解释的特征。看看随机森林模型的15个最重要的特征:
特征的重要性告诉我们,预测客户下个月将花费多少的最重要的指标是他们之前花费了多少 SUM(purchases.total)
,以及购买的数量 SUM(purchases.quantity).
。他说,我们本可以手工构建这些功能,但这样一来,我们就不得不担心数据泄露,并创建一个在开发中比在部署中做得更好的模型。
如果工具已经存在,可以创建有意义的特征,而不需要担心特征的有效性,那么为什么要手工实现呢?此外,自动化特征在问题的上下文中是完全清晰的,并且可以为我们的实际推理提供信息。
自动化特征工程识别出最重要的信号,实现了数据科学的首要目标:洞察隐藏在海量数据中的信息。
即使在手动特征工程上花费的时间比使用特性工具多得多,我仍然无法开发出一组性能接近相同的特征。下面的图表显示了ROC曲线,该曲线使用两个数据集训练的模型对未来一个月的客户销售进行分类。左上方的曲线表明预测更好:
我甚至不完全确定手动特性是否使用了有效的数据,但是通过Featuretools实现,我不必担心数据在时间相关的问题中泄漏。也许无法手工设计一组有用的有效特征说明了我作为数据科学家的缺点,但是如果这个工具能够安全地为我们做这些,为什么不使用它呢?
我们在日常生活中使用自动安全系统,而Featuretools 中的自动特征工程是在时间序列问题中构建有意义的机器学习特征的安全方法,同时提供优越的预测性能。
总结
从这些项目中,我确信自动化特性工程应该成为机器学习工作流程中不可或缺的一部分。这项技术尚不完善,在效率方面仍需要显著提高。
主要结论是自动化特征工程:
减少了多达10倍的实现时间
得到的模型和手工特征相当或者更好
交付具有现实意义的可解释特征
防止不适当的数据使用导致的模型失效
适合现有的工作流程和机器学习模型
“更聪明地工作,而不是更努力地工作”也许是老生常谈,但有时陈词滥调也是有道理的:如果有一种方法可以用更少的时间投资完成同样的工作,并且取得同样的成绩,那么这显然是一种值得学习的方法、
Featuretools:https://www.featuretools.com/,总是可以免费使用并且是开源的(欢迎投稿),这里有几个例子这里是一篇文章可以让你在10分钟内开始学习。作为一名数据科学家,你的工作是安全的,但是使用自动化的特性工程可以大大简化这一工作。
— END—英文原文:https://towardsdatascience.com/why-automated-feature-engineering-will-change-the-way-you-do-machine-learning-5c15bf188b96
请长按或扫描二维码关注本公众号
喜欢的话,请给我个好看吧!