Featuretools深度解析:如何精准控制特征生成选项

Featuretools深度解析:如何精准控制特征生成选项

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

前言

在自动化特征工程领域,Featuretools作为一款强大的工具,能够自动从关系型数据集中生成丰富的特征。然而在实际应用中,我们往往需要对特征生成过程进行更精细的控制。本文将深入探讨Featuretools中的primitive选项配置技巧,帮助开发者实现更精准的特征工程控制。

基础概念回顾

在Featuretools中,primitive(原语)是构建特征的基本单元,分为两类:

  • 转换原语(Transform Primitives):作用于单张表的操作(如计算星期几)
  • 聚合原语(Aggregate Primitives):跨表聚合操作(如计算平均值)

默认情况下,DFS(深度特征合成)会将原语应用于所有数据表和列,但实际业务场景中我们常需要更精细的控制。

全局控制选项

忽略特定数据表和列

通过ignore_dataframesignore_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,
)

最佳实践建议

  1. 对敏感日期字段使用ignore_columns
  2. 对关键业务字段使用include_columns确保其被包含
  3. 组合使用全局和原语级控制实现灵活配置

分组操作的特殊控制

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选项配置,可以实现:

  1. 数据隐私保护:排除敏感字段
  2. 计算效率优化:减少不必要的特征计算
  3. 业务逻辑贯彻:确保特征符合业务规则
  4. 结果可解释性:控制特征来源提高可解释性

建议在实际项目中:

  1. 先进行全量特征生成了解数据潜力
  2. 然后逐步添加控制选项优化特征集
  3. 最后固定最优配置用于生产环境

掌握这些精细控制技巧,将使你的自动化特征工程更加精准高效。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秦俐冶Kirby

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

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

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

打赏作者

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

抵扣说明:

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

余额充值