文章

OpenFE与Featuretools自动特征工程简介

OpenFE与Featuretools自动特征工程简介

OpenFE与Featuretools自动特征工程简介

OpenFEFeaturetools 都属于「自动特征工程」工具,但面向的数据形态与方法论不同:前者专注单表 tabular,用算子组合 + 以模型效果为导向的筛选造特征(ICML 2023,Kaggle IEEE-CIS 等赛题有公开验证);后者专注多表关系数据,用深度特征合成(DFS)沿实体关系做聚合与变换。本文概括二者定位、核心流程、OpenFE 方法细节与实验、差异对比与选型建议。

参考与延伸阅读


目录


1. 自动特征工程在流水线中的位置

表格机器学习常见流程:

1
原始数据 → 清洗 / 编码 / 缩放 → 【自动特征生成】→ 模型训练 → 评估

自动特征工程试图减少人工「拍脑袋造特征」的工作量,但两类工具解决的问题并不相同:

痛点典型工具方向
单表宽特征上,不知道 A/Blog(A)、交叉项哪些有用OpenFE 等:组合 + 按预测效果筛选
多张业务表(用户、订单、商品),跨表聚合特征难手工铺全Featuretools 等:关系型 DFS

二者不是互斥替代,也可串联:先用 Featuretools 多表合成宽表,再用 OpenFE 在宽表上试组合与筛选。


2. OpenFE 简介

2.1 是什么

OpenFEIIIS-Li-Group/OpenFE)是面向表格数据(tabular)的自动特征生成框架,对应 ICML 2023 论文 OpenFE: Automated Feature Generation with Expert-level PerformancearXiv:2211.12507)。

目标:从现有列出发,自动构造候选特征,并挑出能提升下游模型(GBDT、神经网络等)效果的新列,减轻人工特征工程负担。

背景与动机:表格类(tabular)数据是机器学习与 Kaggle 等竞赛中最常见的形态之一。特征生成(组合、变换原始列)往往决定模型上限,但「造什么特征、哪些有效」高度依赖领域经验与反复试错,实践中常占建模总时间的一半甚至更多。现有 AutoML 工具大多聚焦模型与超参搜索,很少把自动化特征生成纳入流程;高效、准确的开源特征生成包也相对稀缺。OpenFE 针对这一缺口:用 Expand-and-Reduce 在大候选空间中快速找到能提升 LightGBM / XGBoost 以及 FT-Transformer、AutoInt、TabNet 等表格神经网络效果的新特征。

典型业务类比:股票领域的 P/E ratio = 股价 / 每股收益,由两张财报列组合而成,比单看原价或利润更能反映估值;OpenFE 试图在缺乏领域公式时,自动发现类似「比值、交叉、分组统计」的有效组合。

2.2 核心流程:Expand-and-Reduce

1
2
3
4
5
6
7
原始特征列
    ↓ Expand(扩展)
用算子组合生成大量候选特征(如 A/B、log(A+1)、A×B、分箱交叉等)
    ↓ Reduce(缩减)
Feature Boosting 评估增量收益 + 两阶段剪枝 → 保留有效特征
    ↓
输出特征列表,用于增广训练/测试集
组件作用
扩展(Expand)内置约 23 种算子,对数值/类别列做一元、二元组合
Feature Boosting快速评估「加入该候选特征后模型性能提升多少」,避免对每个候选全量重训
两阶段剪枝Stage1 粗筛候选 → Stage2 用 LightGBM 重要性(gain 或 permutation)排序,保留 Top-K

两大挑战与对应解法

挑战问题OpenFE 解法
评估慢需衡量候选特征相对已有特征的增量贡献;每个候选都「全量重训 + 看验证集」不可接受Feature Boosting:在 GBDT 基线预测(init_score)上增量训练,用 metric₂ − metric₁ 近似增量收益(见下表)
候选爆炸组合后候选数量巨大,全量计算与评估内存、耗时都过高两阶段剪枝:Stage1 用 successive halving 粗筛;Stage2 在剩余候选上考虑特征交互并做重要性精排

Feature Boosting(增量评估)

思路类似 Gradient Boosting:不从头重训,而是在已有模型预测基础上衡量「多加这一列」带来的提升。

步骤做法
1用已有特征集 𝒯 训练 GBDT,得到预测 ŷ₁ 与验证指标 metric₁
2将 ŷ₁ 作为新 GBDT 的 init_score(初始预测)
3仅用候选特征(或候选子集)继续训练,得到 ŷ₂ 与 metric₂
4metric₂ − metric₁ 当作该候选相对 𝒯 的增量效果

实现上默认用 LightGBM 的 init_score 参数(见 §2.6)。论文指出该近似速度快、且接近全量重训的评估结果;思想也可推广到神经网络场景。fit(feature_boosting=True) 会在原始特征上先拟合基线 GBDT 生成 init_score(见 §2.5.2)。

两阶段剪枝(successive halving + 重要性精排)

有效新特征通常稀疏,OpenFE 用「先粗后细」降低计算量:

1
2
3
4
5
6
7
8
9
全部候选特征
    ↓ Stage 1(粗筛,successive halving)
数据切成 n_data_blocks 块 → 先用 1 块评估所有候选 → 淘汰后一半 → 数据块翻倍 → 重复
(仅评估单特征自身增量,不考虑特征间交互)
    ↓ Stage 2(精筛)
剩余候选 + 原始特征拼成宽表 → 再训 LightGBM → 按 gain / permutation 重要性排序
(此时考虑特征交互对 loss 的贡献)
    ↓
输出按重要性排序的特征列表

Stage1 对应 stage1_select + n_data_blocks / min_candidate_features;Stage2 对应 stage2_select + stage2_metric(详见 §2.5.2)。

说明:Feature Boosting 与两阶段筛选在实现上依赖 LightGBM(见 §2.6),与论文中「生成特征可提升 GBDT / 神经网络」的下游训练模型不是同一层概念。

2.3 实验验证与竞赛成绩

论文与作者在多个公开数据集、两场 Kaggle 竞赛上验证了 OpenFE。核心结论可概括为:

结论说明
相对 baseline 方法在速度与效果上优于既有自动特征生成 baseline;无论下游用 GBDT 还是 Transformer,加入 OpenFE 特征均有收益
相对 SOTA 表格神经网络专为表格设计的网络(如 FT-Transformer、AutoInt)虽能学特征交互,实验表明 OpenFE 生成特征仍能显著提升其效果;论文亦给出特征生成在常见设定下有效的理论分析
相对人工特征工程IEEE-CIS Fraud Detection 上,简单 XGBoost + OpenFE 特征可超过 99.3% 参赛队伍(42/6351);在同基线 XGBoost 下,OpenFE 自动特征带来的提升大于该赛第一名队伍公开的特征方案
另一场竞赛BNP Paribas Cardif Claims Management 上,相较第一、七名队伍公开特征,OpenFE 自动特征同样带来更大模型提升

竞赛解读(IEEE-CIS):第一名队伍公开材料主要是特征 + 简单 XGBoost;冲榜第一通常还需 LightGBM、CatBoost、多种神经网络 等模型集成。OpenFE 的价值在于:在特征工程这一环,用自动化方案达到或超过顶尖队伍手工特征的水平(详见 论文 与仓库 Examples)。

2.4 主要特点

特点说明
任务类型二分类、多分类、回归
数据预处理可自动处理缺失值、类别特征
并行支持 n_jobs 并行
下游模型论文验证对 GBDT(LightGBM、XGBoost)与 表格神经网络(Transformer、AutoInt、TabNet、FT-Transformer 等)均有收益
竞赛表现Kaggle IEEE-CISBNP Paribas 等赛题上验证有效(见 §2.3
易用性典型用法约四行代码(fit + transform

2.5 快速上手

1
2
3
4
5
from openfe import OpenFE, transform, tree_to_formula

ofe = OpenFE()
features = ofe.fit(data=train_x, label=train_y, n_jobs=8)
train_x, test_x = transform(train_x, test_x, features, n_jobs=8)

fit 返回的是特征表达式树Node / FNode 对象列表),不是直接可用的数值列;需再调用 transform 把公式算成 DataFrame 新列。公式可读性可通过 tree_to_formula 查看(见 §2.5.1)。

2.5.1 原生输出字段与示例

OpenFE 没有单独的 JSON / Parquet 结构化导出格式;原生输出分三层:fit 返回的特征树实例上附带的重要性分数transform 增广后的 DataFrame 列。以下字段与示例均来自官方 openfe.pyFeatureGenerator.pyutils.pycalifornia_housing 示例

输出层次总览

输出层次API / 属性类型作用
fit 返回值features = ofe.fit(...)list[Node]筛选后的特征表达式树,按 Stage2 重要性从高到低排序;供 transformtree_to_formula 使用
实例属性(同返回值)ofe.new_features_listlist[Node]fit 返回值相同,示例中常写 ofe.new_features_list[:10] 只取 Top-10
实例属性(含分数)ofe.new_features_scores_listlist[[Node, float]]每项为 [特征树, 重要性分数];分数来自 Stage2 的 gain(默认)或 permutationfit 返回值里,需读此属性
可读公式tree_to_formula(node)strNode 转为可审计的公式字符串,便于日志、落盘与人工复核
transform 返回值train_x, test_x = transform(...)(DataFrame, DataFrame)保留全部原始列基础上,追加 OpenFE 新列
持久化(可选)openfe.utils.file_to_node(path)list[[Node, float]]读入「公式 + 分数」文本行(见下表);属 utils 辅助函数,需 from openfe.utils import file_to_node

fit 返回的 Node / FNode 对象字段

特征在内部表示为表达式树:叶子 FNode 对应原始列名,内部 Node 对应算子及其子节点(FeatureGenerator.py)。

字段 / 属性所在类型类型示例值作用
nameNodestr"/""log""GroupByThenMean"算子名;决定如何对 children 做变换
nameFNodestr"MedInc""product_id"叶子节点:引用输入 DataFrame 的原始列名
childrenNodelist[Node\|FNode][FNode("MedInc"), FNode("AveRooms")]子表达式;一元算子 1 个子节点,二元算子 2 个
dataNode / FNodepd.SeriesNone0.52, 1.17, …(fit 结束后多为 None运行时缓存该特征在样本上的计算结果;fit 结束会 delete() 释放,结构(name/children)仍保留transform 重算
get_fnode()Nodelist[str]["MedInc", "AveRooms"]该特征依赖的底层原始列去重列表,用于列裁剪与泄漏检查
重要性(第二元)new_features_scores_list[i][1]float156.32Stage2 排序依据:默认 LightGBM gainstage2_metric='permutation' 时为置换重要性均值

tree_to_formula 公式字符串示例

公式格式由 tree_to_formula 生成:四则运算为中缀括号,其余算子为函数式 算子(子表达式,…)。以下以 sklearn california_housing 列名为例(MedIncAveRoomsHouseAge 等):

公式字符串(示例)含义产出 dtype
log(MedInc)收入取对数(内部 log(abs(x)),0 当缺失处理)float64
(MedInc/AveRooms)收入 ÷ 平均房间数float64
*(MedInc,HouseAge)收入 × 房龄float64
GroupByThenMean(AveRooms,HouseAge)HouseAge 分组,取组内 AveRooms 均值再映射回各行float64
Combine(product_id,city)两列类别拼接后 factorize(高基数类别组合)category
freq(card_brand)类别取值在样本中的出现频次float64

官方示例打印 Top 特征的方式(california_housing.py):

1
2
3
4
5
6
for feature in ofe.new_features_list[:10]:
    print(tree_to_formula(feature))
# 可能输出类似:
# GroupByThenMean(AveRooms,HouseAge)
# (MedInc/AveRooms)
# log(MedInc)

若需同时保留分数,可遍历 ofe.new_features_scores_list

1
2
3
for node, score in ofe.new_features_scores_list[:10]:
    print(tree_to_formula(node), score)
# GroupByThenMean(AveRooms,HouseAge)  156.32

也可用 file_to_nodefrom openfe.utils import file_to_node)读入每行「公式 + 分数」的文本:(MedInc/AveRooms) 156.32(首列为 tree_to_formula 同格式字符串)。

transform 增广后的 DataFrame 列

transform(或 OpenFE.transform)在原始 X_train / X_test 右侧追加新列,列名与 features 列表下标一一对应:

列名模式示例类型作用
原始列MedIncHouseAge、…与输入一致原样保留
新列 autoFE_f_{i}autoFE_f_0autoFE_f_1、…多数为 float64Combine 等为 categoryi 个特征(与 features[i] / new_features_list[i] 对应,i 从 0 起)
可选后缀autoFE_f_0_val同上transform(..., name="_val") 时在列名后追加 name 参数,避免多份 transform 列名冲突
列名对应公式(示例)示例取值(示意)
autoFE_f_0GroupByThenMean(AveRooms,HouseAge)5.12
autoFE_f_1(MedInc/AveRooms)0.83
autoFE_f_2log(MedInc)1.52

命名注意fit 阶段 Stage2 内部临时矩阵列名为 autoFE-0连字符),仅用于 LightGBM 精排;对外 transform 输出autoFE_f_0下划线),二者不要混用。

transform 会把 inf 置为 NaN;含 GroupByThen*全局统计算子时,训练集与测试集需一起传入 transform,与官方文档一致。

2.5.2 fit() 特征组合与筛选参数

OpenFE 的特征「组合」与「筛选」分两阶段:Expand 决定候选空间(算子 + 组合深度 + 列角色),Reduce 用 successive feature-wise halving(Stage 1)+ LightGBM 重要性(Stage 2)砍掉无效候选。完整参数说明见官方 OpenFE.fit 文档字符串;调参指南见 Parameters Tuning;高阶组合见 FAQ:high-order features

候选特征空间(Expand)

控制「生成哪些组合、组合多深」。

参数 / API默认值作用官方说明
candidate_features_listNoneNone 时自动枚举候选;传入自定义 list[Node]完全接管候选空间(最强控制,适合注入领域先验)fit 参数说明
get_candidate_features(...)独立 API,生成可传入 fit 的候选列表;非 fit 形参,但与组合深度强相关get_candidate_features
numerical_features[]参与组合的纯数值列同上
categorical_features[]参与组合的类别列(可走 CombineGroupByThen* 等)同上
ordinal_features[]有序离散数值(如年龄档位);同时按数值与类别两条路径参与组合同上
order1候选特征的最大阶数:1 阶 = 对原始列套一层算子;order=2 会在 1 阶结果上再组合,候选量指数级暴涨同上;FAQ 高阶特征
categorical_featuresfitNone指定哪些列当类别;None 时用 select_dtypes(exclude=np.number) 自动推断fit 参数说明
自动枚举规则candidate_features_list=None非类别且 nunique() <= 100 的数值列视为 ordinal;其余数值列进 numerical_features;默认 order=1get_candidate_features 调用处
内置算子23 种一元(logfreq…)、数值二元(+*/…)、类别聚合(GroupByThenMeanCombine…)FeatureGenerator.py

自定义候选 + 控制组合深度示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from openfe import OpenFE, get_candidate_features

# order=1:仅对原始列做一层变换(推荐起点)
candidates = get_candidate_features(
    numerical_features=["amount", "hour"],
    categorical_features=["city", "card_brand"],
    ordinal_features=["age"],          # 同时走数值/类别两条组合路径
    order=1,
)
# order=2:在一阶特征上再组合,候选量极大,慎用
# candidates = get_candidate_features(..., order=2)

ofe = OpenFE()
ofe.fit(
    data=train_x, label=train_y,
    candidate_features_list=candidates,
    categorical_features=["city", "card_brand", "age"],
    n_jobs=8,
)

实践建议:官方 FAQ 指出,多数数据集上 高阶(≥2)特征收益有限;更稳妥做法是先 order=1 筛出有效特征,再把它们并入基特征后手动升阶(见 How to generate high-order features?)。

Stage 1:粗筛候选(successive feature-wise halving)

控制一阶段「砍候选」的速度 vs 召回

参数默认值作用官方说明
is_stage1TrueTrue:启用 successive feature-wise halving 逐轮淘汰;False跳过 Stage 1,全部候选直接进入 Stage 2(慢、占内存,仅候选很少时考虑)fit 参数说明
n_data_blocks8数据分块数,须为 2 的幂(1, 2, 4, 8, 16…);越大越快,但易在早轮丢掉有用候选fit 参数说明调参:加速
min_candidate_features2000halving 的早停下限:剩余候选 ≤ 此值时停止继续砍;增大可保留更多候选进 Stage 2(偏效果)fit 参数说明调参:效果
stage1_metric'predictive'Stage 1 单特征评分方式:predictive(论文方法,LightGBM + init_score 看指标增量)、corr(与标签 Pearson 相关)、mi(互信息)fit 参数说明
stage1_metric 取值评估逻辑适用场景
predictive(默认)单特征 + LightGBM,看验证集指标相对 init_score增量与论文一致,一般首选
corr特征与标签的 Pearson 相关系数快速粗筛、回归类探索
mi特征与标签的互信息非线性关系探索,仍比 predictive 粗糙

Feature Boosting 与基线分数

为 Stage 1 的 predictive 评估提供 GBDT 基线(init_score)。

参数默认值作用官方说明
feature_boostingFalseTrue:在原始特征上训 LightGBM,生成 init_score 供增量评估;多数数据集上效果更好,但并非总是更优fit 参数说明调参:feature_boosting
init_scoresNone自定义 init_score;Nonefeature_boosting=True 时由 LightGBM 在原始特征上拟合得到fit 参数说明
metricNoneLightGBM 评估指标:binary_logloss / multi_logloss / auc / rmseNone 时按任务自动选择fit 参数说明

Stage 2:精排与 Top-K

在剩余候选上训练 LightGBM,按重要性输出最终排序列表。

参数默认值作用官方说明
stage2_metric'gain_importance'最终排序依据:gain_importance(LightGBM gain,快)或 permutation(置换重要性,慢但有时更准)fit 参数说明
stage2_paramsNone覆盖 Stage 2 LightGBM 超参;None 时默认 n_estimators=1000, importance_type="gain", num_leaves=16fit 参数说明
n_repeats1仅当 stage2_metric='permutation' 时生效:置换重要性重复次数fit 参数说明
drop_columnsNoneStage 2 建 LightGBM 时丢弃的列(仍可用于生成候选);用于去掉 ID 等泄漏列fit 参数说明

OpenFE 提供 top_k 形参:fit 返回全部通过 Stage 2 的候选(按重要性排序)。实际使用时取 ofe.new_features_list[:K] 或再做前向选择(官方 california_housing 示例 取 Top-10;亦可接 ForwardFeatureSelector,见 调参:生成后特征选择)。

数据划分与其他

参数默认值作用官方说明
train_index / val_indexNone自定义训练/验证索引;None 时 8:2 随机划分(分类分层)。时序数据建议显式传入fit 参数说明
taskNone'classification' / 'regression'None 时标签唯一值 < 20 视为分类fit 参数说明
n_jobs1特征计算与评估的并行进程数,建议设为物理核数fit 参数说明调参:n_jobs
seed1随机种子(划分、halving 子采样等)fit 参数说明
verboseTrue是否打印阶段进度与候选数量fit 参数说明

调参速查(组合选择相关)

目标建议调整
更强控制候选空间自定义 candidate_features_listget_candidate_features(..., order=1) 收窄列与阶数
加速增大 n_data_blocks(如 16/32)、增大 n_jobs;或 fit 前减少输入列(可能伤效果,见官方说明
提高召回 / 效果减小 n_data_blocks、增大 min_candidate_features;尝试 feature_boosting=True
Stage 1 更贴预测目标保持 stage1_metric='predictive'(默认)
Stage 2 更稳的重要性stage2_metric='permutation'(显著更慢)
类别列识别不准显式传 categorical_features=[...]
高阶交叉order=2 或迭代式升阶;注意候选爆炸与 FAQ 中的收益有限结论

2.6 运行时依赖与 LightGBM 角色

OpenFE 内部特征发现与筛选依赖 LightGBM,这是 pip install openfe 时的硬依赖(官方 setup.pyinstall_requireslightgbm>=3.3.2xgboost 为注释项,并非默认必装)。

1
pip install openfe    # 会一并安装 lightgbm>=3.3.2

容易误解的一点:OpenFE 用 LightGBM 做「造特征阶段的评估与排序」,不要求你最终业务模型也必须用 LightGBM。论文与示例中,OpenFE 生成的新列同样可交给 XGBoost、神经网络 等训练;LightGBM 是 OpenFE 自己的运行时引擎,不是对你下游算法的绑定。

环节LightGBM 在 OpenFE 内的作用官方源码
Feature Boostingfeature_boosting=True在原始特征上训练 LGBMClassifier / LGBMRegressor,得到 init_score(GBDT 基线分数),供后续增量评估openfe.py get_init_score
Stage 1 粗筛对每个候选特征,用 LightGBM + init_score 快速算预测指标增量stage1_metric='predictive'),筛掉明显无效候选openfe.py _evaluate(Stage 1)
Stage 2 精排在剩余候选上再训 LightGBM,按 feature_importances_(gain)permutation_importance 排序,输出 Top-K 特征列表(默认 stage2_metric='gain_importance'openfe.py stage2_select

对应源码中的典型参数(Stage 2 默认):importance_type="gain",即与 LightGBM 的 gain 重要性一致。stage1_metric / stage2_metric 的默认值与说明见 OpenFE.fit 文档字符串

项目若单独锁定依赖版本(例如与自有 GBDT 栈对齐),可显式声明:

1
2
3
# openfe 内部特征发现依赖 LightGBM 做 Feature Boosting 与 Top-K 重要性排序
openfe>=0.0.12
lightgbm>=3.3.2

即使业务侧不使用 OpenFE 做特征发现(bypass OpenFE),只要环境中安装了 openfe,仍须满足其对 lightgbm 的版本要求;这与「最终模型用 XGBoost 还是 LightGBM」无关。

2.7 局限与常见问题

局限说明
时序约束不擅长「只能用过去数据算未来」类时序特征;新特征须满足时间因果时需另做约束
数据规模虽已做效率优化,样本/特征极大或算力紧张时,可先对基础列做筛选再生成
关系型多表设计重心在单表,不替代 Featuretools 的多表 DFS
特征数量高阶组合可能仍产生较多特征,需结合业务与后续特征选择
运行耗时候选空间大时 Stage1/Stage2 仍可能较慢;可通过 n_data_blocksn_jobs、缩小 candidate_features_list 加速(见 §2.5.2 与官方 Parameters Tuning

常见问题

问题说明
和 gplearn 等遗传编程比?OpenFE 作者反馈:速度快得多,效果更好,且搜出的公式更简单可读;gplearn 适合符号回归探索,OpenFE 面向表格预测场景的 Expand-and-Reduce
如何打印特征构成?tree_to_formula(feature) 输出公式字符串;见 §2.5.1california_housing 示例
transform 为何要 train+test 一起传?会泄露吗?GroupByThen*freq全局统计算子时,需在同一数据快照上计算以保证训练/推理一致;特征筛选应在 fit 阶段仅用训练集完成,transform 只是对已选公式做数值变换。验证集/测试集应在 fit 之外,或只用 train_index/val_index 控制
SOTA 表格神经网络还需要 OpenFE 吗?实验表明 FT-Transformer、AutoInt 等仍可被 OpenFE 特征进一步抬升;网络自动交互 ≠ 替代领域型组合特征(见 §2.3
正确 import 方式?from openfe import OpenFE, transform(类名为 OpenFE,非 openfe() 函数)

更完整的局限讨论见论文与 OpenFE FAQ


3. Featuretools 简介

3.1 是什么

Featuretoolsalteryx/featuretools)是开源 Python 自动特征工程库,核心是 Deep Feature Synthesis(DFS,深度特征合成):在多张有关联的表上,按实体关系自动做聚合与变换,生成预测用宽特征。

典型场景:用户表 + 订单表 + 商品表 → 自动得到「用户过去 30 天订单数」「最近一笔金额」「历史最大单笔」等跨表特征。

3.2 核心概念

概念说明
EntitySet多表及其主外键关系的结构化描述
Primitive特征原语:聚合(COUNTSUMMAX…)或变换(yearpercentile…)
DFS沿关系图递归应用 primitive,从子表聚合到父实体,并可叠加多层变换
1
2
3
4
5
EntitySet(用户 ← 订单 ← 订单明细)
    ↓ DFS
对每个实体生成大量候选特征(COUNT、SUM、TIME_SINCE_LAST 等)
    ↓
输出特征矩阵(常需后续筛选降维)

3.3 主要特点

特点说明
数据形态多表关系型为主
特征语义特征名可追溯到「哪张表、什么聚合」,利于业务解释
扩展性支持自定义 primitive;可接 Dask 做大规模计算
生态文档与案例成熟,Alteryx 系产品链集成多
输出规模易生成海量特征,通常需配合特征选择或模型内置正则

3.4 与 OpenFE 的方法差异(本质)

Featuretools 不以「试到能涨分的组合」为唯一目标,而是按实体关系 + primitive 规则机械展开特征空间;是否有利于模型,需靠后续训练或筛选判断。OpenFE 则在生成过程中就用 Feature Boosting 等指标导向式保留有效特征。


4. OpenFE 与 Featuretools 对比

维度OpenFEFeaturetools
数据形态单表 tabular 为主多表关系型(EntitySet)
核心方法算子组合 + 模型效果导向筛选(Feature Boosting + 剪枝)DFS:沿表关系做聚合/变换 primitive
特征来源对现有列做数学/逻辑组合(A/Blog(A+1)A×B 等)跨表 COUNTSUMMAXTIME_SINCE
选型逻辑看新特征对目标预测的增量贡献按 schema 展开关系特征,数量可能很大
典型场景Kaggle 单表竞赛、GBDT 提分、宽表组合挖掘金融/电商多表宽表化、实体特征库
可解释性显式公式,相对直观特征名含表与聚合语义,但量大时仍难读
生态成熟度较新,偏研究与竞赛验证更久,工业案例与文档更丰富
时序/关系弱(单表组合;时序因果需自约束)强(多表 + 时间 primitive,需正确建 EntitySet)

一句话区分:

  • Featuretools:有多张关联表,要把「用户—订单—行为」这类关系型特征系统化铺出来 → 用 DFS。
  • OpenFE:只有一张宽表,想在现有列上自动试组合并挑出真能涨分的新列 → 用 OpenFE。

5. 选型建议

1
2
3
4
5
6
7
数据是单表还是多表?
        │
        ├─ 多表(用户/订单/明细…)──→ 优先 Featuretools(DFS 建 EntitySet)
        │                              可选:宽表后再接 OpenFE 做组合筛选
        │
        └─ 单表宽特征 ──────────────→ 优先 OpenFE
                                       或人工特征 + 领域算子
场景建议
竞赛单表、冲 GBDT/XGB 指标OpenFE
企业数仓多表、要实体级特征库Featuretools
已有 Featuretools 宽表,还想挖交叉项Featuretools → OpenFE 串联
强时序因果(只能用历史预测未来)两者都需额外约束;OpenFE 论文明确不自动处理时序约束
特征可解释性要求高Featuretools 聚合语义清晰;OpenFE 公式也可读,但高阶组合需人工复核

落地注意

  • 自动生成的特征可能维度暴涨,生产环境需版本管理、泄漏检查(训练/推理一致)与定期重训。
  • OpenFE 的 fit 应只在训练集上执行,transform 再应用到验证/测试集,避免标签泄露。
  • 安装 OpenFE 会拉取 LightGBM 作为其内部筛选引擎;与下游是否选用 XGBoost/LightGBM 训练最终模型无关(见 §2.6)。
  • Featuretools 的 DFS 要正确声明时间索引训练截止点,防止用未来信息聚合。

6. 小结

要点结论
OpenFE 是什么单表 tabular 自动特征生成;Expand-and-Reduce + Feature Boosting 筛选
OpenFE 竞赛验证IEEE-CIS 简单 XGBoost 超 99.3% 队伍;自动特征优于多名次公开手工特征
OpenFE 原生输出fitlist[Node](按重要性排序);transform → 原表 + autoFE_f_{i} 新列;公式用 tree_to_formula 查看
OpenFE 组合筛选参数candidate_features_list / get_candidate_features(order) 控空间;n_data_blocks / min_candidate_features 控 Stage1;stage1_metric / stage2_metric 控评估
OpenFE 与 LightGBM运行时硬依赖:内部用 LGBM 做 Boosting 基线、候选评估与 gain/permutation Top-K 排序;不等于下游必须用 LightGBM
Featuretools 是什么多表关系数据自动特征工程;深度特征合成 DFS
核心差异单表 vs 多表效果导向组合 vs 关系展开聚合
是否互斥否,可串联使用
选型口诀多表用 Featuretools,单表冲分用 OpenFE

7. 参考与来源

资源链接
OpenFE GitHubhttps://github.com/IIIS-Li-Group/OpenFE
OpenFE setup.pylightgbm>=3.3.2 硬依赖)https://github.com/IIIS-Li-Group/OpenFE/blob/master/setup.py#L20-L27
OpenFE openfe.py(Feature Boosting / Stage1 / Stage2)https://github.com/IIIS-Li-Group/OpenFE/blob/master/openfe/openfe.py
OpenFE 论文https://arxiv.org/abs/2211.12507
OpenFE 文档https://openfe-document.readthedocs.io/en/latest/
OpenFE Parameters Tuninghttps://openfe-document.readthedocs.io/en/latest/parameter_tuning.html
OpenFE FAQ(高阶特征等)https://openfe-document.readthedocs.io/en/latest/FAQ.html
Featuretools GitHubhttps://github.com/alteryx/featuretools
Featuretools 文档https://featuretools.alteryx.com/
本文由作者按照 CC BY 4.0 进行授权