自动化特征工程工具:Featuretools、AutoFeat 和 tsfresh 指南 2024
Master automated feature engineering with Featuretools, AutoFeat, and tsfresh. Comparison, code examples, and production pipeline integration.
- MIT
- 更新于 2026-05-18
{</* 资源信息 */>} 特征工程是将原始数据转换为机器学习模型可以有效使用的变量的过程。 这也是典型机器学习管道中最耗时、最依赖专业知识的阶段。 福布斯 2016 年调查 发现,数据科学家将 80% 的时间花在数据准备上,其中大部分时间花在特征工程上。 近十年后,尽管 AutoML 取得了进步,但手动特征创建仍然是一个瓶颈。 自动化特征工程工具有望改变这一现状。 它们从原始数据中生成数百或数千个候选特征,应用统计相关性过滤,并输出准备用于模型训练的特征矩阵。 该领域最成熟的三个 Python 库是 Featuretools(用于关系数据)、AutoFeat(用于表格数据)和 tsfresh(用于时间序列)。 本指南解释了每个工具的优点,通过代码示例演示了它们的用法,并提供了一个决策框架,用于将自动化特征工程合并到生产 ML 管道中。
SUM(transactions.amount) — 每个客户的总支出
MEAN(transactions.amount)— 平均交易价值DAY(transactions.timestamp)— 每笔交易的日期(转换)MEAN(transactions.DAY(timestamp))— 交易的平均日期(堆叠) ### 使用 Featuretools 构建您的第一个自动化功能管道 以下是使用零售数据集与客户及其交易的完整演练:蟒蛇 将 featuretools 导入为 ft 将 pandas 导入为 pd # 加载数据 客户 = pd.read_csv('customers.csv') 交易 = pd.read_csv('transactions.csv') # 创建实体集 es = ft.EntitySet(id='零售') # 添加实体 es = es.add_dataframe(dataframe_name='客户', 数据框=客户, 索引='customer_id', time_index='注册日期') es = es.add_dataframe(dataframe_name='交易', 数据框=交易, 索引='交易id', time_index='时间戳') # 定义关系 关系 = ft.Relationship( es['客户']['customer_id'], es['交易']['customer_id'] ) es = es.add_relationship(关系) # 运行深度特征合成 feature_matrix, feature_defs = ft.dfs( 实体集=es, target_dataframe_name='客户', agg_primitives=['总和', '平均值', '计数', '最大值', '最小值', '标准'], trans_primitives=['日', '月', '年', '工作日'], 最大深度=2, 详细=真 )max_depth=2参数控制可以堆叠多少个图元。 深度 1 产生简单的聚合。 深度 2 创建堆叠特征,例如每个客户交易的平均星期几。 更深的堆栈会生成更多特征,但会增加计算时间和过度拟合的风险。 自定义原语允许特定于域的功能。 为特定于业务的计算定义自定义原语:蟒蛇 从 featuretools.primitives 导入 make_trans_primitive 从 featuretools.variable_types 导入数值 defdiscount_ratio(价格,折扣): 退货折扣/价格 折扣率 = make_trans_primitive( 函数=折扣率, input_types=[数字,数字], return_type=数字 )时间截止时间防止数据泄露。 当为时间 T 的预测生成特征时,仅使用 T 之前可用的数据:蟒蛇 cutoff_times = pd.DataFrame({ '客户 ID': [1, 2, 3], '时间': pd.to_datetime(['2024-06-01', '2024-06-01', '2024-06-01']) }) feature_matrix, _ = ft.dfs(entityset=es, target_dataframe_name='客户', 截止时间=截止时间)### Featuretools 与特征存储集成 生产 ML 系统受益于将工程特征存储在特征存储中,以便跨模型和团队重用。 Featuretools 与开源特征存储 Feast 集成: 1. **定义特征定义。**Featuretools 输出具有完整谱系的“特征”对象列表 - 您确切地知道哪些原语和关系产生了每个特征。 2. 物化特征。 按计划计算特征,并将结果存储在 Feast 的离线商店 (Parquet/BigQuery/Snowflake) 中以进行训练,将结果存储在在线商店 (Redis/DynamoDB) 中以进行服务。 3. 监控漂移。 比较训练数据和服务数据之间的特征分布。 当上游数据发生变化时,自动化功能特别容易发生漂移。 4. 版本功能。 将Featuretools功能定义保存为JSON并将其与模型代码一起进行版本化。 为任何模型版本重现精确的特征工程管道。 ## AutoFeat:表格数据的自动化特征工程 AutoFeat由Stefan Oehmcke开发,采用了与Featuretools不同的方法。 AutoFeat 不是对关系数据进行操作,而是应用符号数学从单个平面表(一个 DataFrame)中自动生成和选择特征。 它对于较小的数据集(<100,000 行)特别有效,其中深层关系特征不如数学转换重要。 AutoFeat的算法: 1. 生成候选特征。 创建数值列的多项式组合、比率、对数、指数和三角函数。 2. **删除冗余特征。**消除线性依赖于其他特征的特征(例如,“x/y”和“xz/yz”是等效的)。 3. 选择预测特征。 使用 L1 正则化线性回归 (Lasso) 选择实际提高预测性能的生成特征子集。 4. 返回转换后的 DataFrame。 输出仅包含选定功能的新 DataFrame,为任何 ML 模型做好准备。 AutoFeat 擅长处理工程数据集上的回归和分类任务,其中存在有意义的交互但并不明显。 物理模拟、化合物特性预测和财务比率分析是理想的用例。 ````蟒蛇 从 autofeat 导入 AutoFeatRegressor model = AutoFeatRegressor(feateng_steps=2, # 变换深度 max_gb=16) # 内存限制 X_train_transformed = model.fit_transform(X_train, y_train) X_test_transformed = model.transform(X_test)
- **复杂度特征:**样本熵、Lempel-Ziv复杂度、CID复杂度
- **趋势特征:** 线性趋势斜率、自回归系数、增强迪基-富勒检验统计量
- **形状特征:** 峰值数量、高于平均值的最长冲击、高于阈值的计数
- **频率特征:** FFT系数、谱质心、谱熵 ### FRESH 算法 tsfresh 实现了 FRESH(基于可扩展假设检验的特征提取)算法,该算法解决了一个关键问题:拥有 800 多个特征,其中许多特征是不相关或相关的。 FRESH 使用假设检验过滤特征: 1. 从每个时间序列中提取所有 800 多个特征。 2. 对于每个特征,使用来自合适测试的 p 值(用于分类的卡方检验,用于回归的 F 检验)来测试它是否与目标变量在统计上相关。 3. 应用 Benjamini-Yekutieli 程序来控制所有测试的错误发现率。 4. 仅返回通过相关性阈值的特征。 这种统计过滤是 tsfresh 的关键区别所在。 大多数自动化特征工程工具都会不加区别地生成特征; tsfresh 严格测试每个特征是否携带预测信号。 ````蟒蛇
从 tsfresh 导入 extract_features、select_features
从 tsfresh.utilities.dataframe_functions 导入估算 # 提取特征(X是一个长格式的DataFrame,包含id、时间、值列)
X_extracted = extract_features(X, column_id='id', column_sort='时间', 列值='值', default_fc_parameters='高效') # 估算缺失值
X_估算 = 估算(X_提取) # 选择相关特征
X_selected = select_features(X_imputed, y)
```` `default_fc_parameters='efficient'` 参数提取约 200 个针对计算效率进行优化的特征子集。 当计算时间不受限制时,对所有 800 多个功能使用“综合”。 **最适合:**时间序列分类、传感器数据分析、物联网特征提取、信号处理、多元时间序列。 **限制:** 主要为时间序列设计——不适合横截面数据或关系数据。 特征名称是神秘的(例如,`value__agg_autocorrelation__f_agg_"mean"__max_7`),需要查找文档进行解释。 如果没有并行化,大型数据集的提取可能会很慢。 ## 工具比较和选择指南 | 特色 | 功能工具 | 自动功能 | 新鲜 |
|
💬 留言讨论