摘要: 机器学习中最重要的领域之一是特征工程,却被严重地忽视了。这个重要领域中最成熟的工具就是Featuretools,一个开源的Python库。在本文中,咱们将使用这个库来了解一下特征工程自动化将如何改变你进行机器学习的方式。
随着技术的快速发展,在数据科学领域中,包括库、工具和算法等总会不断地变化的。然而,一直都有这么一个趋势,那就是自动化水平不断地提升。html
近些年来,在模型的自动化选择和超参数调整方面取得了一些进展,可是机器学习中最重要的领域 — 特征工程,却被严重地忽视了。这个重要领域中最成熟的工具就是Featuretools,一个开源的Python库。在本文中,咱们将使用这个库来了解一下特征工程自动化将如何改变你更好地进行机器学习的方式。git
特征工程自动化是一种相对较新的技术,可是,它解决了许多实际数据集的使用问题。在这里,咱们将用GitHub上的Jupyter Notebooks提供的代码来看看其中两个项目的结果和最终结论。github
每一个项目都强调了特征工程自动化的一些好处:算法
特征工程是获取数据集并构造可解释的变量—特征的过程,用于训练预测问题的机器学习模型。一般,数据分布在多个表中,而且必须聚集到一个表之中,其中的行包含观察结果和列中的特征。数据库
传统的特征工程方法是使用相关领域知识建立一个特征,这是一个冗长、耗时且容易出错的过程,称为人工特征工程。人工特征工程是依赖于具体问题的,必须为每一个新数据集从新编写代码。安全
特征工程自动化经过自动从一组相关的数据表中提取有用且有意义的特征,并使用一个可应用于任何问题的框架,来改进这个标准工做流。它不只减小了在特征工程上花费的时间,并且还建立了可解释的特征,并经过过滤具备时间依赖性的数据来防止数据泄漏。数据结构
当数据科学家在处理家庭信贷贷款问题的时候,所面临的主要难题是数据的大小和分布。看看完整的数据集,你会发现面对的是分布在7个表中的5800万行数据。框架
我曾经使用传统的人工特征工程花了10个小时建立了一组特征。首先,我查阅了其余数据科学家的成果,还查看了相关的数据,并研究了问题域,以得到必要的相关领域知识。而后我将这些知识翻译成代码,一次建立一个特征。做为单一的人工特征的一个例子,我找到了客户之前贷款的逾期还款总数,这一操做须要用到3个不一样的表。机器学习
最终人工设计的特征表现的至关好,比基线特征提升了65%,代表了正确特征设计的重要性。ide
然而,效率却很是低下。对于人工特征工程,我最终花了超过15分钟来完成每一个特征,由于我使用传统的方法一次生成一个特性。
除了单调乏味和耗时以外,人工特征工程还有如下问题:
另外,最终的人工设计的特征受到了人类创造力和耐心方面的限制:咱们只能考虑建立这么多的特征,而且只能花费这么多的时间。
特征工程自动化的承诺是经过获取一组相关的表,并使用能够应用于全部问题的代码,来自动建立数以百计有用的特征,进而跨越这些限制。
特征工程自动化甚至容许像我这样的新手,在一组相关的数据表中能够建立数以千计的相关特征。咱们只须要知道表的基本结构以及它们之间的关系,咱们在一个称为实体集的单一数据结构中来跟踪它们。一旦咱们有了一个实体集,使用一个称为深度特征合成(Deep Feature Synthesis,DFS)的方法,咱们就可以在一个函数调用中建立数以千计的特征了。
DFS使用称为“primitives”的函数来进行聚合和转换数据。这些primitives能够简单到仅获取一个平均值或列的最大值,也能够复杂到基于主题的专业知识,由于FeatureTools容许咱们定义本身的primitives。
特征primitives包括许多人工操做,可是经过使用FeatureTools,咱们能够在任何关系数据库中使用相同准确的语法,而不是再从新编写代码并在不一样的数据集中使用相同的操做。此外,当咱们将primitives相互堆叠在一块儿来建立深层次的特征时,DFS的威力就来了。
深度特征合成是灵活的,它被容许应用于任何数据科学领域的问题。它同时也是很强大的,经过建立深度特征来揭示咱们对数据的推断。
我会为你省去环境设置所需的几行代码,但DFS只在一行中运行。在这里,咱们使用数据集中的全部7个表为每一个客户生成数千个特征:
# Deep feature synthesis feature_matrix, features = ft.dfs(entityset=es, target_entity='clients', agg_primitives = agg_primitives, trans_primitives = trans_primitives)
下面是咱们自动从FeatureTools得到的1820个特征中的一部分:
这些特征中的任何一个都是用简单的聚合建立的。FeatureTools建立了许多与我手工建立的相同的特征,但也有数千个是我从未考虑过的。并非每个特征都与问题相关,有些特征是高度相关的,然而,拥有太多的特征是一个比拥有太少的特征更好解决的问题。
在进行了一些功能选择和模型优化以后,与人工特征相比,预测模型中的这些特征要稍好一些,整体开发时间为1小时,与人工的过程相比减小了10倍。FeatureTools速度更快,这是由于它须要的领域知识更少,并且要编写的代码行也少的至关多。
我认可学习Featuretools须要一点时间成本,但这是一项有回报的投资。在花了一个小时左右的时间学习Featuretools以后,你就能够将其应用于任何机器学习问题了。
如下的图表总结了我在贷款偿还问题上的经验:
个人结论是,特征工程自动化不会取代数据科学家,而是经过显著地提升效率,使他们在机器学习的其它方面能够花费更多的时间。
另外,我为第一个项目编写的Featuretools代码能够应用于任何数据集,而人工工程的代码则无法再利用。
第二个数据集,在线时间戳的客户交易记录,预测问题是将客户分为两个部分,消费超过500美圆的客户和消费不会超过500美圆的客户。可是,不是对全部标签使用一个月,而是每一个客户屡次使用一个标签。咱们能够把他们5月份的消费支出做为一个标签,而后6月份的,等等。
在部署中,咱们永远不会有将来的数据,所以没法将其用于训练模型。企业一般会遇到这个问题,而且常常部署一个在实际应用中比在开发中更糟糕的模型,由于这是使用无效的数据来进行训练的。
幸运的是,要确保咱们的数据在时间序列问题中是有效的,这在FeatureTools中很简单。在深度特征合成函数中,咱们传递一个如上图所示的dataframe,其中截止时间表示咱们不能使用任何标签数据中过去的时间点,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)
执行深度特征合成的结果是一个特征表,每一个客户一个月一个。咱们可使用这些特征来训练一个带有标签的模型,而后能够对任何月份进行预测。此外,咱们能够放心,模型中的特征不会使用致使不公平优点的将来信息,并产生误导训练的分数。
有了自动化特征,我可以建立一个机器学习模型,在预测一个月内客户消费支出类别的时候,与已知为0.69的基线相比,ROC AUC达到0.90。
除了提供使人印象深入的预测能力以外,FeatureTools的实现还为我提供了一些一样有价值的东西:可解释的特征。看一下随机森林模型中的15个最重要的特征:
特征的重要性告诉咱们,预测客户将在下个月花多少钱的最重要素是他们以前花了多少钱SUM,以及购物的数量SUM。这些是能够手工建立的特征,可是咱们不得不担忧数据泄漏的问题,并建立在开发中比部署中效果要好的模型。
若是能够建立有意义的特征工具已经存在了,而无需担忧任何特征的有效性,那么为何要人工实现呢?另外,自动化特征在问题的上下文中是彻底明确的,而且能够为咱们的实际推理提供信息。
自动化特征工程识别出最重要的信号,实现了数据科学的主要目标:揭示隐藏在海量数据中的规律。
即便在人工特征工程上花费的时间比我用FeatureTools花的时间多得多,那么我也没法开发出一组性能表现接近的特征。下图显示了使用在两个数据集上训练的模型对将来一个月的客户销售状况进行分类的ROC曲线。左上方的曲线表示更准确的预测:
我甚至不能彻底肯定人工特征是否使用了有效的数据,可是经过FeatureTools我没必要担忧时间依赖性问题中的数据泄漏。
咱们在平常生活中使用自动安全系统,Featuretools中的特征工程自动化是在时间序列问题中建立有意义的机器学习特征的安全方法,同时提供了卓越的预测性能表现。
我通过了这些项目以后,确信特征工程自动化应该是机器学习工做流程中不可或缺的一部分。这项技术并不完美,但依旧能显著地提升效率。
主要的结论就是特征工程自动化:
本文为云栖社区原创内容,未经容许不得转载。