为什么说自动化特征工程将改变机器学习的方式
转自:公众号大数据文摘
文章来源:towardsdatascience
编译:籍缓、毅航、ZoeY、蒋宝尚
没有什么是一成不变的,尤其是在数据科学领域。毕竟,一些库、算法、工具一直在更新迭代。
然而,一个永远不会消失的趋势就是提高自动化水平。
近年来在自动化模型选择和超参数调整方面已经取得了进展,但机器学习流程中最重要的一点,特征工程,在很大程度上却被忽略了。这个关键领域中最好的入口是Featuretools(一个开源Python库)。在本文中,我们将使用此库来了解自动化特征工程如何改变机器学习的方式。
Featuretools:
https://docs.featuretools.com/#minute-quick-start
Featuretools是一个用于自动化特征工程的开源Python库。
自动化特征工程是一种相对较新的技术,但在应用它来解决大量的基于真实数据集的数据科学问题后,我们确信它应该是任何机器学习工作的标准流程的一部分。在本文,我们将说说其中两个项目的结果和结论,并在GitHub上以Jupyter Notebooks格式提供完整代码。
代码链接:
https://github.com/Featuretools/Automated-Manual-Comparison
每个项目都强调了自动化特征工程的一些优点:
贷款还款预测:与手动特征工程相比,自动化特征工程可将机器学习的开发时间缩短10倍,同时提供更好的建模性能。
https://github.com/Featuretools/Automated-Manual-Comparison/tree/master/Loan%20Repayment
零售支出预测:自动化特征工程通过内部处理时间序列筛选器来创建有意义的特征并防止数据泄漏,从而成功部署模型。
https://github.com/Featuretools/Automated-Manual-Comparison/tree/master/Retail%20Spending
特征工程:手动与自动化
特征工程是获取数据集和构建解释变量,即,那些可以用来训练预测问题中的机器学习模型的“特征”的过程。通常,数据分布在多个表中,我们须要将它们整合到一个表中,并将各个特征作为列标题,将相应的观察值填充到各行。
传统的特征工程方法使用领域知识一次仅构建一个特征,这是一个繁琐、耗时且容易出错的过程,我们称为手动特征工程。手动特征工程的代码与问题有关,必须为每个新数据集重写。
自动化特征工程使用一种适用于任何问题的框架,从一组相关数据表中自动提取有用且有意义的特征,改进了传统手工特征工程的标准流程。它不仅减少了特征工程所花费的时间,还创建了可解释的特征,并通过过滤与时间相关的数据来防止数据泄漏。
自动化特征工程比手动特征工程更高效,可重复性更高,使你能够更快地构建更好的预测模型。
贷款还款:更快地建立更好的模型
数据科学家面临的家庭信贷贷款问题的主要困难(目前在Kaggle上运行的机器学习竞赛,目标是预测客户是否能够偿还贷款)是数据的大小和传播。全部数据分散在七个表中的5800万行中。机器学习需要一个单独的表进行训练,因此特征工程意味着在一个表中合并每个客户的所有信息。
特征工程需要将一组相关表中的所有信息合并到一个表中
我们首先尝试了使用传统的手动特征工程解决这个问题:总共花了10个小时,手工创建了一组特征。首先,阅读了其他数据科学家的文章,探索数据,并研究问题所在的领域,以获得必要的领域知识。然后将知识翻译成代码,一次构建一个特征。作为单个手动特征的一个示例,找到了客户对之前贷款的出现延迟付款的总次数,这项操作需要使用3个不同的表格。
最终的手工设计的特征工程表现相当不错,比基线特征(相对于最高排行榜得分)提高了65%,表明了正确的特征工程的重要性。
然而,“效率低下”都不足以形容这个过程的低效。对于手动特征工程,我最终每个特征花费超过15分钟,因为我使用的是传统方法,一次只能建立一个特征。
手动特征工程过程
除了繁琐耗时外,手动特征工程还包括:
特定问题:我写了几个小时的所有代码都不能应用于任何其他问题
容易出错:每行代码都有犯错误的可能
此外,最终的手工设计特征受到人类创造力和耐心的限制:我们只能建立能想到的特征,而且能用来建立特征的时间也是有限的。
自动化特征工程的意义是通过在一组相关表中使用可应用于所有问题的代码,自动构建数百个有用特征,来超越这些限制。
从手动到自动特征工程
正如Featuretools中实现的那样,自动化特征工程让新手都可以从一组相关数据表中创建数千个相关特征。我们只需要知道我们表的基本结构以及它们之间的关系,我们在称为实体集的单个数据结构中跟踪它们。一旦我们有一个实体集,便使用一个名为深度特征合成(DFS)的方法,我们就能够在一次函数调用中构建数千个特征。
使用Featuretools的自动化特征工程流程
DFS使用被称为“基元(primitives)”的函数来聚合和转换我们的数据。这些基元(primitives)可以像获取列的平均值或最大值一样简单,或者它们可以是复杂的并且基于专业知识的,因为Featuretools允许我们定义我们自己的自定义基元。
特征基元(primitives)包括我们已经手动完成的许多操作,但是使用Featuretools,我们可以在任何关系数据库中使用相同的确切语法,而不是重写代码以将这些操作应用于不同的数据集。此外,当我们将基元堆叠在一起以创建深层特征时,DFS的强大更加得以显现。
有关DFS技术发明人之一的博客文章:
https://blog.featurelabs.com/deep-feature-synthesis/
深度特征合成是灵活的(这也是它在数据科学问题领域被广泛使用的主要原因)、功能强大的(通过创建深层特征来揭示我们数据的见解)。
我将为你提供设置所需的几行代码,但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个特征中的一些:
客户以前支付的最高贷款总额。这是在3个表中使用MAX和SUM基元(primitives)创建的。
客户先前信用卡债务平均数的百分位排名。这是在2个表中使用PERCENTILE和MEAN基元(primitives)创建的。
客户是否在申请过程中提交了两份文件。这使用AND转换基元(primitives)和1个表。
这些特征中的每一个都是使用简单的聚合构建的,因此是可解释的。Featuretools创建了许多与我手动构建的相同的特征,但也有成千上万的我从未想过或没有时间完成的特征。并非每一个特征都与问题相关,而且某些特征之间相似度很高,但是特征太多总比特征太少要好!
经过一些特征选择和模型优化后,与手动特征相比,这些特征在预测模型中略胜一筹,整个模型开发时间为1小时,与手动过程相比减少了10倍。Featuretools要快得多,因为它需要更少的领域知识和明显更少的代码。
我承认学习Featuretools需要花费一些时间,但这是一项可以带来回报的投资。花了一个小时左右来学习Featuretools后,你可以将其应用于任何机器学习问题。
以下图表总结了我对贷款偿还问题的经验:
自动和手动进行特征工程的耗时、特征数量和性能之间的比较。
开发时间:完成特征工程代码耗时:手动10小时,自动1小时
该方法生成的特征数量:30个手动特征与1820个自动特征
相对于基线的改善,即,使用受过特征训练的模型与公共排行榜最高得分相比的增益百分比:65%(手动结果)v.s.66%(自动化结果)
我的想法是,自动化特征工程不会取代数据科学家,而是通过显着提高效率,使数据科学家们可以将更多时间花在机器学习流程的其它方面。
此外,我为第一个项目编写的Featuretools代码可以应用于任何数据集,而手动的特征代码必须被丢弃,并为下一个数据集完全重写!
零售支出:构建有意义的特征并防止数据泄漏
对于第二个数据集,即在线时间戳客户交易的记录,预测任务是将客户分为两个部分,即下个月花费超过500美元的人和不会花费超过500美元的人。
但是,相对于仅使用所有客户一个月的数据,我们的做法是将每个客户多次标记。我们可以将他们在5月份的支出用作一个标签,然后是6月份支出,依此类推。
每个客户多次被用作训练样本
多次使用每个客户作为观察变量会给创建训练集造成困难:在为特定月份的客户制作特征时,即使我们可以访问这些数据,我们也不能使用未来几个月的任何信息。
在实际中,我们永远不会有未来的数据,因此不能用它来训练模型。很多公司都在这个问题上挣扎,因为部署的模型是使用无效数据训练的,所以在现实世界中的表现要比在开发中糟糕很多。
幸运的是,如果使用Featuretools,那么确保时间序列问题中的数据有效性将变得很简单。在深度特征合成功能中,我们设置了一个如上所示的数据框,其中中止时间表示我们不能使用任何数据作为标签的点,并且Featuretools在构建特征时自动将时间考虑在内。
指定月份的客户特征是利用指定月份之前的数据构建的。请注意,除了添加了中止时间,这个创建特征集的过程与贷款还款问题的过程相同。
# 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)
运行DFS的结果是一个特征表,每个客户每月有一个特征。我们可以使用这些特征来训练带有我们标签的模型,然后对任何月份进行预测。此外,我们可以放心,我们模型中的特征不会使用未来的信息,否则会导致不公平的优势并产生误导性的训练分数。
使用自动化特征,在预测客户月支出类别时,我能够建立一个机器学习模型,与已知的基线0.69(猜测与上个月相同的支出水平)相比,它可以达到UOC (Roc曲线下的面积)= 0.90。
除了提供令人印象深刻的预测性能之外,Featuretools的实现还给了我同样有价值的东西:可解释的特征。看看随机森林模型中15个最重要的特征:
15个随机森林模型中最重要的Featuretools特征
特征重要性告诉我们,客户之前花费了多少SUM(purchases.total),以及购买数量SUM(purchases.quantity)是预测他们将在下个月花多少钱的最重要的预测因素。这些是我们可以手工构建的特征,但是我们将不得不担心泄漏数据并创建一个在开发方面比在部署方面做得更好的模型。
如果已经有了为创建有意义的特征而存在的工具而且无需担心这些特征的有效性,那么为什么要手动?此外,自动化特征是简明易懂的,并且可以告诉我们实际中的推理过程。
自动化特征工程确定了最重要的信号,实现了数据科学的主要目标:揭示隐藏在大量数据中的真理。
即使花在手动特征工程上的时间比使用Featuretools花费的时间多得多,我也无法开发出一组性能接近的特征。下图显示了在两个数据集上训练的模型对未来一个月的客户销售进行分类的ROC曲线。曲线越往左上偏说明预测能力越好:
ROC曲线比较了自动和手动特征工程结果。往左上偏的曲线表示更好的性能。
甚至不确定手动特征是否是使用有效数据制作的,但是使用Featuretools,不必担心时间依赖问题中的数据泄漏。也许在手动设计有效特征方面的无能说明我作为数据科学家挺失败的,但如果有工具能够安全地为我们做到这一点,何乐而不为呢?
我们在日常生活中使用自动安全系统,Featuretools中的自动化特征工程是在时间序列问题中构建有意义的机器学习特征同时提供卓越预测性能的安全保障方法。
结论
这些项目让我确信自动化特征工程应该是机器学习工作流程中不可或缺的一部分。该技术并不完美,但仍可显著提高效率。
自动化特征工程的主要结论:
实施时间缩短10倍
实现相同水平或更好地建模表现
交付具有现实意义的可解释特征
防止数据使用不当,使模型失效
适应现有的工作流和机器学习模型
“工作更聪明,而不是更努力”可能是陈词滥调,但有时候陈词滥调有道理:如果有一种方法可以在较小的时间投入中以相同的表现完成相同的工作,那么显然这是一种值得学习的方法。
相关报道:
https://towardsdatascience.com/why-automated-feature-engineering-will-change-the-way-you-do-machine-learning-5c15bf188b96