外观
特征工程
概念定义:模型的"营养配方"
特征(feature)是模型的输入原料。特征工程(feature engineering)就是把原始数据(原始表、日志、文本、图像)加工成模型能有效利用的数值特征的全过程。同样的数据和模型,特征工程做得好坏,效果可以差出几个数量级——经典机器学习时代有句名言:"特征工程决定上限,模型只是逼近这个上限。"
深度学习出现后,神经网络能自动学特征(表征学习),但特征工程远未过时:
- 表格数据(金融、电商、医疗)依然是主流业务场景,树模型/线性模型都依赖手工特征;
- 深度模型里的数据预处理(归一化、编码、增强)本质还是特征工程;
- 业务知识("用户最近 7 天购买次数")是模型永远学不出来的先验,必须人来做。
一、特征工程全景清单
按处理顺序,特征工程分五层:
原始数据 → ①清洗与缺失值 → ②数值缩放与变换 → ③类别编码 → ④特征构建 → ⑤特征选择1. 缺失值处理
| 策略 | 做法 | 适用 |
|---|---|---|
| 删除 | 删行/删列 | 缺失比例极高(>80%)或与目标无关 |
| 统计填充 | 均值/中位数/众数 | 数值型随机缺失(简单基线) |
| 模型填充 | KNN/回归预测缺失值 | 缺失模式与其它特征相关 |
| 标记缺失 | 新增"是否缺失"标志列 | 缺失本身含信息(如"没填收入") |
| 业务填充 | 用业务规则填(如 0、默认值) | 有明确业务语义 |
缺失值处理的三大坑
- 均值填充会低估方差——分布被压扁,模型学到错误的不确定性;
- 填充统计量必须只用训练集算(否则数据泄露);
- "缺失"本身常是信号——比如"无职业信息"的用户往往风险更高,加一列 is_missing 往往有奇效。
2. 数值缩放与变换
| 方法 | 公式 | 特点 | 适用 |
|---|---|---|---|
| 标准化(Z-score) | (x-μ)/σ | 均值 0 方差 1,保留分布形状 | 线性模型、SVM、神经网络(默认) |
| 归一化(Min-Max) | (x-min)/(max-min) | 映射到 [0,1],受异常值影响大 | 需要固定取值范围时 |
| 稳健缩放 | (x-中位数)/IQR | 抗异常值 | 数据有极端值 |
| 对数/幂变换 | log(x)、x^λ(Box-Cox) | 压缩长尾、纠正右偏 | 收入、价格、点击量等偏态数据 |
树模型不需要缩放(决策树按阈值切分,与量纲无关)——这也是树模型在表格数据上"省事"的原因之一。线性模型、KNN、SVM、神经网络则必须缩放,否则量纲大的特征会主导距离/梯度。
3. 类别编码
| 方法 | 做法 | 特点 | 适用 |
|---|---|---|---|
| Label Encoding | 类别映射到整数 0,1,2… | 引入虚假大小关系 | 有序类别(低/中/高) |
| One-Hot Encoding | 每个类别一个 0/1 列 | 无顺序假设,但列数爆炸 | 无序低基数类别(默认) |
| 目标编码(Target Encoding) | 用该类别的目标均值编码 | 信息密度高,但易过拟合(需交叉验证内编码) | 高基数类别(城市、用户 ID) |
| 频率编码 | 用类别出现次数编码 | 简单稳健,捕捉流行度 | 高基数类别 |
| Embedding | 学习稠密向量表示 | 最强但最重 | 深度模型 |
One-Hot 与高基数的矛盾是表格建模的核心痛点:城市 1000 个 → one-hot 1000 列,稀疏又爆炸。此时目标编码/频率编码/嵌入是更优解。
4. 特征构建(业务特征的来源)
- 统计特征:聚合(均值/最大/最小/标准差/计数/占比)——"用户过去 30 天消费金额的均值";
- 时间特征:年/月/日/星期/节假日/距上次事件间隔/时段——季节性与周期性信号;
- 组合特征:特征交叉(如"城市 × 品类")——模型学不出的交互先验,树模型可部分自动学;
- 比率特征:转化率、客单价、增速——把绝对量变成业务含义更强的相对量;
- 文本/图像特征:TF-IDF、embedding、统计(长度、词数)。
特征构建的核心原则:从业务问题出发。"这个业务场景里,专家看什么指标做决策?"——把专家决策依据特征化,是最有效的特征来源。
5. 特征选择:删掉没用的
特征太多(尤其 one-hot 后上万列)会引入噪声、拖慢训练、损害可解释性。三大类方法:
| 类别 | 方法 | 特点 |
|---|---|---|
| 过滤法(Filter) | 方差阈值、相关系数、卡方、互信息 | 快,独立于模型,忽略交互 |
| 包裹法(Wrapper) | 前向/后向选择、递归特征消除(RFE) | 考虑模型表现,计算贵 |
| 嵌入法(Embedded) | L1 正则(Lasso)、树模型特征重要性、SHAP | 训练时自动选,实践首选 |
实践首选:树模型特征重要性 + 相关性去重——快、稳、与模型一致。L1 正则自带稀疏性,见过拟合与正则化。
二、不同数据类型的特征工程
| 数据类型 | 核心特征工程 |
|---|---|
| 表格 | 上述全部:缺失、缩放、编码、聚合、组合 |
| 时间序列 | 滞后特征(lag)、滚动统计(rolling mean/std)、差分、时间分解(趋势/季节/残差) |
| 文本 | 清洗(分词、去停用词)、TF-IDF/BOW、词向量/句向量、长度与结构特征 |
| 图像 | 归一化、尺寸统一、数据增强(翻转/裁剪/颜色抖动)、预训练特征提取 |
| 类别/ID | 频率编码、目标编码、embedding、图结构特征(用户-物品交互) |
三、特征工程的原则与流程
迭代原则:先简单基线,再按证据加特征
正确流程不是"一次把所有特征做全",而是:
- 先上最小可用特征集(原始数值列 + 简单编码),跑出基线;
- 用错误分析和特征重要性找改进方向(哪个错误类型多?哪些特征有用?);
- 一次只加一个特征组,用验证集确认确实涨点再加下一个;
- 特征只增不删会导致过拟合与维护灾难——定期做特征选择。
"我造了 200 个特征"不是成绩,"每个特征都有它存在的证据"才是。
训练/推理一致性(特征泄漏的根源)
特征工程的终极陷阱是训练特征与线上推理特征不一致:
- 训练时用了"未来信息"(如用整月均值预测月初)→ 上线后特征拿不到;
- 填充/缩放的统计量在训练时用全量算,线上只拿到新样本;
- 特征延迟:线上特征到达时间晚于训练假设的时间点。
对策:特征计算的每一个统计量都只依赖"预测时刻之前可见的数据";用特征存储(feature store)统一训练/推理的特征计算逻辑。详见数据与数据工程与MLOps 与模型部署。
四、特征工程 vs 表征学习
值得澄清的关系:深度学习用表征学习自动从原始数据学特征(CNN 学边缘→部件→物体,Transformer 学词义→句法→语义),把一部分特征工程自动化了。但:
- 深度模型学的是"通用表征",业务先验("周末转化率高")仍需人给;
- 结构化表格数据上,表征学习至今没有完胜手工特征 + 树模型的普遍证据;
- 实践中两者常结合:预训练模型提取特征(embedding)→ 喂给树模型/线性模型。
所以结论不是"特征工程过时了",而是特征工程的重心从"手工设计全部特征"转向"设计数据管道 + 选择/组合自动特征 + 注入业务先验"。
五、权衡与取舍
- 特征数量 vs 模型复杂度:特征越多,模型越要防过拟合(L1、深度、正则化)。特征工程的目标不是"多"而是"有用"。
- 手工特征 vs 自动表征:小数据、要解释 → 手工特征;大数据、非结构化 → 表征学习;中间态 → 混合。
- 特征工程成本 vs 收益:一个优秀业务特征(如"距上次购买天数")可能比十轮调参涨点更多——先做特征,再调参,顺序别反。
- 可解释性:特征越业务化(可命名、可解释),模型越可信;embedding 特征难解释但更强。二者按场景取舍。
延伸阅读
- 数据与数据工程——特征的上游:数据清洗与管道
- 监督学习——特征服务的模型
- 模型评估与验证——如何证明特征真的有用
- 过拟合与正则化——特征太多时的对策
- 树模型与集成学习——特征重要性的实践来源
- 调参与超参数优化——特征与超参的联合搜索