简述事务的概念与事务的特征_特征工程工具总结(5)——Featuretools

Featuretools是执行自动化特征工程的框架。

简述事务的概念与事务的特征_特征工程工具总结(5)——Featuretools_第1张图片

Featuretools是由Feature Labs公布的开源项目。它擅长于将时间和关系数据集转换为机器学习的特征矩阵。

安装

pip安装

python -m pip install featuretools

Conda安装

conda install -c conda-forge featuretools

github安装

从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
    注:主键为能唯一地标识表中的每一行的一个列或者多列的组合,通过它可强制表的实体完整性。

DFS(Deep Feature Synthesis)

如果没有自动化的特性工程,数据科学家会编写代码来为客户聚合数据,并应用不同的统计功能(add,average,sum...)来量化客户的行为,工作量巨大。而DFS(深度特征合成)能够自动化这个过程,通过叠加聚合和转换操作来生成不同的深度特征让数据科学家更加直观地了解各种数据并加以选取,大大节省了数据科学家的时间。

DFS有三个关键概念:

  • 特征源于数据集中数据点之间的关系。
  • 对数据库或日志文件中常见的多表和事务数据集进行特征工程,这是因为这种数据格式是公司记录客户数据最常见的类型。
  • 在数据集中,许多特性都是通过使用类似的数学运算得到的。比如我们衡量一个客户的最大购买力需要对他所有的购买金额使用max操作,同样衡量一趟航班的最长延误时间。

注:翻译自Feature Labs。

Primitives

DFS能对关系数据集进行各种数学运算并产生我们需要的新表,但是该如何操作才能使得新表的主键及其属性(特征)是我们所需的呢?为此,FeatureTools的dfs函数使用了特征原语(Feature primitives)

原语(primitives)定义了可应用于原始数据集以产生新Features的计算或操作(count,sum等),它只约束输入和输出数据类型,因此可以跨数据集应用。FeatureTools使用了两种类型的原语(Primitive)

  • Aggregation primitives:聚合操作。应用于实体集的父子关系中。例如 “count”, “sum”, “avg_time_between”,需要聚合父子表的特征。以下面的示例为例子,count首先找到客户表(target entity)的客户id,然后根据数据中的关系找到它的子表session,然后计算子表同一客户id的session有多少个,从而生成新的特征。
  • Transform primitives:转换操作。将一个实体的一个或多个变量作为输入,并为该实体输出一个新变量,应用于单个实体,例如:“hour”、“time_since_precious”、“absolute”。同样以下面的例子为例,对于客户表中,只要涉及到有月份的特征,都将它的月份提取出来形成新的特征,新特征是从原表中产生的。

示例

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函数定义了:

  • 处理的数据集对象:entityset
  • 生成新表的主键的来源target_entity
  • Aggregation primitives、Transform primitives

处理时间

当数据科学家想要对时间数据进行特征工程的时候,选取哪一时间段的数据用于计算至关重要。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!

[email protected]

鹏城实验室人工智能中心

Reference

Deep feature synthesis: Towards automating data science endeavors.

你可能感兴趣的:(简述事务的概念与事务的特征)