特征工程入门:从原始数据到模型可用特征
模型性能的上限由数据和特征决定,算法的选择往往只是逼近这个上限。对于占企业 AI 应用大头的表格数据,特征工程依然是决定成败的关键一步。本文讲清它的核心环节,以及为什么在深度学习时代它仍不可替代。
为什么特征工程仍然重要
- “数据和特征决定了机器学习性能的上限,模型和算法只是去逼近这个上限” 是圈内被广泛引用的经验判断。已核验
- 在 Kaggle 与大量工业表格任务中,梯度提升树(XGBoost、LightGBM、CatBoost)常优于神经网络,而树模型能否发挥好,仍依赖人工构造的高质量特征。待核实
- 原始数据常有缺失、量纲不一、类别混杂等问题,直接喂给模型会让距离与梯度计算失真。已核验
数值特征:归一化、标准化与分箱
数值特征的三种常见处理:
- 归一化(Min-Max):把值缩放到 [0,1],公式为 x’ = (x - min) / (max - min)。对边界敏感,适合已知分布范围或需要固定区间的场景(如像素、神经网络输入)。已核验
- 标准化(Z-score):x’ = (x - mean) / std,使均值约 0、方差约 1。对异常值比归一化稳健,是线性模型、SVM、KNN 的常用默认。已核验
- 分箱(离散化):把连续值切成若干区间,如把年龄切成「少年/青年/中年/老年」。能缓解异常值、捕获非线性,但会损失精度。已核验
注意:树模型(如随机森林、XGBoost)对特征缩放不敏感,无需归一化与标准化;而线性模型、KNN、SVM、神经网络对缩放敏感。已核验
import numpy as np
# 归一化与标准化示意
x = np.array([10.0, 20.0, 30.0, 40.0, 1000.0]) # 末位为异常大值
x_minmax = (x - x.min()) / (x.max() - x.min())
x_std = (x - x.mean()) / x.std()
print(x_minmax.round(3))
print(x_std.round(3))
类别特征:One-Hot 与目标编码
- One-Hot 编码:把含 k 个取值的类别列展开为 k 个 0/1 列,每类占一列。无大小顺序假设,但类别基数大时维度爆炸。已核验
- 目标编码(Target Encoding):用该类别对应的目标变量均值替换类别值,能捕捉类别与标签的关系。风险是过拟合与标签泄露,须配合交叉验证或平滑。待核实
- 序数编码(Ordinal):仅当类别天然有序(如低/中/高)时适用,否则会误导模型认为类别间存在数值大小。已核验
原始类别列 color: [红, 绿, 蓝, 红]
One-Hot 展开:
color_红 = [1, 0, 0, 1]
color_绿 = [0, 1, 0, 0]
color_蓝 = [0, 0, 1, 0]
缺失值与异常值处理
- 缺失值:少量缺失且非随机时可删除对应行/列;更常用均值、中位数或众数填充;也可用模型(如 KNN、树)预测填充。中位数比均值更抗异常值。已核验
- 异常值:用箱线图 IQR 法(超出 Q1-1.5·IQR 或 Q3+1.5·IQR)或 Z-score(|z|>3)识别;处理方式包括删除、截断(Winsorize)或单独编码为「是否为异常」标志位。已核验
- 关键原则是先理解异常来源(录入错误、极端但真实、传感器故障),再决定保留还是修正,而非无脑删除。已核验
特征构造、选择,以及它和深度学习的区别
- 特征构造:基于领域知识组合或变换已有字段,如从时间戳拆出「星期几/是否节假日」,做两特征之比、多项式交互项。好的构造常比换模型带来更大收益。待核实
- 特征选择:过滤式(相关系数、互信息)、包裹式(递归特征消除 RFE)、嵌入式(L1/Lasso 惩罚自动稀疏)。目标是降维、降过拟合、提可解释性。已核验
- 与深度学习的区别:深度学习是「表示学习」,能从原始像素、文本、语音中自动学到层次化特征,弱化人工工程;但在结构化表格数据上,人工特征工程叠加树模型依旧很有竞争力。已核验
两类范式对比
人工特征工程路径:
原始数据
清洗、编码、缩放、构造
表格特征
树模型
深度学习路径:
原始信号
神经网络(自动提取)
端到端表示
预测
小结
- 特征工程决定模型性能上限,算法只是逼近它;表格数据任务中它依旧是胜负手。已核验
- 数值特征看归一化、标准化与分箱,树模型免缩放、距离与梯度类模型需缩放。已核验
- 类别特征优先 One-Hot,高基数或需捕捉标签关系时考虑目标编码(须防泄露)。已核验
- 缺失值与异常值要先诊断来源,再选填充、截断或编码,忌无脑删除。已核验
- 构造靠领域知识,选择靠过滤、包裹、嵌入式;深度学习自动提取特征,但表格上人工工程仍强。已核验
参考与延伸阅读
- Scikit-learn 用户指南「Preprocessing data」:系统讲解缩放、编码、缺失值处理 API。 https://scikit-learn.org/stable/modules/preprocessing.html
- Kaggle 学习板块「Feature Engineering」:面向竞赛的实战教程。 https://www.kaggle.com/learn/feature-engineering
- 周志华《机器学习》(西瓜书)第 11 章「特征选择与稀疏学习」。 清华大学出版社,2016。
- 李宏毅《机器学习》课程「Feature Engineering」相关章节。 https://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.php
本文累计阅读 — 次