py-evoFE:面向表格机器学习的自动化演化特征工程(Python实现)(遗传算法 + Scikit-Learn + Polars)[P]
摘要
py-evoFE是一个开源的Python库,它利用遗传算法来自动化并优化表格机器学习数据集的特征工程,具备scikit-learn兼容性,并采用Polars提升性能。
大家好!我非常高兴地宣布 py-evoFE(v0.3.0)正式发布——这是一款开源的 Python 库,它利用遗传算法,为表格型数据集自动发现、组合并优化特征变换。
GitHub:https://github.com/tanopereira/py-evoFE
PyPI:pip install py-evoFE
许可证:MIT
**它解决的问题**
特征工程依然是大多数表格数据机器学习竞赛和生产模型成败的关键。虽然 GBDT 模型如 LightGBM 和 XGBoost 在处理原始表格数据上表现出色,但它们难以自行发现复杂的比率、嵌套的分组聚合、非线性降维以及交互图谱。手工特征工程既繁琐又受限于人为直觉,而暴力特征生成则会导致特征空间呈指数级爆炸,伴随共线性噪声和高内存消耗。
**py-evoFE 的功能**
py-evoFE 使用遗传编程在可能的特征配方空间中进行搜索:
1. **层次化链式结构**:进化后的特征成为后续世代的基础构建块(例如:log(ratio(groupby_mean(x1, by=x2), x3)))。
2. **40+ 内置转换器**:
- 非线性算术与对数比率
- 目标编码(多类别、池化、WoE、分位数目标编码)
- 字符串相似度(MinHash、Gap 编码)
- 流形与降维(PCA、UMAP、MCA、FAMD、组间 PCA)
- 图与密度聚类(Genie、Lumbermark、MST 异常评分)
3. **性能与速度**:
- 由 Polars 和 PyArrow 驱动的向量化计算。
- 矩阵哈希与近邻缓存:通过字节哈希缓存有状态投影(如 UMAP 和 K 近邻查找),消除交叉验证折叠间的冗余计算。
- 多保真度筛选:快速低保真度交叉验证筛选初始种群;仅评估有希望的候选方案进入全保真度评估。
4. **岛屿模型与 Caruana 集成**:
- 多种群并行搜索,采用环形、环面、网格、超立方体和分层拓扑结构,并配备吉布斯迁移。
- 搜索结束后对岛屿胜出者的 out-of-fold 预测进行贪婪式 Caruana 集成。
5. **交互式重播查看器**:
- 运行 `view(evo.get_recipe())` 生成一个独立的、零依赖的 HTML 仪表板,回放进化搜索过程。
6. **100% Scikit-Learn 兼容**:
- 实现 `fit`、`transform`、`predict` 和 `predict_proba`。可直接插入标准的 `sklearn.pipeline.Pipeline` 和 `GridSearchCV`。
**快速示例**
```python
import polars as pl
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from evofe import EvoFE
# 加载数据
bc = load_breast_cancer(as_frame=True)
df = pl.from_pandas(bc.frame)
X, y = df.drop("target"), df["target"].to_numpy()
X_train, X_test, y_train, y_test = train_test_split(
X.to_numpy(), y, test_size=0.2, random_state=42, stratify=y
)
X_train_df = pl.DataFrame(X_train, schema=X.columns)
X_test_df = pl.DataFrame(X_test, schema=X.columns)
# 1. 初始化 EvoFE
evo = EvoFE(
task="classification",
evaluator="lightgbm", # "lightgbm" | "xgboost"
pop_size=15,
n_generations=10,
cv_folds=3,
verbose=True,
random_state=42,
)
# 2. 拟合:运行进化搜索
evo.fit(X_train_df, y_train)
# 3. 检查进化后的配方
recipe = evo.get_recipe()
print(f"发现了 {len(recipe.genes)} 个高影响力特征:")
for gene in recipe.genes:
print(f" • {gene.to_formula()} -> {gene.output_col}")
# 4. 变换与预测
preds = evo.predict(X_test_df)
proba = evo.predict_proba(X_test_df)
```
**为什么不用暴力特征生成?**
暴力生成库会预先生成数千个特征,导致严重的过拟合、巨大的内存消耗以及损害树模型的共线性噪声。py-evoFE 利用进化选择压力与复杂性惩罚,发现真正提升泛化能力的紧凑、简洁的特征配方。
我非常希望大家在自己的数据集或 Kaggle 基准测试中尝试使用!欢迎在 GitHub 上提供反馈、问题和功能请求。
相似文章
结构化数据的进化特征工程
介绍进化特征工程(EFE),一种利用基于LLM的进化来自动发现结构化数据预处理变换的框架,在保持可解释性的同时提高时间序列预测和表格预测的准确性。
PACEvolve++:提升进化搜索代理的测试时学习能力
本文介绍了 PACEvolve++,这是一种强化学习框架,通过将假设生成与执行解耦,提高了进化搜索代理在测试时的策略适应能力。
EvoMap/evolver
Evolver 是一个由 GEP 驱动的 AI 代理自演化引擎,可自动化提示词优化并创建可审计、可复用的演化资产。该项目正从完全开源过渡到源代码可用,同时保持与现有 MIT 和 GPL-3.0 版本的向后兼容性。
使用LLM进行特征生成:一种进化算法方法
本文提出了一种方法,利用大型语言模型通过进化算法从表格数据中生成新特征,在多个数据集上展示了分类效果的提升。
EVOTS: 用于时间序列预测的进化Transformer搜索
提出了一种进化神经架构搜索框架(EvoTS),用于发现任务自适应的类Transformer模型,用于多变量时间序列预测。该方法使用模块化基因组表示,并在ETT基准数据集上取得了竞争性的性能。