作者 | William Koehrsen
译者 | linstancy
编辑 | Jane
出品 | AI科技大本营
【导读】近年来,我们在自动模型选择和超参数调优方面取得了进展,但机器学习流程中最重要的方面-- 特征工程,在很大程度上被我们所忽略。在本文中,我们将使用 Featuretools 库来了解自动化特征工程如何改变并优化机器学习的工作方式。
Featuretools 是一个开源的Python 库,用于自动化特征工程
自动化特征工程是一种相对较新的技术,用于解决真实世界数据集所面临的一系列科学问题。自动特征工程能够缩减时间成本,构建更优秀的预测模型,生成更有意义的特征,还能防止数据泄漏(data leakage)。它具有强大的功能,以至于我相信它将是任何机器学习工作流程的标准部分。
接下来,我们将通过以下两个项目来进一步了解它的强大之处,这两个项目都能体现自动化特征工程的一些优点:
贷款还款预测(Loan Repayment Prediction):相比于手动特征工程,自动化特征工程能够将机器学习开发时间缩短10倍,同时还能提供更好的模型表现。
项目的Notebooks 地址:
https://github.com/Featuretools/Automated-Manual-Comparison/tree/master/Loan%20Repayment
零售支出预测(Retail Spending Prediction):自动化特征工程能够通过内部时间序列过滤器的处理,创造更有意义的特征,同时还能防止数据泄漏,从而成功实现模型的部署。
项目的Notebooks 地址:
https://github.com/Featuretools/Automated-Manual-Comparison/tree/master/Retail%20Spending
手动特征工程 vs 自动特征工程
特征工程是指获取数据集并构建解释的特征变量的过程,而特征变量能够用于训练机器学习模型并用于预测。通常,分布于多张表中的数据需要汇集到一张表中,其中行代表观察量,而列代表特征。
手动特征工程是一种传统的特征工程方法,它主要是利用领域知识来构建特征,一次只能产生一个特征,这是一个繁琐,费时又易出错的过程。此外,每次进行手动特征工程的代码是针对特定的问题,当我们要解决一个新问题、新数据集时,我们需要重写相关代码。
自动化特征工程是通过从一组相关的数据表中自动提取有用且有意义的特征,这种方法能够改变标准的工作流程,并适用于任务数据集的有关问题。此外,它不仅减少了特征工程所需的时间,还创建了可解释性的特征,并通过过滤与时间相关的数据来防止数据泄漏。
贷款还款项目
更快更好地构建模型
Home Credit Loan 问题是于今日在 Kaggle 上结束的一项机器学习竞赛项目,其目标是预测客户是否能够偿还贷款。对于数据科学家而言,这个问题的挑战在于其数据的大小及所分布的范围。我们来看下完整的数据集,可以看到分布在七张表中有 5800 万行数据,而机器学习方法需要针对一张表进行模型训练。此时,特征工程就需要将每个客户的所有信息提取并融合到一个表中。
特征工程需要从数据表格集中获取所有的数据信息并整合到一张表中
对于这个问题,我先是尝试用传统的手动特征工程来解决,共花了10个小时手动地创建一组特征。首先,我研究了其他数据科学家的工作,探索数据与研究,以便获得必要的领域知识。然后我通过编程将所需的知识写成代码,每次构建一个特征。对于一个手动特征,我使用 3 个不同的表格,找到了客户在之前贷款中延迟付款的总数。
最终,手动特征工程取得了相当不错的表现:相比于基线特征,手动特征工程取得了 65% 的性能改进,表明了特征工程的适用性和重要性。
然而,由于这种方法的效率很低,我无法在这里展开描述整个过程。对于手动特征工程,每个特征花费超过 15 分钟的时间,因为我用的这种方法一次只能创建一个特征。
手动特征工程流程
除了繁琐性和耗时等缺点外,手动特征工程还有如下弊端:
只针对特定问题:对于这个项目,我写了几个小时的代码不能应用于其他任何问题
容易出错:每行代码都有可能产生错误
此外,手动特征工程所提取的特征还会受到人类创造力和耐心的限制:对于一个问题,我们需要考虑大量的特征,而每个特征的构建又需要大量的时间。
从手动到自动的特征工程
像 Featuretools 可以实现的功能那样,自动化特征工程能够从一组相关的数据表中创建数千个特征,我们所需要知道的就是数据表的基本结构以及它们之间的关系。我们将单个数据结构称为实体集(entity set), 一旦拥有一个实体集,我们将在数据集中采用深度特征合成方法(DFS),通过调用一个函数来构建数千个特征。
使用 Featuretools 进行自动化特征工程
DFS 使用称为“基元 primitives” 的函数来聚合并转换我们的数据。这些primitives 的获取可以跟获取列的平均值或最大值一样得简单,也可以通过基于主体的专业知识那样相对复杂的方式来获取,因为Featuretools 允许我们针对任务自定义我们的 primitives。
特征基元(feature primitives)包括许多需要手动完成的操作,但通过 Featuretools,我们可以在任何关系数据库中使用相同的确切语法,也就是说在不同的数据集上我们也不需要重写代码就能够使用这些操作。此外,当我们将 primitives 堆叠在一起以创建深层特征时,DFS 的强大之处就尽显无疑了。
有关 DFS 的更多信息,可以参阅:
https://www.featurelabs.com/blog/deep-feature-synthesis/
下面,我将演示如何构建这个过程。这里,我只需要一行的代码就能使用DFS 操作,并使用7张表格数据为每个客户创建数千个功能,如下所示,其中 ft 代表导入的 featuretools 库:
1# Deep feature synthesis
2feature_matrix, features = ft.dfs(entityset=es,
3 target_entity='clients',
4 agg_primitives = agg_primitives,
5 trans_primitives = trans_primitives)
以下是我们从 Featuretools 自动获得的 1820 个功能中的一部分,包括:
客户以前贷款所支付的最高总额。这是使用 3 个表中的 MAX 和 SUM 值创建的。
客户信用卡的平均债务排名。这是使用 2 个表中的 PERCENTILE 和MEAN 值创建的。
客户是否在申请过程中提交了两份文件。这是使用 AND 转换和 1 个表创建的。
每一个特征都是使用简单的聚合构建的,因此它也是可解释的。 Featuretools 不仅能够创建许多我们手动也能完成的相同特征,还有大量手动无法创建的特征。这些特征要么是我们所无法考虑到,要么是需要昂贵的时间成本构建。虽然并非每个特征都与我们的问题相关,而某些功能间还具有高相关性,所以相比于特征量不足而言,更多的特征可能会更有助于我们解决问题。
经过一些特征选择和模型优化后,这些特征在预测模型中的性能表现也更好,而整个模型的运行时间为1小时,与手动过程相比缩减了 10 倍。Featuretools 是个高校快速的自动特征工程库,它需要较少的领域专业知识,因此所需编写的代码行数也比手动特征工程要少得多。
学习 Featuretools 需要花费一些时间,但我认为这是一项值得、能够带来回报的投资。花了一小时时间学会 Featuretools,你可以将其应用于任何机器学习的特征工程问题。
以下图表是我对贷款偿还项目的一些总结:
自动化特征工程vs 手动特征工程:开发时间、特征数以及性能对比
开发时间:考虑到最终的特征工程代码所需的每一个特征时间--手动特征工程需要10小时,而自动化特征工程只需要 1 小时。
生成的特征数量:手动特征工程生成 30 个特征,而自动化特征工程创建了 1820 个特征。
使用提取的特征训练模型所取得的相对于基线的性能改进:手动特征工程性能改进65%,而自动化特征工程取得了 66% 的提升。
此外,我为第一个项目编写的 Featuretools 代码还可以应用于任何数据集,而手动工程代码则需要为了一个新的数据集重写代码。
零售支出项目
构建有意义的功能并防止数据泄漏
第二个项目是客户的零售支出预测,所使用的数据集是在线的客户交易记录。该预测问题是将客户分为两个部分,即下个月花费超过 500 美元的人和花费不超过 500 美元的人。每个客户对应多个标签,即将客户在上个月的标签作为下个月的预测使用。例如,我们可以将客户在 5 月份的支出作为标签,然后在 6 月份中使用,依此类推。
每个客户都是多次使用的训练样本
多次使用客户标签会给创建训练数据带来困难:给定某个月份,当为客户提取对应特征时,即便我们可以访问这些数据,也无法从这个月中获取未来几个月的任何信息。在部署中,我们并没有未来的数据,因此无法使用它来训练模型。这也是我们经常在现实世界数据集上所面临的的挑战:由于模型无法在有效的数据集上进行训练,因此在现实世界应用中,这种模型的性能通常都很糟糕。
幸运的是,这个问题在 Featuretools 中能够很容易地解决。在深度特征合成(DFS)函数中,如上所示,其中截止时间表示我们不能使用任何数据作为标签的点,而 Featuretools 在构建特征时会自动地将时间考虑在内。
给定某一月份,我们可以使用之前月份过滤掉的数据来构建客户的特征。请注意,调用我们创建的特征集的过程与贷款还款项目中的调用相同,只是多了一个 cutoff_time 参数。
1# Deep feature synthesis
2feature_matrix, features = ft.dfs(entityset=es,
3 target_entity='customers',
4 agg_primitives = agg_primitives,
5 trans_primitives = trans_primitives,
6 cutoff_time = cutoff_times)
运行 Deep Feature Synthesis 得到的结果是一个特征表,即每个客户在每个月对应一个特征。我们可以使用这些特征和标签来训练我们的模型,然后对往后的任何月份进行预测。此外,我们不用担心构建模型所使用的特征会包含未来的信息,也不用担心由此导致不公平性及错误的训练得分。
利用自动化特征,我能够构建一个机器学习模型并用于预测模型某月的支出。结果表明,相比于基线模型取得的 0.69 ROC AUC 表现,我们的模型明显更优,能够达到 0.90 ROC AUC。
除了预测性能外,Featuretools 实现还能提供一个很有价值的东西:可解释性功能。下面,我们来看看随机森林模型中 15 个最重要的特征:
利用Featuretools,随机森林模型所获取的15个最重要特征
特征重要性告诉我们,影响客户下个月支出预测的最重要因素。在这里,我们可以知道,用户上月支出总和 SUM(purchases.total)和购买数量 SUM(purchases.quantity)是影响下月支出预测的关键因素。虽然这些特征我们可以通过手动构建,但是我们担心数据的泄漏,因此我们需要创建一个开发阶段性能更好的模型。
如果该工具已经能够自动创建一些有意义的特征而无需担心其有效性,那么我们为什么还要手动实现呢?此外,对于这个问题,自动化特征是完全清晰的,也能够向我们解释现实世界的推理过程。
即使手动特征工程需要花费比 Featuretools 多得多的时间,但我也无法创建出一组性能接近相同的特征。下图显示了使用在两个数据集上使用训练的模型对未来月客户支出预测的 ROC 曲线,其中越靠近左上角的曲线代表更好的性能:
自动特征工程 vs 手动特征工程的 ROC 曲线
其中越靠近左上部分的曲线表示越好的性能
我甚至不确定手动特征是否是通过有效的数据创建的,但起码 Featuretools 是这样实现的,因此我也不需要担心时间相关问题中的数据泄漏问题。也许,无法通过手动设计一组有用的特征可以表明数据科学家的失败,但是如果自动化工具能够安全地我们实现,那为什么我们不使用呢?
结论
抛开以上这些项目,我相信自动化特征工程将会是机器学习工作流程中不可或缺的一部分。虽然该技术目前还不完美,但仍能显着地提高我们的工作效率。
下面我总结了自动化特征工程的一些要点:
能将开发时间缩短 10 倍
能够构建相同甚至更好性能的模型
提供具有现实意义的可解释功能
防止模型使用无效的、不正确的数据特征
适合现有的工作流程和机器学习模型
通过自动化特征工程可以使这些工作变得更加简单,我们之前为大家介绍的基于 Python 的自动特征工程可以教大家如何快速开始自动创建机器学习特征。
原文链接:
https://towardsdatascience.com/why-automated-feature-engineering-will-change-the-way-you-do-machine-learning-5c15bf188b96
关于 Featuretools 的代码可以在 Github 上的 Jupyter Notebooks 中获得:
https://github.com/Featuretools/Automated-Manual-Comparison
——完——
AI科技大本营现招聘内容运营实习生,有意者请将简历投至:gulei@csdn.net,期待你的加入!
工作要求:
熟练使用微信、今日头条等平台发布文章,并负责其他对外推广渠道的内容铺建,用户管理以及互动;
追踪AI领域动态,协助AI内容生产;
能保证每周三天的工作时间。
工作地点:
北京市朝阳区酒仙桥路10号院恒通商务园仙桥路10号院恒通商务园