Featuretools深度解析:如何精准控制特征生成选项
featuretools 项目地址: https://gitcode.com/gh_mirrors/fea/featuretools
前言
在自动化特征工程领域,Featuretools作为一款强大的工具,能够自动从关系型数据集中生成丰富的特征。然而在实际应用中,我们往往需要对特征生成过程进行更精细的控制。本文将深入探讨Featuretools中的primitive选项配置技巧,帮助开发者实现更精准的特征工程控制。
基础概念回顾
在Featuretools中,primitive(原语)是构建特征的基本单元,分为两类:
- 转换原语(Transform Primitives):作用于单张表的操作(如计算星期几)
- 聚合原语(Aggregate Primitives):跨表聚合操作(如计算平均值)
默认情况下,DFS(深度特征合成)会将原语应用于所有数据表和列,但实际业务场景中我们常需要更精细的控制。
全局控制选项
忽略特定数据表和列
通过ignore_dataframes
和ignore_columns
参数,我们可以全局忽略某些数据表或列:
features_list = ft.dfs(
entityset=es,
target_dataframe_name="customers",
agg_primitives=["mode"],
trans_primitives=["weekday"],
ignore_dataframes=["log", "cohorts"], # 完全忽略这两张表
ignore_columns={
"sessions": ["device_name"], # 忽略sessions表的device_name列
"customers": ["birthday"] # 忽略customers表的birthday列
},
features_only=True,
)
这种全局忽略适用于以下场景:
- 敏感数据(如用户生日)不应参与特征生成
- 日志类数据表可能包含过多噪声
- 某些列与预测目标无关
原语级精细控制
控制单个原语的数据表范围
通过primitive_options
参数,我们可以为特定原语设置独立的数据表包含/排除规则:
features_list = ft.dfs(
entityset=es,
target_dataframe_name="customers",
agg_primitives=["mode"],
trans_primitives=["weekday", "day"],
primitive_options={
"mode": {"ignore_dataframes": ["cohorts", "log"]}, # mode原语忽略这两张表
("weekday", "day"): {"include_dataframes": ["customers"]}, # 这两个原语仅作用于customers表
},
features_only=True,
)
技术要点:
- 使用原语名称字符串或原语类作为键
include_dataframes
优先级高于ignore_dataframes
- 可以同时控制多个原语(如示例中的weekday和day)
控制单个原语的列范围
类似地,我们可以控制原语作用的列范围:
features_list = ft.dfs(
entityset=es,
target_dataframe_name="customers",
agg_primitives=["mode"],
trans_primitives=["weekday"],
primitive_options={
"mode": {
"include_columns": { # mode原语仅使用这些列
"log": ["product_id", "zipcode"],
"sessions": ["device_type"],
"customers": ["cancel_reason"],
}
},
"weekday": {"ignore_columns": {"customers": ["signup_date", "cancel_date"]}},
},
features_only=True,
)
最佳实践建议:
- 对敏感日期字段使用
ignore_columns
- 对关键业务字段使用
include_columns
确保其被包含 - 组合使用全局和原语级控制实现灵活配置
分组操作的特殊控制
GroupBy转换原语(如累计求和)有额外的控制选项:
features_list = ft.dfs(
entityset=es,
target_dataframe_name="log",
groupby_trans_primitives=["cum_sum", "cum_count"],
primitive_options={
"cum_sum": {"ignore_groupby_columns": {"log": ["product_id"]}},
"cum_count": {
"include_groupby_columns": {"log": ["product_id", "priority_level"]},
"ignore_groupby_dataframes": ["sessions"],
},
},
features_only=True,
)
关键区别:
- 普通选项控制原语应用的数据/列范围
- GroupBy选项控制分组依据的数据/列范围
- 默认只使用外键列分组,但可通过
include_groupby_columns
扩展
多输入原语的精细控制
对于像Trend这样需要多个输入的原语,可以为每个输入单独指定选项:
features_list = ft.dfs(
entityset=es,
target_dataframe_name="customers",
agg_primitives=["trend"],
primitive_options={
"trend": [
{"ignore_columns": {"log": ["value_many_nans"]}}, # 第一个输入的选项
{"include_columns": {"customers": ["signup_date"], "log": ["datetime"]}}, # 第二个输入的选项
]
},
features_only=True,
)
注意事项:
- 选项列表长度必须与原语输入数量一致
- 如果只提供一个选项字典,将应用于所有输入
- 输入顺序需与原语定义一致
总结与最佳实践
通过合理使用Featuretools的primitive选项配置,可以实现:
- 数据隐私保护:排除敏感字段
- 计算效率优化:减少不必要的特征计算
- 业务逻辑贯彻:确保特征符合业务规则
- 结果可解释性:控制特征来源提高可解释性
建议在实际项目中:
- 先进行全量特征生成了解数据潜力
- 然后逐步添加控制选项优化特征集
- 最后固定最优配置用于生产环境
掌握这些精细控制技巧,将使你的自动化特征工程更加精准高效。
featuretools 项目地址: https://gitcode.com/gh_mirrors/fea/featuretools
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考