特征工程方法:构造、选择与变换

FreeGuideOnline 最新 2026-06-16

特征工程方法:构造、选择与变换

在机器学习管道中,特征工程是将原始数据转化为模型可学习表示的过程。本教程以结构化数据为主要场景,系统讲解特征工程的三大核心模块:变换构造选择。你无需任何特定库的深层知识,但具备基础的 Python 和 Pandas 使用经验会更有利。


1. 为什么特征工程如此重要

模型的上限由数据决定,而算法只是逼近这一上限。特征工程直接影响:

  • 模型性能:合理特征能降低偏置与方差。
  • 可解释性:衍生特征常包含与业务目标对齐的含义。
  • 模型复杂度:通过减少噪声特征,模型训练更快、更轻量。

算法对特征的敏感性不同(线性模型尤其依赖特征质量),因此一套稳健的工程流程是任何项目的必修课。


2. 特征变换:对齐数据尺度与分布

特征变换对数值和类别特征分别处理,解决量纲差异、偏态分布和离散值编码等问题。

2.1 数值特征变换

归一化 (Min‑Max Scaling)

将数据映射至 [0,1] 区间。适合对距离敏感、但对异常值敏感的算法(如 KNN、神经网络)。

[ x_{\text{norm}} = \frac{x - \min(x)}{\max(x) - \min(x)} ]

  • 适用场景:图像像素、梯度下降优化。
  • 注意:异常值会压缩大部分数据的尺度。

标准化 (Z‑Score Normalization)

使数据符合均值为 0、标准差为 1 的分布。对异常值鲁棒性稍好。

[ x_{\text{std}} = \frac{x - \mu}{\sigma} ]

  • 适用算法:线性回归、逻辑回归、支持向量机。
  • 关键点:不要求原始数据正态分布,但会放大对称性假设。

对数变换与幂变换

处理长尾分布,让数据更接近正态。

  • 对数变换 log(x+1):适用于计数、金额等右偏数据。
  • Box‑Cox 变换:要求输入正值,自动优化参数 (\lambda)。
  • Yeo­–Johnson 变换:可处理零和负值。

分箱 (Binning)

将连续值离散化为区间,可捕捉非线性关系,同时丢失粒度信息。

  • 等宽分箱:区间宽度相同,对异常值敏感。
  • 等频分箱:每个箱子样本量近似相等,更稳健。
  • 决策树分箱:用单一特征训练浅层树,使用分裂点作为边界。

2.2 类别特征编码

独热编码 (One‑Hot Encoding)

为每个类别创建二进制哑变量。适用于类别数较少的树模型和线性模型。

  • 问题:高基数类别会引发维度爆炸。
  • 技巧:合并低频类别为“其他”。

标签编码 (Label Encoding)

将类别映射为整数。适用于有序类别,对无序类别可能引入错误顺序关系。

  • 树模型常能容忍标签编码,但线性模型会误解为连续距离。

目标编码 (Target Encoding)

用目标变量的均值(或平滑后的均值)替换类别。有效压缩维度,但极易过拟合。

流程

  1. 在训练集上使用 K 折交叉验证计算均值的编码,防止数据泄露。
  2. 平滑公式:encoded_value = (mean_target_of_category * n + global_mean * m) / (n + m),其中 (m) 是平滑因子。
  • 适用:高基数类别,配合正则化模型。

计数编码

用类别在数据集中出现的频次替换,保存类别流行度信息。


3. 特征构造:从数据中提炼新信息

特征构造需要领域知识和数据探索,目的是显式表达非线性关系、时序趋势和业务规则。

3.1 基础衍生特征

  • 多项式特征:生成特征的幂次方和交叉项,帮助线性模型捕捉非线性。
  • 组合特征:将两个类别特征拼接为新的组合类别,例如 city_zip
  • 比例/差分特征:如 花销/收入当前值与移动平均的差

3.2 时间相关特征

时间戳可拆解出丰富周期性模式:

  • 日期组件:年、月、日、周几、是否周末、季度、是否节假日。
  • 循环编码:将小时、月份等用 sinn 和 cos 变换保留周期性间隔(用于非树模型)。
  • 差值特征:与前一时点的差值,与过去 24 小时均值的差异等。

3.3 聚合统计特征

根据分组(用户、店铺等)计算统计量,再合并回主表:

  • 组内统计:均值、最大/最小值、标准差、偏度。
  • 分组时序统计:最近 7 天的平均值、趋势斜率。
  • 计算时严格区分训练集和测试集的时间边界,避免未来信息泄露。

3.4 文本/非结构数据构造的轻量特征

即使不采用深度文本模型,也可用简单方法获得信息:

  • 文本长度、单词数、大写词比例。
  • 关键词存在性标记(如是否包含“紧急”)。
  • TF‑IDF 矢量后的降维特征(常用 NMF 或截断 SVD)。

4. 特征选择:剔除冗余与噪声

特征选择的目标是保留对预测最有帮助的特征子集,降低过拟合风险、缩短训练时间,并提升可解释性。

4.1 过滤法 (Filter Methods)

基于统计指标独立评估每个特征,速度快但忽略特征间交互。

  • 方差分析:剔除方差极低的常数特征。
  • 相关系数:计算特征与目标之间的皮尔逊或斯皮尔曼相关性,保留高相关者。
  • 互信息:捕捉非线性关系,适用于离散与连续混合型。
  • 卡方检验:用于分类任务中的类别特征独立性检验。

4.2 包裹法 (Wrapper Methods)

将模型性能作为特征子集的评价标准,资源消耗大但效果更好。

  • 递归特征消除 (RFE):训练模型,每次移除最不重要的特征,重复至指定数量。适合线性模型和基于树的 feature_importances_。
  • 前向/后向选择:逐步添加或删除特征,使用交叉验证评分。

4.3 嵌入法 (Embedded Methods)

在模型训练过程中内建特征选择。

  • Lasso 回归 (L1 正则化):许多系数被压缩至零,自然完成特征剔除。
  • 树模型的特征重要性:基于基尼不纯度下降或平均信息增益,设置阈值过滤低贡献特征。
  • 基于模型的正则化路径:如使用 LightGBM 训练后,按重要性累积曲线保留前 95% 贡献的特征。

4.4 维度归约 (进阶过滤)

不同于选择原始特征,维度归约构建新特征空间。

  • 主成分分析 (PCA):线性投影,保留方差最大的方向,适合连续数值数据。
  • 线性判别分析 (LDA):监督降维,最大化类别区分度。
  • t‑SNE / UMAP:主要用于可视化和探索,不建议直接作为训练特征。

5. 完整工作流程与防泄露守则

5.1 构建稳健的特征工程流水线

  1. 数据探查:分析缺失值模式、异常值、偏态、基数。
  2. 基准模型:用简单的原始特征建立基线。
  3. 分阶段工程
    • 先处理缺失值和异常值。
    • 再变换数值和编码类别。
    • 进行特征构造(务必进行验证分割)。
    • 最后做特征选择。
  4. 避免数据泄露
    • 任何基于目标统计的编码都必须在训练集的 fold 内计算。
    • 归一化/标准化的均值方差只从训练集学习,应用于测试集。
    • 时间序列的聚合特征必须基于过去时间窗。
  5. 迭代验证:每轮特征调整后重新评估交叉验证分数,记录特征重要性驱动。

5.2 常见陷阱与最佳实践

  • One‑Hot 狂潮:高基数类别先用目标编码或聚类编码压缩。
  • 特征过多:先用过滤法剔除无方差、最高相关矩阵中相关系数 >0.95 的冗余特征。
  • 盲目归一化:树模型(决策树、随机森林、XGBoost)无需特征缩放,线性模型和 KNN 必须执行。
  • 测试集信息混入:所有变换参数只能来自训练集,使用 fit_transform(train)transform(test) 模式。

6. 从基础到自动特征工程

手动工程依然重要,但可辅以工具提升效率:

  • Featuretools:基于实体关系自动生成聚合和变换特征(深度特征合成)。
  • AutoFE 工具:如 H2O、TPOT 等自动化机器学习框架内建了特征生成模块。
  • 神经网络隐式特征:深度学习可自动学习表示,但仍需要在结构化数据中与工程特征结合使用。

特征工程是科学与艺术的结合。本文介绍的构造、选择与变换方法构成了一个可复用的框架,你可以在各行业项目中反复使用并微调。记住:好的特征胜过复杂的模型。