社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

特征工程自动化如何为机器学习带来重大变化

AI研习社 • 4 年前 • 460 次点击  

本文为 AI 研习社编译的技术博客,原标题 :

Why Automated Feature Engineering Will Change the Way You Do Machine Learning

作者 | Will Koehrsen

翻译 | 叶梦琦   

校对 | 酱番梨        审核 | 约翰逊·李加薪       整理 | 立鱼王

原文链接:

https://towardsdatascience.com/why-automated-feature-engineering-will-change-the-way-you-do-machine-learning-5c15bf188b96

注:本文的相关链接请访问文末【阅读原文】

数据科学中有一些确定性--随着新方法的发展,库,工具,和算法也在持续发展。然而,有一个没有淘汰的趋势,就是朝着更高的自动化。

近年来,在自动化模型选择和超参数调参有了些进展,但机器学习管线中最重要的一面,特征工程,很大程度上被忽视了。在这关键领域中,最有力的入口是Featuretools,一个开源Python库。在这篇文章中,我们将用这个库来看,自动化特征工程将更好地改变你实践机器学习的方式。


自动化特征工程是一项更新的技术,但,在用它解决一系列,使用真实世界数据集的数据科学问题后,我确信它应该成为任何机器学习工作流的标准部分。在此,我们将查看两个项目的结果和结论,项目代码。

每个项目突出一些自动特征工程的好处:

  • 贷款还款预测:自动特征工程,对比手动特征工程,能够减少10倍机器学习开发时间,同时达到更好的模型表现。

  • 零售支出预测:自动特征工程通过内部处理时间序列过滤器来创建有意义的特征并防止数据泄漏,从而实现成功的模型部署。

请自由研究代码并尝试Featuretools!(揭秘:我给Feature Labs打工,开发库的公司。这些项目使用了免费,开源版本的Featuretools)。

  特征工程: 人工vs. 自动

特征工程是利用数据集和构造可用于训练预测问题机器学习模型的解释变量 - 特征 - 的过程。通常,数据分散在多个表中,必须收集到一个表中,其中包含每行观察结果和每列特征。

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

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

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

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

数据科学家处理家庭信贷贷款问题(目前在Kaggleon运行的机器学习竞赛,目的是预测贷款是否将由客户偿还)面临的主要困难是数据的大小和传播。看一看完整的数据集,您就会遇到分布在七个表中的5800万行数据。机器学习需要一个用于培训的表,因此功能工程意味着将每个客户的所有信息合并到一个表中。

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

我第一次尝试这个问题时使用了传统的手动特征工程:我花了10个小时,手工创建了一组特征。我首先阅读了其他数据科学家的工作,探索了数据,研究了问题区域,以获取必要的领域知识。然后我将知识转化为代码,一次构建一个功能。作为单个人工特征的示例,我发现客户在以前的贷款中支付的延迟付款总数是使用3个不同的表所需的操作。

最终人工设计的特征表现得很好,相对于基线特征(相对于顶级排行榜分数)获得了65%的改进,这表明了正确的特征工程的重要性。

然而,效率低下甚至开始描述这一过程。对于人工特征工程,我每次建立特征超过15分钟,因为我一次使用了传统的制作单一功能的方法。

人工特征工程过程 

除了繁琐和费时的手工特性工程是:

  • 特定问题:我花了许多小时编写的所有代码都不能应用于任何其他问题

  • 容易出错:每一行代码都是犯错误的另一个机会

最后的人工设计特征受到人类创造力和耐心的限制:我们只有那么多的特征可以考虑去构建,而我们必须花那么多的时间来完成它们。自动化特征工程的希望是通过使用一组相关表并使用可以应用于所有问题的代码自动构建数百个有用的特征,从而超越这些限制。

  从人工到自动特征工程

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

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

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

功能原语包括我们已经手动手动完成的许多操作,但是使用Featuretools,而不是重写代码以将这些操作应用于不同的数据集,可以我们在任何关系数据库中使用 相同的确切 语法。此外,当我们将基元堆叠在一起以创建深层特征时,DFS的强大功能就出现了。(有关DFS的更多信息,请查看该技术发明人之一的博客文章。)

深度特征综合是灵活的 - 使之能被应用于任何数据科学问题 - 并且功能强大 - 通过创建深层特征来揭示我们数据的本质。

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

# Deep feature synthesisfeature_matrix, features = ft.dfs(entityset=es,                                   target_entity='clients',                                  agg_primitives = agg_primitives,                                trans_primitives = trans_primitives)

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

  • 客户以前贷款支付的最高总额。这是使用3个表中的MAX和SUM原语创建的 。

  • 客户在平均先前信用卡债务方面的百分位排名。这在两个表中使用  PERCENTILE  和  MEAN原语。

  • 客户是否在申请过程中提交了两份文件。这使用  AND  转换原语和1个表。

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

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

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

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


自动和手动功能工程按时,功能数量和性能之间的比较。

  • 开发时间:考虑制作最终功能工程代码所需的所有内容:10小时手动和1小时自动化

  • 该方法生成的特征数量:30个功能手册与1820自动化

  • 相对于基线的改进是使用在特征上训练的模型与基线公共排行榜得分相比的基线增益百分比:65%手动与66%自动化

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

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

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

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

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

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

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

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

# Deep feature synthesisfeature_matrix, features = ft.dfs(entityset=es,                                   target_entity='customers',                                  agg_primitives = agg_primitives,                                trans_primitives = trans_primitives,                                  cutoff_time = cutoff_times)

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

通过自动化功能,我能够建立一个机器学习模型,与预测一个月的客户支出类别的0.69相比,知情基线(猜测与上个月相同的支出水平)达到0.90 ROC AUC。

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


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

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

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

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

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

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

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

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

  结论

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

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

  • 将实施时间缩短了10倍

  • 在相同级别或更高级别实现建模性能

  • 提供具有现实意义的可解释功能

  • 防止使模型无效的不正确数据使用

  • 适合现有的工作流程和机器学习模型

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

Featuretools 将永远免费使用和开源(欢迎贡献),并有几个例子 -  这是我写的一篇文章  - 让你在10分钟内上手。您作为数据科学家的工作是安全的,但使用自动化功能工程可以使其变得更加容易。

想要继续查看该篇文章相关链接和参考文献?

点击底部【阅读原文】即可访问:

https://ai.yanxishe.com/page/TextTranslation/1440


AI求职百题斩 · 每日一题


每天进步一点点,长按扫码参与每日一题!




长按二维码

关注 AI研习社


点击阅读原文,查看更多内容

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32274
 
460 次点击