FeatureTools 中的 EntitySet 使用指南:构建高效的特征工程数据结构
2025-07-07 03:49:36作者:冯爽妲Honey
什么是 EntitySet?
在 FeatureTools 中,EntitySet 是一个核心数据结构,它由多个数据表(dataframes)和它们之间的关系组成。EntitySet 为结构化数据提供了清晰的表示方式,是进行自动化特征工程的基础框架。理解并掌握 EntitySet 的使用,能够帮助数据科学家更高效地处理复杂的多表数据关系。
为什么需要 EntitySet?
在实际业务场景中,数据往往分散在多个相关联的表中。例如,在客户交易分析中,我们可能有:
- 交易记录表
- 产品信息表
- 客户会话表
- 客户信息表
EntitySet 将这些表及其关系组织在一起,为后续的特征工程提供了统一的数据视图。
创建 EntitySet 的完整流程
1. 初始化 EntitySet
首先创建一个空的 EntitySet 对象:
import featuretools as ft
es = ft.EntitySet(id="customer_data")
2. 添加数据表
添加交易数据表时,我们需要指定几个关键参数:
from woodwork.logical_types import Categorical, PostalCode
es = es.add_dataframe(
dataframe_name="transactions",
dataframe=transactions_df,
index="transaction_id", # 唯一标识每行的列
time_index="transaction_time", # 时间索引列
logical_types={
"product_id": Categorical, # 指定product_id为分类类型
"zip_code": PostalCode, # 指定邮政编码类型
},
)
关键参数说明:
index
: 指定唯一标识行的列time_index
: 指定时间相关列,这对时间相关特征生成很重要logical_types
: 指定列的逻辑类型,影响特征生成方式
3. 添加产品表
es = es.add_dataframe(
dataframe_name="products",
dataframe=products_df,
index="product_id"
)
4. 建立表间关系
在交易表和产品表之间建立一对多关系:
es = es.add_relationship(
parent_dataframe_name="products", # 父表(一的一方)
parent_column_name="product_id", # 父表关联列
child_dataframe_name="transactions", # 子表(多的一方)
child_column_name="product_id" # 子表关联列
)
数据规范化:从现有表创建新表
在实际数据处理中,我们经常需要将宽表拆分为多个规范化的表。FeatureTools 提供了normalize_dataframe
方法来实现这一过程:
es = es.normalize_dataframe(
base_dataframe_name="transactions",
new_dataframe_name="sessions",
index="session_id",
make_time_index="session_start",
additional_columns=[
"device", "customer_id",
"zip_code", "session_start",
"join_date"
],
)
这个方法会自动完成以下操作:
- 基于session_id创建新表
- 将指定的列移动到新表中
- 自动建立两表之间的关系
- 为新表创建时间索引
查看数据结构
我们可以随时查看EntitySet的结构:
es
这会显示当前包含的所有表及其关系,帮助我们验证数据结构是否正确。
使用EntitySet进行特征工程
构建好EntitySet后,我们可以直接用它来进行深度特征合成(DFS):
feature_matrix, feature_defs = ft.dfs(
entityset=es,
target_dataframe_name="products"
)
生成的feature_matrix包含了基于整个数据关系网络自动生成的特征。
最佳实践建议
- 合理设计表结构:在添加表前,先规划好各表之间的关系
- 正确设置索引:确保每个表都有合适的index和time_index
- 明确逻辑类型:特别是分类变量,需要显式指定为Categorical类型
- 逐步验证:每添加一个表或关系后,检查EntitySet结构
- 利用规范化:对于冗余数据,使用normalize_dataframe进行优化
通过合理使用EntitySet,我们能够将复杂的多表数据关系清晰地组织起来,为后续的特征工程打下坚实基础。这种结构化的数据处理方式特别适合具有层次关系的业务数据,如电商交易、用户行为分析等场景。