原副标题:天然资源 | Feature Tools:可手动内部结构电脑学习特点的Python库
LizierTowards data science
译者:William Koehrsen
电脑之心校对
参予:张倩、路
现阶段,许多电脑学习工程建设项目的数学模型优先选择已经开始转为手动化,而特点工程建设依然主要就以育苗居多。那个操作过程的必要性可能将比数学模型优先选择更关键,育苗获得的特点总暗含很大的不足之处。在责任编辑中译者将为他们如是说怎样采用 Feature Tools Python 库同时实现特点工程建设手动化,工程建设项目已开放源码。
工程建设项目门牌号:https://docs.featuretools.com/
标识符门牌号:https://github.com/WillKoehrsen/automated-feature-engineering/blob/master/walk_through/Automated_Feature_Engineering.ipynb
电脑学习愈来愈数处从育苗结构设计数学模型转为采用 H20、TPOT 和 auto-sklearn 等辅助工具手动强化的辅助工具。那些库和随机搜索(参看《Random Search for Hyper-Parameter Optimization》)等方式意在透过找寻相匹配统计数据集的最优数学模型来简化数学模型优先选择和电脑学习调优操作过程,而几乎不需要任何人工干预。然而,特点工程建设作为电脑学习流程中可能将最有价值的一个方面,几乎完全是育苗的。
特点工程建设也被称为特点内部结构,是从现有统计数据中内部结构新的特点从而训练电脑学习数学模型的操作过程。这一步可能将比实际上采用的数学模型更关键,因为一个电脑学习算法只能从他们给定的统计数据中学习,所以内部结构一个和任务相关的特点是至关关键的,参看优质论文《A Few Useful Things to Know about Machine Learning》。
通常,特点工程建设是一个冗长的育苗操作过程,依赖于领域知识、直觉和统计数据操作。那个操作过程可能将是极其枯燥的,同时最终获得的特点将会受到人的主观性和时间的限制。特点工程建设手动化意在透过从统计数据集中手动内部结构候选特点,并从中优先选择最优特点用于训练来帮助统计数据科学家。
真实世界统计数据的例子)。责任编辑完整标识符可在 Github 上找到。
特点工程建设基本概念
特点工程建设意味着从现有的统计数据中内部结构额外特点,那些特点通常分布在多张相关的表中。特点工程建设需要从统计数据中提取相关信息并将其存入单张表格中,然后被用来训练电脑学习数学模型。
内部结构特点是一个非常耗时的操作过程,因为每个新的特点通常需要几步才能内部结构,特别是当采用多张表的信息时。他们可以将特点内部结构的操作分为两类:「转换」和「聚合」。以下透过几个例子来看看那些概念的实际应用。
透过从一或多列中内部结构新的特点,「转换」作用于单张表(在 Python 中,表是一个 Pandas DataFrame)。举个例子,若有如下的客户表:
他们可以透过查找 joined 列中的月份或是自然对数化 income 列的统计数据来内部结构新的特点。那些都是转换操作,因为它们只用到了一张表的信息。
另一方面,「聚合」是跨表同时实现的,并采用一对多的关联来对观测值分组,然后计算统计量。例如,若他们有另外一张包含客户贷款信息的表格,其中每个客户可能将有多项贷款,他们便可以计算每个客户贷款的平均值、最大值和最小值等统计量。
那个操作过程包括根据不同客户对贷款表进行分组并计算聚合后的统计量,然后将结果整合到客户统计数据中。以下是他们在 Python 中采用 Pandas 库执行此操作。
import pandas aspd
# Group loans by client id and calculate mean, max, minofloans
stats = loans.groupby(client_id)[loan_amount].agg([mean, max, min])
stats.columns = [mean_loan_amount, max_loan_amount, min_loan_amount]
# Merge withthe clients dataframe
stats = clients.merge(stats, left_on =client_id, right_index=True, how = left)
stats.head(10)
那些操作本身并不困难,但是如果有数百个变量分布在数十张表中,那个操作过程将无法透过育苗完成。理想情况下,他们希望有一个解决方案能够在不同表间手动执行转换和聚合操作,并将结果整合到一张表中。尽管 Pandas 是一个很好的天然资源,但是依然有许多统计数据操作需要他们育苗完成!有关育苗特点工程建设的更多信息,请查阅《Python Data Science Handbook》。
特点辅助工具
幸运的是,Feature Tools 正是他们正在找寻的解决方案。那个开放源码的 Python 库可以从一组相关的表中手动内部结构特点。特点辅助工具基于名为「深度特点合成」的方式(参看《Deep Feature Synthesis: Towards Automating Data Science Endeavors》),那个方式的名字听起来比其本身更高大上(那个名字源于叠加了多重特点,而不是因为采用了深度学习方式!)。
深度特点合成叠加多个转换和聚合操作,这在特点辅助工具的词库中被称为特点基元,以便透过分布在多张表内的统计数据来内部结构新的特点。与电脑学习中的大多数方式一样,这是建立在简单概念基础之上的复杂方式。透过一次学习一个内部结构块,他们可以很好地理解那个强大的方式。
首先,让他们看一下示例统计数据。他们已经看到了上面的一些统计数据集,并且完整的表组如下所示:
clients: 关于信用社客户的基本信息。每个客户只对应统计数据框中的一行。
loans: 向用户提供的贷款。每项贷款只对应统计数据框中的一行,但是客户可能将有多项贷款。
payments:贷款还本的支付。每笔支付只对应一行,但是每项贷款可以有多笔支付。
如果他们有一个电脑学习任务,例如预测客户未来是否会偿还一项贷款,他们希望将所有关于客户的信息整合到一张表中。那些表是相关的(透过 client_id 和 loan_id 变量),并且他们可以透过一系列转换和聚合操作来育苗同时实现那个操作过程。然而,他们很快就可以采用特点辅助工具来手动同时实现那个操作过程。
实体和实体集
特点辅助工具的前两个概念的是「实体」和「实体集」。一个实体就是一张表(或是 Pandas 中的一个 DataFrame(统计数据框))。一个实体集是一组表和它们之间的关联。将一个实体集看成另一种 Python 统计数据结构,并暗含自己的方式和属性。
他们可以透过以下操作在特点辅助工具中创建一个空的实体集:
import featuretools asft
# Create newentityset
es = ft.EntitySet(id = clients)
现在他们需要整合两个实体。每个实体都必须暗含一个索引,它是一个包含所有唯一元素的列。就是说,索引中的每个值只能在表中出现一次。在 clients 统计数据框中的索引是 client_id,因为每个客户在该统计数据框中只对应一行。他们采用以下语法将一个暗含索引的实体添加一个实体集中:
# Create an entity fromthe client dataframe
# This dataframe already has an index and a time index
es = es.entity_from_dataframe(entity_id =clients, dataframe = clients,
index = client_id, time_index = joined)
loans 统计数据框还有另外一个唯一的索引,loan_id,同时将其添加到实体集的语法与 clients 一样。然而,payments 统计数据框不存在唯一索引。当他们把 payments 统计数据框添加到实体集中时,他们需要传入参数 make_index = True,同时指定索引的名字。另外,尽管特点辅助工具能手动推断实体中每列的统计数据类型,但是他们可以透过将列统计数据类型的字典传递给参数 variable_types 来覆盖它。
# Create an entity fromthe payments dataframe
# This does not yet have a unique index
es = es.entity_from_dataframe(entity_id =payments,
dataframe = payments,
variable_types = {missed: ft.variable_types.Categorical},
make_index = True,
index = payment_id,
time_index = payment_date)
对于此统计数据框,尽管 missed 是一个整数,但是它不是一个数值变量,因为它只能取 2 个离散的数值,所以在特点辅助工具中,将其看成一个分类变量。在将该统计数据框添加到实体集中后,他们检查整个实体集:
列的统计数据类型已根据他们指定的修正方案被正确推断出来。接下来,他们需要指定实体集中表是怎样关联的。
表的关联
考虑两张表之间「关联」的最好方式是类比父子之间的关联。这是一种一对多的关联:每个父亲可以有多个儿子。对表来说,每个父亲对应一张父表中的一行,但是子表中可能将有多行对应于同一张父表中的多个儿子。
例如,在他们的统计数据集中,clients 统计数据框是 loans 统计数据框的一张父表。每个客户只对应 clients 表中的一行,但是可能将对应 loans 表中的多行。同样,loans 表是 payments 表的一张父表,因为每项贷款可以有多项支付。父亲透过共享变量与儿子相关联。当他们执行聚合操作的时候,他们根据父变量对子表进行分组,并计算每个父亲的儿子的统计量。
为了形式化特点辅助工具中的关联规则,他们仅需指定连接两张表的变量。clients 表和 loans 表透过 client_id 变量连接,同时 loans 表和 payments 表透过 loan_id 变量连接。创建关联并将其添加到实体集中的语法如下所示:
# Relationship between clients and previous loans
r_client_previous = ft.Relationship(es[clients][client_id],
es[loans][client_id])
# Add the relationship to the entity set
es = es.add_relationship(r_client_previous)
# Relationship between previous loans and previous payments
r_payments = ft.Relationship(es[loans][loan_id],
es[payments][loan_id])
# Add the relationship to the entity set
es = es.add_relationship(r_payments)
es
该实体集现在包含三个实体(表),和将那些表连接在一起的关联规则。在添加实体和形式化关联规则之后,实体集就完整了并准备好从中内部结构新的特点。
特点基元
在他们深入了解深度特点合成之前,他们需要了解特点基元的概念。他们其实早就知道是什么了,只是他们刚刚用不同的名字来称呼它们!它们只是他们用来内部结构新特点的操作:
聚合:根据父与子(一对多)的关联完成的操作,也就是根据父亲分组并计算儿子的统计量。一个例子就是根据 client_id 对 loan 表分组并找到每个客户的最大贷款额。
转换:对一张表中一或多列完成的操作。一个例子就是取一张表中两列之间的差值或者取一列的绝对值。
在特点辅助工具中单独采用那些基元或者叠加采用那些基元可以内部结构新的特点。以下是特点辅助工具中一些特点基元的列表,也可以自定义特点基元。
特点基元
那些基元可以单独采用或是组合采用以内部结构新的特点。为了采用特定的基元内部结构新的特点,他们采用 ft.dfs 函数(代表深度特点合成)。他们传入 entityset 和 target_entity,这是他们想要在其中添加特点的表,被选参数 trans_primitives(转换)和 agg_primitives(聚合)。
public class MyActivity extends AppCompatActivity{
@Override //override the function protected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
try{
OkhttpManager.getInstance().setTrustrCertificates(getAssets().open(“mycer.cer”);
OkHttpClient mOkhttpClient= OkhttpManager.getInstance().build();
} catch(IOException e) {
e.printStackTrace();
}
}
返回的是包含每个客户新特点的统计数据框(因为他们定义客户为 target_entity)。比如他们有每个客户加入的月份,这是一个转换操作的特点基元:
他们也有许多聚合操作的基元,比如每个客户的平均支付总额:
尽管他们仅指定了一些特点基元,但是特点辅助工具可以透过组合和叠加那些基元来内部结构新的特点。
完整的统计数据框包含 793 列的新特点!
深度特点合成
他们现在具备理解深度特点合成(dfs)的一切条件。事实上,他们已经在前面的函数调用中执行了 dfs!深度特点只是叠加多个基元内部结构的一个特点,而 dfs 只是内部结构那些特点的操作过程的名称。深度特点的深度是内部结构那个特点所需的基元数量。
例如,MEAN(payments.payment_amount)列是深度为 1 的特点,因为它是采用单个聚合操作内部结构的。LAST(loans(MEAN(payments.payment_amount))是一个深度为 2 的特点,它是由两个叠加的聚合操作内部结构的:MEAN 列之上的 LAST(最近的)列。这表示每个客户最近的贷款平均支付额。
他们可以叠加任意深度的特点,但在实践中,我从没有采用超过 2 个深度的特点。此外,那些特点很难解释,但是我鼓励任何对「深入」感兴趣的人。
他们不必育苗指定特点基元,但可以让特点辅助工具手动为他们选取特点。为此,他们采用相同的 ft.dfs 函数调用,但是不传入任何特点基元。
# Perform deep feature synthesis without specifying primitives
features, feature_names = ft.dfs(entityset=es, target_entity=clients,
max_depth = 2)
features.head()
特点辅助工具内部结构了许多特点供他们采用。尽管那个操作过程确实能手动内部结构新的特点,但是它不会取代统计数据科学家,因为他们依然需要弄清楚怎样处理那些特点。例如,他们的目的是预测一位客户是否会偿还贷款,他们可以找寻与特定结果最相关的特点。此外,如果他们具有领域知识,他们可以用那些知识来优先选择指定的特点基元或候选特点的种子深度特点合成。
下一步
特点工程建设手动化解决了一个问题,但是带来了另一个问题:特点太多了。尽管在拟合一个数学模型之前很难说哪些特点是关键的,但很可能将不是所有那些特点都与他们想要训练的数学模型的任务相关。此外,拥有太多特点(参看《Irrelevant Features and the Subset Selection Problem》)可能将会导致数学模型性能不佳,因为较无益的特点会淹没那些更关键的特点。
特点过多问题以维度灾难著称。随着特点数量的上升(统计数据维度增长),数学模型愈来愈难以学习特点与目标之间的映射关系。事实上,让数学模型表现良好所需的统计数据量与特点数量成指数关系。
维度灾难与特点降维(也叫特点优先选择,去除不相关特点的操作过程)相对。这可以采用多种形式:主成分分析(PCA)、SelectKBest、采用数学模型中特点的必要性或采用深度神经网络进行自编码。但是,特点降维是另一篇文章的不同主题。到现阶段为止,他们知道他们可以采用特点辅助工具以最小的努力从许多表中内部结构大量的特点!
结论
与电脑学习中的许多主题一样,采用特点辅助工具进行特点工程建设手动化是一个基于简单想法的复杂概念。采用实体集、实体和关联的概念,特点辅助工具可以执行深度特点合成操作来内部结构新的特点。深度特点合成可以依次叠加特点基元:「聚合」,它们在多张表间的一对多关联中起作用,和「转换」,是应用于单张表中一或多列以从多张表中内部结构新的特点的函数。
在之后的文章中,我将如是说怎样在现实世界的问题上采用这项技术,即在 Kttps://towardsdatascience.com/machine-learning-kaggle-competition-part-one-getting-started-32fb9ff47426)! 我希望你们可以采用特点工程建设手动化作为统计数据科学工作中的辅助辅助工具。他们的数学模型与他们提供的统计数据一样好,并且特点工程建设手动化可以使特点内部结构的操作过程更高效。
有关特点辅助工具更多的信息,包括高级用法,请查看在线文档(https://docs.featuretools.com/)。要了解在实践中怎样采用特点辅助工具,请阅读开放源码库的开发公司 Feature Labs 的工作(https://www.featurelabs.com/)。
原文链接:https://towardsdatascience.com/automated-feature-engineering-in-python-99baf11cc219
本文为电脑之心校对,。
✄————————————————
加入电脑之心(全职记者 / 实习生):[email protected]
投稿或寻求报道:content@jiqizhixin.com
广告 & 商务合作:[email protected]