特征交叉挖掘非线性关系:如何用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
相关产品推荐
相关产品推荐

