Featuretools是执行自动化特征工程的框架。
Featuretools是由Feature Labs公布的开源项目。它擅长于将时间和关系数据集转换为机器学习的特征矩阵。
python -m pip install featuretools
conda install -c conda-forge featuretools
从github上clone下载项目:
git clone https://github.com/featuretools/featuretools.git
cd featuretools
python setup.py install
Update checker - 接受Featuretools自动更新的提醒
python -m pip install featuretools[update_checker]
TSFresh Primitives - 在Featuretools使用来自TSFresh的60+个特征
python -m pip install featuretools[tsfresh]
注:TSFresh是开源的提取时序数据特征的python包,能够提取出超过60种特征,特征包括时间和,序列变化等
Featuretools是用了DFS来专门处理时间和关系数据集,核心是DFS,下面通过带时间戳的客户事务的示例来分析这个过程。
处理的是关系数据集,它包括实体集(EntitySet)和关系(Relationship)。
实体集(EntitySet):是实体的集合,在FeatureTools一个关系表称为一个实体。
关系:在FeatureTools只描述一对多的关系,一所在的实体为父实体,多所在的实体为子实体,一个父亲可以有多个孩子。例如一个客户可以拥有多个会话,那么客户表就是会话表的父表。关系表示由子实体指向父实体。
下面以带时间戳的客户事务组成的关系数据集为例:
In [1]: import featuretools as ft
In [2]: es = ft.demo.load_mock_customer(return_entityset=True)
In [3]: es
Out[3]:
Entityset: transactions #实体集,数据集是关于客户事务的
Entities: #实体,即四张表,包含实体名称及其表的行和列
transactions [Rows: 500, Columns: 5] #会话的事件列表
products [Rows: 5, Columns: 2] #产品及其关联属性,主键为product_id
sessions [Rows: 35, Columns: 4] #会话及其关联属性,主键为session_id
customers [Rows: 5, Columns: 4] #客户及其关联属性,主键为customer_id
Relationships: #关系,一对多,子->父
transactions.product_id -> products.product_id
transactions.session_id -> sessions.session_id
sessions.customer_id -> customers.customer_id
注:主键为能唯一地标识表中的每一行的一个列或者多列的组合,通过它可强制表的实体完整性。
如果没有自动化的特性工程,数据科学家会编写代码来为客户聚合数据,并应用不同的统计功能(add,average,sum...)来量化客户的行为,工作量巨大。而DFS(深度特征合成)能够自动化这个过程,通过叠加聚合和转换操作来生成不同的深度特征让数据科学家更加直观地了解各种数据并加以选取,大大节省了数据科学家的时间。
DFS有三个关键概念:
注:翻译自Feature Labs。
Primitives
DFS能对关系数据集进行各种数学运算并产生我们需要的新表,但是该如何操作才能使得新表的主键及其属性(特征)是我们所需的呢?为此,FeatureTools的dfs函数使用了特征原语(Feature primitives)。
原语(primitives)定义了可应用于原始数据集以产生新Features的计算或操作(count,sum等),它只约束输入和输出数据类型,因此可以跨数据集应用。FeatureTools使用了两种类型的原语(Primitive):
示例
In [4]: feature_matrix, feature_defs = ft.dfs(entityset=es,
...: target_entity="customers",
...: agg_primitives=["count"],
...: trans_primitives=["month"])
...:
In [5]: feature_matrix
Out[5]:
zip_code COUNT(sessions) MONTH(join_date) MONTH(date_of_birth)
customer_id
5 60091 6 7 7
4 60091 8 4 8
1 60091 8 4 7
3 13244 6 8 11
2 13244 7 4 8
FeatureTools的dfs函数定义了:
当数据科学家想要对时间数据进行特征工程的时候,选取哪一时间段的数据用于计算至关重要。Featuretools 标注了时间索引的实体提供了截取(cutoff) 操作,从而使得它能在计算之前自动地过滤在在设定的截取时间以后的数据。
接下来解释一下时间索引(time index) 和 截取时间(cutoff time)
时间索引(time index):表示表中一行被知道或者发生的时间。例如,对于session表,那么session发生的时间即为它的时间索引,能够用于特征合成。而对于客户表,它可能含有生日以及加入的日期(join date),那么加入日期是时间索引,因为它表示了客户首次在数据集中可用的时间。
截取时间(cutoff time):指定行数据可用于特征计算的最后一个时间点。在此时间点之后的任何数据都将在特征计算或者操作之前过滤掉。
注:时间索引在截取时间后面的行将自动忽略。
示例
预测客户1, 2, 3 在 2014-1-1 04:00 以后会不会做某事,用参数cutoff_time过滤 2014-1-1 04:00以后的数据,同时我们还能设置要使用到截取时间前多长时间内的数据,即时间窗,参数为training_window,以两小时为例:
In [5]: fm, features = ft.dfs(entityset=es,
...: target_entity='customers',
...: cutoff_time=pd.Timestamp("2014-1-1 04:00"),
...: instance_ids=[1,2,3],
...: cutoff_time_in_index=True,
training_window="2 hour")
有些数据不仅涉及到时间点,还涉及到时间段。比如一个session能涉及到多个事务,而每个事务的发生时间不一样,有时候session的start time在时间窗之前,但是涉及的事务有在时间窗的。因此Featuretools提供了EntitySet.add_last_time_indexes() 让session表增加了最后发生时间的特征。从而能够找到了在时间窗内所有有关的实体。
Open for comments and suggestions!
鹏城实验室人工智能中心
Deep feature synthesis: Towards automating data science endeavors.