Featuretools实战:使用EntitySets构建结构化数据集

Featuretools实战:使用EntitySets构建结构化数据集

featuretools featuretools 项目地址: https://gitcode.com/gh_mirrors/fea/featuretools

什么是EntitySet?

在Featuretools中,EntitySet是一个核心概念,它代表了一组数据表(dataframes)及其之间的关系。EntitySet为结构化数据集提供了统一的容器,特别适合用于特征工程的准备工作。通过EntitySet,我们可以清晰地表达数据中的层次结构和关联关系,为后续的自动化特征生成打下基础。

为什么需要EntitySet?

在实际项目中,原始数据往往分散在多个关联表中。例如,在客户交易场景中,我们可能有:

  • 交易记录表
  • 产品信息表
  • 客户信息表
  • 会话记录表

这些表通过外键相互关联。EntitySet帮助我们:

  1. 清晰地表达这些表之间的关系
  2. 维护数据完整性
  3. 为自动化特征工程提供结构化输入

实战:构建客户交易EntitySet

1. 准备原始数据

我们首先加载示例数据,这是一个模拟的客户交易数据集:

import featuretools as ft

# 加载模拟数据
data = ft.demo.load_mock_customer()

# 合并交易、会话和客户数据
transactions_df = data["transactions"].merge(data["sessions"]).merge(data["customers"])

# 产品数据
products_df = data["products"]

2. 创建EntitySet并添加数据表

初始化一个EntitySet对象:

es = ft.EntitySet(id="customer_data")

添加交易表时,我们需要指定几个关键参数:

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,  # 指定为分类类型
        "zip_code": PostalCode,     # 指定为邮编类型
    },
)

参数说明:

  • index: 指定唯一标识每行的列
  • time_index: 指定时间相关的列,用于时间序列分析
  • logical_types: 指定列的逻辑类型,影响特征生成方式

3. 添加产品表并建立关系

es = es.add_dataframe(
    dataframe_name="products", 
    dataframe=products_df, 
    index="product_id"
)

# 建立产品与交易之间的关系
es = es.add_relationship(
    parent_dataframe_name="products",
    parent_column_name="product_id",
    child_dataframe_name="transactions",
    child_column_name="product_id"
)

关系建立后,Featuretools就能理解"一个产品对应多笔交易"的业务逻辑。

4. 数据规范化

原始数据中,会话信息被冗余存储在每笔交易记录中。我们可以通过规范化来优化数据结构:

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. 创建新的sessions表
  2. 从transactions表中移除冗余列
  3. 建立transactions和sessions之间的关系

5. 继续规范化客户信息

es = es.normalize_dataframe(
    base_dataframe_name="sessions",
    new_dataframe_name="customers",
    index="customer_id",
    make_time_index="join_date",
    additional_columns=["zip_code", "join_date"],
)

现在,我们得到了一个结构清晰的EntitySet,包含:

  • transactions表(交易记录)
  • products表(产品信息)
  • sessions表(会话信息)
  • customers表(客户信息)

使用EntitySet进行特征工程

有了结构化的EntitySet,我们就可以轻松地进行深度特征生成了:

feature_matrix, feature_defs = ft.dfs(
    entityset=es,
    target_dataframe_name="products"  # 以产品表为目标生成特征
)

feature_matrix.head()

DFS(Deep Feature Synthesis)算法会自动遍历EntitySet中的所有关系,为每个产品生成丰富的特征,包括:

  • 产品自身的属性
  • 相关交易的数量统计特征
  • 时间窗口内的聚合特征
  • 跨表的复杂特征

最佳实践建议

  1. 合理设计索引:确保每个表都有合适的索引列,这对性能至关重要
  2. 明确时间索引:时间相关的分析需要正确设置time_index
  3. 规范数据类型:使用logical_types准确表达列的业务含义
  4. 适度规范化:平衡规范化和查询效率,避免过度规范化
  5. 可视化检查:使用es.plot()可视化EntitySet结构,确保关系正确

通过EntitySet,Featuretools能够理解数据的语义关系,从而生成更有业务意义的特征。这种结构化表示方法大大简化了特征工程的复杂度,特别是在处理多表关联数据时优势明显。

featuretools featuretools 项目地址: https://gitcode.com/gh_mirrors/fea/featuretools

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缪阔孝Ruler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值