首页
/ FeatureTools 中的 EntitySet 使用指南:构建高效的特征工程数据结构

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"
    ],
)

这个方法会自动完成以下操作:

  1. 基于session_id创建新表
  2. 将指定的列移动到新表中
  3. 自动建立两表之间的关系
  4. 为新表创建时间索引

查看数据结构

我们可以随时查看EntitySet的结构:

es

这会显示当前包含的所有表及其关系,帮助我们验证数据结构是否正确。

使用EntitySet进行特征工程

构建好EntitySet后,我们可以直接用它来进行深度特征合成(DFS):

feature_matrix, feature_defs = ft.dfs(
    entityset=es,
    target_dataframe_name="products"
)

生成的feature_matrix包含了基于整个数据关系网络自动生成的特征。

最佳实践建议

  1. 合理设计表结构:在添加表前,先规划好各表之间的关系
  2. 正确设置索引:确保每个表都有合适的index和time_index
  3. 明确逻辑类型:特别是分类变量,需要显式指定为Categorical类型
  4. 逐步验证:每添加一个表或关系后,检查EntitySet结构
  5. 利用规范化:对于冗余数据,使用normalize_dataframe进行优化

通过合理使用EntitySet,我们能够将复杂的多表数据关系清晰地组织起来,为后续的特征工程打下坚实基础。这种结构化的数据处理方式特别适合具有层次关系的业务数据,如电商交易、用户行为分析等场景。