特征工程详解

6 minIntermediate2026/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)

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

rxy=(xixˉ)(yiyˉ)(xixˉ)2(yiyˉ)2r_{xy} = \frac{\sum(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum(x_i - \bar{x})^2 \sum(y_i - \bar{y})^2}}

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

I(X;Y)=x,yp(x,y)logp(x,y)p(x)p(y)I(X;Y) = \sum_{x,y} p(x,y) \log \frac{p(x,y)}{p(x)p(y)}

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

χ2=(OijEij)2Eij\chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}}

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 数值特征

方法公式/说明适用场景
标准化z=xμσz = \frac{x - \mu}{\sigma}正态分布特征
归一化x=xminmaxminx' = \frac{x - \min}{\max - \min}有界特征
对数变换x=log(x+1)x' = \log(x + 1)右偏分布
Box-Coxx=xλ1λx' = \frac{x^\lambda - 1}{\lambda}一般偏态
分箱等频/等宽/决策树分箱非线性关系

3.2 别特征

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

Target Encoding

TE(c)=ncyˉc+myˉnc+m\text{TE}(c) = \frac{n_c \cdot \bar{y}_c + m \cdot \bar{y}}{n_c + m}

其中 ncn_ccc 的样本数,yˉc\bar{y}_ccc 的目标均值,mm 为平滑参数。

3.3 时间特征

特征提取方式示例
年/月/日/时时间分解2024, 1, 15, 10
星期几dayofweekMonday=0
是否周末is_weekend0/1
是否节假日is_holiday0/1
距今天数delta_days30
周期编码sin/cossin(2πh/24)\sin(2\pi h/24)

周期编码

xsin=sin(2πtT),xcos=cos(2πtT)x_{\sin} = \sin\left(\frac{2\pi t}{T}\right), \quad x_{\cos} = \cos\left(\frac{2\pi t}{T}\right)

3.4 文本特征

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

TF-IDF

TF-IDF(t,d)=TF(t,d)×logNDF(t)\text{TF-IDF}(t, d) = \text{TF}(t, d) \times \log\frac{N}{\text{DF}(t)}

4. 特征构造

4.1 交叉特征

xnew=x1×x2x_{new} = x_1 \times x_2

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

4.2 多项式特征

xnew=x12,x1x2,x22,x_{new} = x_1^2, x_1 x_2, x_2^2, \ldots

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. 记录过程:每个特征的业务含义和构造逻辑