You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

特征交叉挖掘非线性关系:如何用FeatureTools生成表中新特征?

嘿,我来给你一步步拆解怎么用FeatureTools做特征交叉生成新特征,这工具在自动特征工程里真的挺省心的!

用FeatureTools实现特征交叉生成新特征

1. 先搞定安装

首先得确保你把FeatureTools装上,用pip就行:
pip install featuretools

2. 准备你的数据集

先拿个常见的用户-订单场景举例子,模拟点测试数据:

import pandas as pd
import featuretools as ft

# 用户基础信息表
users = pd.DataFrame({
    "user_id": [1, 2, 3],
    "age": [25, 30, 35],
    "gender": ["M", "F", "M"]
})

# 用户订单记录表
orders = pd.DataFrame({
    "order_id": [101, 102, 103, 104],
    "user_id": [1, 1, 2, 3],
    "amount": [100, 150, 200, 50],
    "order_date": pd.date_range("2023-01-01", periods=4)
})

3. 构建实体集(EntitySet)

FeatureTools是基于**实体(表)和关系(表关联)**工作的,所以第一步得把你的数据表组织成实体集,明确表之间的关联:

# 创建一个空的实体集
es = ft.EntitySet(id="customer_data")

# 添加用户实体,指定user_id作为索引列
es = es.add_dataframe(
    dataframe_name="users",
    dataframe=users,
    index="user_id",
    make_index=False
)

# 添加订单实体,同时指定时间索引(如果有时间维度的话)
es = es.add_dataframe(
    dataframe_name="orders",
    dataframe=orders,
    index="order_id",
    make_index=False,
    time_index="order_date"
)

# 建立用户表和订单表的关联:用户的user_id对应订单的user_id
es = es.add_relationship(
    parent_dataframe_name="users",
    parent_column_name="user_id",
    child_dataframe_name="orders",
    child_column_name="user_id"
)

4. 用深度特征合成(DFS)自动生成交叉特征

DFS是FeatureTools的核心功能,它会自动帮你组合特征,包括做特征交叉。你可以通过trans_primitives参数指定要用的交叉方式,比如乘法、加法,或者通用的特征交互:

# 运行DFS生成特征
features, feature_defs = ft.dfs(
    entityset=es,
    target_dataframe_name="users",  # 我们要给每个用户生成特征
    agg_primitives=["mean", "sum"],  # 先做聚合,比如每个用户的订单金额均值、总和
    trans_primitives=["multiply", "add", "interaction"],  # 指定交叉用的转换原语
    max_depth=2  # 特征最大深度设为2,允许单特征和聚合特征做交叉
)

# 看看生成的特征
print(features.head())

这里max_depth=2的作用是允许生成类似age * sum(orders.amount)(年龄乘以订单总金额)这种交叉特征,或者gender和订单金额统计值的交互特征。

5. 自定义交叉逻辑(如果内置原语不够用)

要是内置的交叉方式满足不了你的需求,还可以自己写交叉函数,注册成FeatureTools的原语来用:

from featuretools.primitives import TransformPrimitive
from featuretools.variable_types import Numeric

# 自定义一个「两个特征的平方和」交叉函数
class SquareSum(TransformPrimitive):
    name = "square_sum"
    input_types = [Numeric, Numeric]  # 输入要求是两个数值型特征
    return_type = Numeric

    def get_function(self):
        def square_sum(a, b):
            return (a ** 2) + (b ** 2)
        return square_sum

# 用自定义原语生成特征
features_custom, feature_defs_custom = ft.dfs(
    entityset=es,
    target_dataframe_name="users",
    agg_primitives=["sum"],
    trans_primitives=["multiply", SquareSum],  # 把自定义原语加进去
    max_depth=2
)

print(features_custom.head())

6. 查看交叉特征的具体定义

你可以通过feature_defs来查看每个生成特征的具体构成,比如:

for feature in feature_defs:
    print(feature)

会输出类似multiply(age, sum(orders.amount))这样的定义,一目了然知道是哪两个特征交叉来的。

内容的提问来源于stack exchange,提问作者Mark Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:06:26