Featuretools实战:使用EntitySets构建结构化数据集
featuretools 项目地址: https://gitcode.com/gh_mirrors/fea/featuretools
什么是EntitySet?
在Featuretools中,EntitySet是一个核心概念,它代表了一组数据表(dataframes)及其之间的关系。EntitySet为结构化数据集提供了统一的容器,特别适合用于特征工程的准备工作。通过EntitySet,我们可以清晰地表达数据中的层次结构和关联关系,为后续的自动化特征生成打下基础。
为什么需要EntitySet?
在实际项目中,原始数据往往分散在多个关联表中。例如,在客户交易场景中,我们可能有:
- 交易记录表
- 产品信息表
- 客户信息表
- 会话记录表
这些表通过外键相互关联。EntitySet帮助我们:
- 清晰地表达这些表之间的关系
- 维护数据完整性
- 为自动化特征工程提供结构化输入
实战:构建客户交易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",
],
)
这个方法自动完成了:
- 创建新的sessions表
- 从transactions表中移除冗余列
- 建立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中的所有关系,为每个产品生成丰富的特征,包括:
- 产品自身的属性
- 相关交易的数量统计特征
- 时间窗口内的聚合特征
- 跨表的复杂特征
最佳实践建议
- 合理设计索引:确保每个表都有合适的索引列,这对性能至关重要
- 明确时间索引:时间相关的分析需要正确设置time_index
- 规范数据类型:使用logical_types准确表达列的业务含义
- 适度规范化:平衡规范化和查询效率,避免过度规范化
- 可视化检查:使用
es.plot()
可视化EntitySet结构,确保关系正确
通过EntitySet,Featuretools能够理解数据的语义关系,从而生成更有业务意义的特征。这种结构化表示方法大大简化了特征工程的复杂度,特别是在处理多表关联数据时优势明显。
featuretools 项目地址: https://gitcode.com/gh_mirrors/fea/featuretools
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考