跳转至

特征工程

特征工程是将原始数据转换为更适合机器学习模型的特征的过程。在传统机器学习中,特征工程往往比模型选择更重要——"数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。"

特征工程概述

为什么特征工程重要?

  • 提升模型性能:好的特征可以让简单模型达到复杂模型的效果
  • 加速训练:减少冗余特征可以显著加速训练过程
  • 增强可解释性:有意义的特征让模型决策更容易理解
  • 减少过拟合:移除噪声特征有助于提升泛化能力

特征工程的一般流程

  1. 数据探索与理解
  2. 缺失值处理
  3. 特征编码
  4. 特征缩放
  5. 特征构造
  6. 特征选择
  7. 验证与迭代

特征选择

特征选择旨在从原始特征中选择最有价值的子集,去除冗余和噪声特征。

Filter 方法

Filter 方法独立于模型,仅依据统计指标评估特征与目标变量的相关性。

相关系数(Pearson Correlation):

衡量特征 \(X\) 与目标 \(Y\) 之间的线性相关性:

\[ r_{XY} = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2 \sum_{i=1}^{n}(y_i - \bar{y})^2}} \]

\(|r_{XY}|\) 接近 1 表示强线性相关。注意:Pearson 相关系数只能捕捉线性关系。

互信息(Mutual Information):

互信息衡量特征 \(X\) 与目标 \(Y\) 之间的任意依赖关系(包括非线性):

\[ I(X; Y) = \sum_{x \in X} \sum_{y \in Y} p(x, y) \log \frac{p(x, y)}{p(x)p(y)} \]

对于连续变量,可以使用 KNN 估计互信息(如 sklearn.feature_selection.mutual_info_classif)。

方差阈值(Variance Threshold):

移除方差低于阈值的特征。如果一个特征几乎不变化,它不太可能携带有用信息:

\[ \text{Var}(X) = \frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})^2 < \tau \]

其他 Filter 方法:

  • 卡方检验:适用于分类特征与分类目标
  • ANOVA F 检验:适用于连续特征与分类目标
  • Fisher Score:类间方差与类内方差之比

Wrapper 方法

Wrapper 方法将特征选择视为搜索问题,使用模型性能作为评估标准。

递归特征消除(RFE):

  1. 用所有特征训练模型
  2. 评估每个特征的重要度(如线性模型的系数绝对值)
  3. 移除最不重要的特征
  4. 重复步骤 1-3,直到达到目标特征数

RFE 的时间复杂度较高,为 \(O(d \cdot T_{\text{train}})\),其中 \(d\) 为特征数。

其他 Wrapper 方法:

  • 前向选择(Forward Selection):从空集开始,每次加入一个最优特征
  • 后向消除(Backward Elimination):从全集开始,每次移除一个最差特征
  • 遗传算法:使用进化策略搜索最优特征子集

Embedded 方法

Embedded 方法在模型训练过程中自动执行特征选择。

L1 正则化(Lasso):

\[ \min_{\mathbf{w}} \frac{1}{2n}\|\mathbf{y} - \mathbf{X}\mathbf{w}\|_2^2 + \alpha\|\mathbf{w}\|_1 \]

L1 正则化会将不重要特征的系数压缩为零,实现稀疏化。\(\alpha\) 越大,被置零的系数越多。

树模型特征重要度:

  • 基于分裂的重要度:计算每个特征在所有树中被选为分裂特征时带来的信息增益之和
  • 基于排列的重要度:打乱某个特征后,模型预测性能的下降量
方法类型 优点 缺点 典型方法
Filter 计算速度快、独立于模型 忽略特征间交互 相关系数、互信息、卡方检验
Wrapper 考虑特征交互 计算成本高、容易过拟合 RFE、前向选择
Embedded 效率与效果兼顾 依赖于特定模型 Lasso、树模型重要度

特征构造

特征构造是基于领域知识和数据特点,从现有特征中创建新特征的过程。

多项式特征

对于特征 \(x_1, x_2\),生成二次多项式特征:

\[ \phi(\mathbf{x}) = [1, x_1, x_2, x_1^2, x_1 x_2, x_2^2] \]

sklearn.preprocessing.PolynomialFeatures 可以自动生成指定阶数的多项式特征。

注意:高阶多项式会导致特征数量爆炸(\(d\) 个特征的 \(k\) 阶多项式产生 \(\binom{d+k}{k}\) 个特征),需要配合正则化使用。

交互特征

手动创建有业务含义的交互特征,例如:

  • 电商总消费金额 / 购买次数 = 客单价
  • 金融负债总额 / 年收入 = 负债收入比
  • 广告点击次数 / 展示次数 = 点击率

时间特征提取

从时间戳中提取多种有意义的特征:

  • 周期性特征:年、月、日、小时、星期几、是否周末
  • 时间差特征:距上次购买的天数、注册至今的天数
  • 滑动窗口特征:过去 7 天/30 天的均值、最大值、标准差
  • 正弦/余弦编码:对周期性特征编码以保留循环性:
\[ x_{\sin} = \sin\left(\frac{2\pi \cdot \text{hour}}{24}\right), \quad x_{\cos} = \cos\left(\frac{2\pi \cdot \text{hour}}{24}\right) \]

文本特征

  • 词袋模型(BoW):统计词频
  • TF-IDF
\[ \text{TF-IDF}(t, d) = \text{TF}(t, d) \times \log\frac{N}{\text{DF}(t)} \]
  • 词嵌入:Word2Vec、GloVe 等预训练嵌入的平均值

特征编码

将非数值特征转换为数值形式是建模的必要步骤。

One-Hot Encoding

将类别特征转换为二进制向量。例如颜色 \(\{红, 绿, 蓝\}\) 编码为:

  • 红:\([1, 0, 0]\)
  • 绿:\([0, 1, 0]\)
  • 蓝:\([0, 0, 1]\)

适用场景:类别数较少(\(< 20\))的无序类别特征。高基数特征会导致维度灾难。

Label Encoding

将每个类别映射为一个整数:红 \(\to 0\),绿 \(\to 1\),蓝 \(\to 2\)

注意:Label Encoding 会引入人为的大小关系,通常只适用于有序类别(如学历:高中 < 本科 < 硕士 < 博士)或树模型(树模型不受顺序影响)。

Target Encoding

用目标变量的条件均值替换类别值:

\[ \text{TE}(x_k) = \frac{n_k \cdot \bar{y}_k + m \cdot \bar{y}_{\text{global}}}{n_k + m} \]

其中 \(n_k\) 为类别 \(k\) 的样本数,\(\bar{y}_k\) 为类别 \(k\) 的目标均值,\(m\) 为平滑参数,\(\bar{y}_{\text{global}}\) 为全局目标均值。

风险:容易导致目标泄露(target leakage),必须在交叉验证内进行编码。

WoE(Weight of Evidence)

主要用于信用评分领域:

\[ \text{WoE}_i = \ln\frac{p(\text{Good}_i)}{p(\text{Bad}_i)} = \ln\frac{n_{i,\text{good}}/N_{\text{good}}}{n_{i,\text{bad}}/N_{\text{bad}}} \]

对应的信息值(IV)衡量特征的预测能力:

\[ \text{IV} = \sum_i \left(\frac{n_{i,\text{good}}}{N_{\text{good}}} - \frac{n_{i,\text{bad}}}{N_{\text{bad}}}\right) \cdot \text{WoE}_i \]
IV 范围 预测能力
\(< 0.02\) 无用
\(0.02 - 0.1\)
\(0.1 - 0.3\) 中等
\(0.3 - 0.5\)
\(> 0.5\) 可疑(可能过拟合)

特征缩放

不同特征的量纲和数值范围差异可能严重影响模型性能。

StandardScaler(标准化)

将特征缩放到均值为 0、标准差为 1:

\[ x' = \frac{x - \mu}{\sigma} \]

适用场景:大多数模型,尤其是基于距离的模型(SVM、KNN)和梯度优化的模型(线性回归、神经网络)。

MinMaxScaler(归一化)

将特征缩放到 \([0, 1]\) 区间:

\[ x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}} \]

适用场景:需要有界输入的模型(如神经网络的某些激活函数)。对异常值敏感。

RobustScaler

使用中位数和四分位距,对异常值更鲁棒:

\[ x' = \frac{x - \text{median}(X)}{\text{IQR}(X)} \]

其中 \(\text{IQR} = Q_3 - Q_1\)

缩放方法 是否保持分布形状 对异常值敏感 适用场景
StandardScaler 通用、基于梯度的模型
MinMaxScaler 非常敏感 有界输入、图像数据
RobustScaler 含异常值的数据

注意:树模型(决策树、随机森林、XGBoost 等)对特征缩放不敏感。


缺失值处理

常用插补策略

策略 方法 适用场景
删除 删除含缺失值的行或列 缺失比例低(\(< 5\%\)
均值/中位数 用特征的均值或中位数填充 数值特征、缺失随机
众数 用最频繁的值填充 类别特征
常数 用特定值(如 -1, "Unknown")填充 缺失本身有意义
插值 线性插值、样条插值 时间序列数据
KNN 插补 用最近邻的值填充 样本间有相似性

MICE(Multiple Imputation by Chained Equations)

MICE 是一种多重插补方法,迭代地对每个含缺失值的特征进行条件建模:

  1. 对所有缺失值进行初始填充(如均值填充)
  2. 对于每个含缺失值的特征 \(X_j\): - 将 \(X_j\) 视为目标变量,其他特征作为输入 - 用非缺失样本训练回归模型 - 用训练好的模型预测缺失值
  3. 重复步骤 2 多轮,直到收敛
  4. 重复整个过程 \(M\) 次,生成 \(M\) 个完整数据集

MICE 的优势在于能利用特征间的相关性,并且通过多重插补量化不确定性。


自动特征工程

Featuretools

Featuretools 是一个自动特征工程库,基于深度特征合成(Deep Feature Synthesis, DFS)

  • 定义实体集和关系(如用户-订单-商品的关系)
  • 自动生成聚合特征(如每个用户的平均订单金额)和转换特征(如时间差)
  • 支持自定义原语(primitives)

AutoFeat

AutoFeat 自动构造并选择非线性特征:

  1. 通过特征的算术运算(加减乘除、对数、平方根等)生成大量候选特征
  2. 使用 L1 正则化从候选特征中选择最有用的子集
  3. 生成可解释的特征表达式

特征工程 Pipeline 最佳实践

防止数据泄露

  • 所有变换必须在训练集上拟合,然后应用到测试集
  • 使用 sklearn.pipeline.Pipeline 确保正确的顺序
  • Target Encoding 必须在交叉验证内部进行

推荐的 Pipeline 顺序

原始数据
  → 缺失值处理(MICE / 简单插补)
  → 特征编码(One-Hot / Target Encoding)
  → 特征构造(多项式 / 交互特征)
  → 特征缩放(StandardScaler / RobustScaler)
  → 特征选择(Embedded / Filter)
  → 模型训练

注意事项

  • 先分割数据,再做特征工程:避免用测试集信息影响训练
  • 记录所有变换:确保生产环境能复现训练时的特征处理
  • 监控特征漂移:部署后持续监控特征分布的变化
  • 保持简洁:特征不是越多越好,过多的特征可能导致过拟合和维护困难

不同模型对特征工程的需求

模型 是否需要缩放 是否需要编码 能否处理缺失值 是否需要特征选择
线性回归/逻辑回归 推荐
SVM 推荐
KNN 推荐
决策树 否(可用 Label) 部分支持 可选
Random Forest 否(可用 Label) 部分支持 可选
XGBoost / LightGBM 部分需要 可选
神经网络 推荐

评论 #