在公众号「python风控模型」里回复关键字:学习资料

featuretools完全指南-可自动构造机器学习特征的Python库_机器学习

特征工程意味着从现有数据中构建附加特征,这些数据通常分布在多个相关表中。特征工程需要从数据中提取相关信息并将其放入单个表中,然后可用于训练机器学习模型。

构建特征的过程非常耗时,因为每个新特征通常需要几个步骤来构建,尤其是在使用来自多个表的信息时。我们可以将特征创建的操作分为两类:转换聚合。让我们看几个例子,看看这些概念的实际应用。

一个转化作用于单个表(思维在Python而言,表只是一个熊猫​​DataFrame​​通过创建新的功能出来的一个或多个现有列)。例如,如果我们有下面的客户表

featuretools完全指南-可自动构造机器学习特征的Python库_特征工程_02

我们可以通过查找​​joined​​​列的月份或取列的自然对数来创建特征​​income​​。这些都是转换,因为它们只使用一张表中的信息。

featuretools完全指南-可自动构造机器学习特征的Python库_机器学习_03

另一方面,聚合是跨表执行的,并使用一对多关系对观察进行分组,然后计算统计量。例如,如果我们有另一个客户贷款信息的表,其中每个客户可能有多笔贷款,我们可以计算每个客户贷款的平均值、最大值和最小值等统计数据。

此过程包括按客户对贷款表进行分组,计算聚合,然后将结果数据合并到客户数据中。下面是我们如何使用Pandas 语言在 Python 中做到这一点。

featuretools完全指南-可自动构造机器学习特征的Python库_featuretools_04

这些操作本身并不难,但是如果我们有数百个变量分布在几十个表中,这个过程手工完成是不可行的。理想情况下,我们需要一个可以跨多个表自动执行转换和聚合并将结果数据合并到单个表中的解决方案。虽然 Pandas 是一个很好的资源,但我们想要手动完成的数据操作只有这么多!(有关手动特征工程的更多信息,请查看优秀的Python 数据科学手册)。


功能工具

幸运的是,featuretools 正是我们正在寻找的解决方案。这个开源 Python 库将自动从一组相关表中创建许多功能。Featuretools 基于一种称为“深度特征合成”的方法,听起来比实际要强大得多(这个名字来自堆叠多个特征,而不是因为它使用了深度学习!)。

深度特征合成堆叠了多个转换和聚合操作(在特征工具的词汇中称为特征原语),以从分布在许多表中的数据创建特征。与机器学习中的大多数想法一样,它是一种建立在简单概念基础上的复杂方法。通过一次学习一个构建块,我们可以很好地理解这种强大的方法。

首先,让我们看一下我们的示例数据。我们已经看到了上面的一些数据集,完整的表格集合如下:

  • ​clients​​:信用合作社客户的基本信息。每个客户端在此数据框中只有一行

featuretools完全指南-可自动构造机器学习特征的Python库_特征工程_05

  • ​loans​​: 贷款给客户。每笔贷款在此数据框中只有自己的行,但客户可能有多笔贷款。

如果我们有一项机器学习任务,例如预测客户是否会在未来偿还贷款,我们希望将有关客户的所有信息合并到一个表中。这些表是相关的(通过​​client_id​​​和​​loan_id​​变量),我们可以使用一系列转换和聚合来手动完成这个过程。但是,我们很快就会看到我们可以使用功能工具来自动化该过程。


实体和实体集

特征工具的前两个概念是实体实体****集。实体只是一张表(或者,​​DataFrame​​如果您认为 Pandas是一张表)。一个EntitySet的是表的集合,它们之间的关系。将实体集视为另一种 Python 数据结构,具有自己的方法和属性。

我们可以使用以下命令在 featuretools 中创建一个空实体集:

将特征工具导入为 ft# 创建新的实体集es = ft.EntitySet(id = 'clients')

现在我们必须添加实体。每个实体都必须有一个索引,它是一个包含所有唯一元素的列。也就是说,索引中的每个值只能在表中出现一次。​​clients​​​数据帧中的索引是​​client_id​​因为每个客户端在该数据帧中只有一行。我们使用以下语法将具有现有索引的实体添加到实体集:

该​​loans​​​数据帧还具有独特的指数,​​loan_id​​​ 而且语法将它添加到EntitySet的是一样的​​clients​​​。但是,对于​​payments​​​数据帧,没有唯一索引。当我们将这个实体添加到实体集中时,我们需要传入参数​​make_index = True​​​并指定索引的名称。此外,虽然 featuretools 会自动推断实体中每一列的数据类型,但我们可以通过将列类型字典传递给参数来覆盖它​​variable_types​​。

对于这个数据帧,即使​​missed​​是一个整数,它也不是一个数字变量,因为它只能取 2 个离散值,所以我们告诉 featuretools 将 is 视为分类变量。将数据帧添加到实体集后,我们检查其中的任何一个:

featuretools完全指南-可自动构造机器学习特征的Python库_机器学习_06

列类型已通过我们指定的修改正确推断。接下来,我们需要指定实体集中的表是如何关联的。


表关系

考虑两个表之间关系的最佳方式是将parent 类比为 child。这是一对多的关系:每个父母可以有多个孩子。在表的领域中,一个父表对每个父表有一行,但子表可能有多行对应同一个父表的多个子表。

例如,在我们的数据集中,​​clients​​​数据框是数据框的父级​​loans​​​。每个客户端只有一行 in ,​​clients​​​但可能有多行 in ​​loans​​​。同样,​​loans​​​是 的父级,​​payments​​因为每笔贷款都会有多次付款。父母通过共享变量链接到他们的孩子。当我们执行聚合时,我们按父变量对子表进行分组,并计算每个父项的子项的统计数据。

要在 featuretools 中形式化关系,我们只需要指定将两个表链接在一起的变量。所述​​clients​​​和​​loans​​​表经由链接​​client_id​​​变量和​​loans​​​与​​payments​​​与被链接​​loan_id​​。创建关系并将其添加到实体集的语法如下所示:

featuretools完全指南-可自动构造机器学习特征的Python库_机器学习_07

实体集现在包含三个实体(表)以及将这些实体链接在一起的关系。添加实体和形式化关系后,我们的实体集就完成了,我们准备制作特征。


特征原语

在我们完全进行深度特征合成之前,我们需要了解特征原语。我们已经知道这些是什么,但我们只是用不同的名字来称呼它们!这些只是我们用来形成新特征的基本操作:

  • 聚合:跨父子(一对多)关系完成的操作,该关系按父项分组并计算子项的统计信息。一个例子是按 对​​loan​​表进行分组​​client_id​​并找到每个客户的最大贷款金额。
  • 转换:在单个表上对一列或多列进行的操作。一个例子是取一个表中两列之间的差异或取一列的绝对值。

使用这些基元本身或堆叠多个基元在特征工具中创建新特征。下面是 featuretools 中的一些特征基元的列表(我们也可以定义自定义基元):

featuretools完全指南-可自动构造机器学习特征的Python库_机器学习_08


特征原语

这些基元可以单独使用或组合使用以创建特征。为了使用指定的原语制作特征,我们使用该​​ft.dfs​​​函数(代表深度特征合成)。我们传入​​entityset​​​, the ​​target_entity​​​, 这是我们要添加特征的表,选定的​​trans_primitives​​​(转换)和​​agg_primitives​​(聚合):

结果是每个客户端的新功能数据框(因为我们让客户端成为​​target_entity​​)。例如,我们有每个客户加入的月份,这是一个转换特征原语:

featuretools完全指南-可自动构造机器学习特征的Python库_机器学习_09

我们还有许多聚合原语,例如每个客户的平均支付金额:

featuretools完全指南-可自动构造机器学习特征的Python库_featuretools_10

尽管我们只指定了几个特征基元,特征工具通过组合和堆叠这些基元创建了许多新特征。

featuretools完全指南-可自动构造机器学习特征的Python库_机器学习_11

完整的数据框有 793 列新功能!


深度特征合成

我们现在已经准备好理解深度特征合成 (dfs) 的所有部分。其实我们在之前的函数调用中已经进行了dfs!深度特征只是由多个基元堆叠而成的特征,而 dfs 是制造这些特征的过程的名称。深度特征的深度是制作该特征所需的图元数量。

例如,该​​MEAN(payments.payment_amount)​​​ 列是深度为 1 的深度特征,因为它是使用单个聚合创建的。深度为 2 的特征是​​LAST(loans(MEAN(payments.payment_amount))​​ 通过堆叠两个聚合来实现的:LAST(最近的)在 MEAN 之上。这代表了每个客户最近一次贷款的平均支付金额。

featuretools完全指南-可自动构造机器学习特征的Python库_featuretools_12

我们可以将特征堆叠到我们想要的任何深度,但在实践中,我从未超过 2 的深度。在此之后,特征很难解释,但我鼓励任何有兴趣的人尝试“更深入”。我们不必手动指定特征基元,而是可以让特征工具自动为我们选择特征。为此,我们使用相同的ft.dfs函数调用,但不传入任何功能原语:

Featuretools 已经构建了许多新功能供我们使用。虽然这个过程会自动创建新功能,但它不会取代数据科学家,因为我们仍然需要弄清楚如何处理所有这些功能。例如,如果我们的目标是预测客户是否会偿还贷款,我们可以寻找与指定结果最相关的特征。此外,如果我们有领域知识,我们可以使用它来选择特定的特征基元或用候选特征进行深度特征合成。

下一步

自动化特征工程解决了一个问题,但带来了另一个问题:特征太多。尽管在拟合模型之前很难说这些特征中的哪些是重要的,但可能并非所有特征都与我们想要训练模型的任务相关。此外,拥有太多特征会导致模型性能不佳,因为不太有用的特征会淹没那些更重要的特征。

特征过多的问题被称为维度灾难。随着特征数量的增加(数据维度的增长),模型学习特征和目标之间的映射变得越来越困难。事实上,模型运行良好所需的数据量与特征数量呈指数关系。

维数灾难与特征减少(也称为特征选择):去除不相关特征的过程相抗衡。这可以采用多种形式:主成分分析 (PCA)、SelectKBest、使用模型中的特征重要性或使用深度神经网络进行自动编码。然而,特征减少是另一篇文章的不同主题。现在,我们知道我们可以使用 featuretools 以最少的努力从许多表中创建许多特征!

结论

与机器学习中的许多主题一样,使用 featuretools 进行自动化特征工程是一个基于简单想法的复杂概念。使用实体集、实体和关系的概念,特征工具可以执行深度特征合成以创建新特征。深度特征合成依次堆叠特征原语——聚合,它们在表之间的一对多关系中起作用,转换、应用于单个表中的一个或多个列的函数——以从多个表构建新特征。

在以后的文章中,我将展示如何在现实世界中使用这种技术,即目前在 Kaggle 上举办的Home Credit Default Risk 竞赛。请继续关注该帖子,同时,阅读此介绍以开始比赛!我希望您现在可以使用自动化特征工程作为数据科学管道的辅助工具。我们的模型与我们提供的数据一样好,自动化特征工程有助于使特征创建过程更加高效。

有关 featuretools 的更多信息,包括高级用法,请查看在线文档。要了解如何在实践中使用 featuretools,请阅读开源库背后的公司Feature Labs的工作。

欢迎关注​​​​作者主页​​,学习更多相关内容

featuretools完全指南-可自动构造机器学习特征的Python库_机器学习_13