特征工程详解

00:00
6 min Intermediate 2026/6/14

特征选择、特征提取、特征构造方法与自动化特征工程。

1. 特征工程概述

特征工程是将原始数据转化为更能代表问题本质的特征的过程,往往决定了模型性能的上限。

1.1 核心原则

“Feature engineering is the art of extracting more information from existing data.” — 吴恩达

原则说明
相关性特征与目标变量相关
互斥性特征之间尽量不冗余
可解释性特征有业务含义
稳定性特征分布随时间不剧烈变化

2. 特征选择

2.1 过滤法(Filter)

方差阈值:删除方差过小的特征(几乎不变化)

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.01)
X_selected = selector.fit_transform(X)

相关系数:删除与目标相关性极低的特征

互信息:衡量特征与目标的信息依赖

卡方检验:类别特征与目标变量的独立性检验

2.2 包装法(Wrapper)

递归特征消除(RFE)

1. 用所有特征训练模型
2. 根据特征重要性删除最不重要的特征
3. 重复直到达到目标特征数
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier
rfe = RFE(RandomForestClassifier(), n_features_to_select=20)
X_selected = rfe.fit_transform(X, y)

2.3 嵌入法(Embedded)

方法原理特点
L1正则化稀疏解自动选择特征自动但可能不稳定
树模型重要性基于分裂增益非线性关系
正则化路径观察正则化强度与特征选择可解释

2.4 方法对比

方法计算量考虑模型特征交互过拟合风险
过滤法
包装法
嵌入法部分

3. 特征提取

3.1 数值特征

方法公式/说明适用场景
标准化正态分布特征
归一化有界特征
对数变换右偏分布
Box-Cox一般偏态
分箱等频/等宽/决策树分箱非线性关系

3.2 类别特征

方法说明维度适用场景
One-Hot每个取值一个二值列低基数
Label Encoding整数编码1有序类别
Target Encoding用目标均值编码1高基数
Frequency Encoding用频率编码1高基数
Embedding学习低维向量深度学习

Target Encoding

其中 为类别 的样本数, 为类别 的目标均值, 为平滑参数。

3.3 时间特征

特征提取方式示例
/月/日/时时间分解2024, 1, 15, 10
星期几dayofweekMonday=0
是否周末is_weekend0/1
是否假日is_holiday0/1
距今天数delta_days30
周期编码sin/cos

周期编码

3.4 文本特征

方法说明
Bag of Words词频向量简单稀疏
TF-IDF词频-逆文档抑制常见词
N-gram连续N个词的组合捕获局部语序
Word2Vec嵌入向量语义信息
文本统计、标数、数比例快速特征

TF-IDF

4. 特征构造

4.1 交叉特征

# 交互特征
X['area'] = X['length'] * X['width']
X['price_per_area'] = X['price'] / X['area']

4.2 多项式特征

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, interaction_only=True)
X_poly = poly.fit_transform(X)

4.3 聚合特征

聚合方式说明示例
群组统计类别聚合用户历史平均消费额
时间窗口滚动统计最近7天交易次数
滞后特征历史前一天销售额
差分特征变化销售额变化

5. 自动化特征工程

5.1 Featuretools

import featuretools as ft

es = ft.EntitySet(id='sales')
es.add_dataframe(dataframe_name='orders', dataframe=orders, index='order_id')
es.add_dataframe(dataframe_name='customers', dataframe=customers, index='customer_id')

es.add_relationship('customers', 'customer_id', 'orders', 'customer_id')

feature_matrix, feature_defs = ft.dfs(
    entityset=es,
    target_dataframe_name='customers',
    agg_primitives=['mean', 'sum', 'count', 'max'],
    trans_primitives=['month', 'year', 'day']
)

5.2 特征工程最佳实践

  1. 先建立基线:用原始特征训练模型
  2. 逐步添加:每次添加一特征,观察效果
  3. 删除冗余相关特征保留一个
  4. 防止泄露:不用未来信息构造特征
  5. 记录过程:每个特征的业务含义和构造逻辑

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式