特征工程是机器学习中最耗时耗力的环节,手动构建特征不仅费时费力,还容易遗漏重要特征。今天我要介绍一个特征工程利器 -Featuretools,它能自动从多个相关数据表中发现并生成有价值的特征,大大提升特征工程的效率。
基本概念
Featuretools 的核心是深度特征合成(Deep Feature Synthesis, DFS)算法,通过预定义的特征原语(Feature Primitives)自动组合生成特征。几个关键概念:
EntitySet:数据实体集,用于组织多个相关的数据表
Entity:单个数据表
Relationship:表与表之间的关系
Feature Primitives:特征原语,用于生成新特征的运算规则
来看个简单例子:
import featuretools as ft
import pandas as pd
# 创建示例数据
customers = pd.DataFrame({
“customer_id”: [1, 2, 3],
“joined_date”: [“2020-01-01”, “2020-02-01”, “2020-03-01”]
})
orders = pd.DataFrame({
“order_id”: [1, 2, 3, 4, 5],
“customer_id”: [1, 1, 2, 2, 3],
“order_date”: [“2020-01-15”, “2020-02-15”, “2020-02-20”, “2020-03-15”, “2020-04-01”],
“amount”: [100, 200, 150, 300, 250]
})
# 创建EntitySet
es = ft.EntitySet(id=“customer_orders”)
# 添加实体
es = es.add_dataframe(
dataframe_name=“customers”,
dataframe=customers,
index=“customer_id”
)
es = es.add_dataframe(
dataframe_name=“orders”,
dataframe=orders,
index=“order_id”
)
# 建立关系
es = es.add_relationship(“customers”, “customer_id”, “orders”, “customer_id”)
# 执行特征生成
feature_matrix, feature_defs = ft.dfs(
entityset=es,
target_dataframe_name=“customers”,
max_depth=2
)
特征原语详解
Featuretools 提供了多种特征原语,分为两类:
聚合原语:
COUNT:计数
SUM:求和
AVG:平均值
MAX/MIN:最大/最小值
MODE:众数
转换原语:
YEAR/MONTH:提取时间特征
DIFF:计算差值
DIVIDE:除法运算
ADD_NUMERIC:加法运算
小贴士:
合理设置 max_depth 参数,过大的深度会导致特征数量爆炸
使用 ignore_columns 参数排除不需要的列
可以通过 agg_primitives 和 trans_primitives 参数自定义原语集合
高级用法
想要进一步提升特征质量,可以自定义特征原语:
from featuretools.primitives import AggregationPrimitive
from featuretools.variable_types import Numeric
class CustomMean(AggregationPrimitive):
name = “custom_mean”
input_types = [Numeric]
return_type = Numeric
def get_function(self):
def custom_mean(values):
return values.mean() * 1.5
return custom_mean
# 使用自定义原语
feature_matrix, feature_defs = ft.dfs(
entityset=es,
target_dataframe_name=“customers”,
agg_primitives=[“custom_mean”],
max_depth=2
)
性能优化
处理大规模数据时,可以用这些技巧提升性能:
开启并行计算:
feature_matrix, feature_defs = ft.dfs(
entityset=es,
n_jobs=-1 # 使用所有CPU核心
)
使用分块处理:
feature_matrix = ft.calculate_feature_matrix(
features=feature_defs,
entityset=es,
chunk_size=1000
)
小贴士:
数据量大时记得先做采样测试
可以用 verbose 参数查看特征生成进度
记得定期清理内存,避免OOM
生成的特征要及时做筛选,去掉无用特征
写代码10多年,深感特征工程是个技术活也是个体力活。Featuretools 让我从繁琐的特征构建中解放出来,把时间用在更有价值的模型设计上。不过还是那句话,工具再好也只是辅助,真正的特征工程还得靠对业务的深入理解。
领取专属 10元无门槛券
私享最新 技术干货