特征工程方法:构造、选择与变换
特征工程方法:构造、选择与变换
在机器学习管道中,特征工程是将原始数据转化为模型可学习表示的过程。本教程以结构化数据为主要场景,系统讲解特征工程的三大核心模块:变换、构造与选择。你无需任何特定库的深层知识,但具备基础的 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)
用目标变量的均值(或平滑后的均值)替换类别。有效压缩维度,但极易过拟合。
流程:
- 在训练集上使用 K 折交叉验证计算均值的编码,防止数据泄露。
- 平滑公式:
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 构建稳健的特征工程流水线
- 数据探查:分析缺失值模式、异常值、偏态、基数。
- 基准模型:用简单的原始特征建立基线。
- 分阶段工程:
- 先处理缺失值和异常值。
- 再变换数值和编码类别。
- 进行特征构造(务必进行验证分割)。
- 最后做特征选择。
- 避免数据泄露:
- 任何基于目标统计的编码都必须在训练集的 fold 内计算。
- 归一化/标准化的均值方差只从训练集学习,应用于测试集。
- 时间序列的聚合特征必须基于过去时间窗。
- 迭代验证:每轮特征调整后重新评估交叉验证分数,记录特征重要性驱动。
5.2 常见陷阱与最佳实践
- One‑Hot 狂潮:高基数类别先用目标编码或聚类编码压缩。
- 特征过多:先用过滤法剔除无方差、最高相关矩阵中相关系数 >0.95 的冗余特征。
- 盲目归一化:树模型(决策树、随机森林、XGBoost)无需特征缩放,线性模型和 KNN 必须执行。
- 测试集信息混入:所有变换参数只能来自训练集,使用
fit_transform(train)和transform(test)模式。
6. 从基础到自动特征工程
手动工程依然重要,但可辅以工具提升效率:
- Featuretools:基于实体关系自动生成聚合和变换特征(深度特征合成)。
- AutoFE 工具:如 H2O、TPOT 等自动化机器学习框架内建了特征生成模块。
- 神经网络隐式特征:深度学习可自动学习表示,但仍需要在结构化数据中与工程特征结合使用。
特征工程是科学与艺术的结合。本文介绍的构造、选择与变换方法构成了一个可复用的框架,你可以在各行业项目中反复使用并微调。记住:好的特征胜过复杂的模型。