/knowledge/feature-engineering
特征工程与数据准备
分析中光鲜的部分是模型。真正决定它行不行的部分,是它之前的一切——清洗、转换,并把数据塑造成特征。这是工作的大头,也是最值得做好的部分。
- 学于
- 特征工程与数据准备基础 · 真正的那 80%
- 时间
- 数据科学 · 墨尔本大学
- 应用于
- 每个项目的大头
- 阅读 / 复习
- 约 15 分钟阅读2026-06-26
数据科学里有一句老话:你花 80% 的时间准备数据,20% 的时间抱怨它。这是个玩笑,但比例是真的。 模型——那个抢走注意力的部分——往往是几行代码和一个下午。数据准备与特征工程——把杂乱的原始记录变成干净、有信息量的输入——才是大部分努力的去向, 也是最终准确度大多在此赢得或丢掉之处。
底下的原则很直白:垃圾进,垃圾出。最精密的模型也救不了糟糕的输入,而一个在 精心设计的特征上跑的简单模型,常常胜过一个在原始数据上跑的花哨模型。这一页是那门准备的手艺, 端到端——以及那一个比任何其他都更悄悄地使更多分析失效的错误。
01
不光鲜的那 80%
一个特征不过是模型所看到的一个输入变量。特征工程是「决定那些输入 应当是什么、并把原始数据弄成那个形状」的工作:修好坏掉的、转换别扭的、创造尚不存在的。它 紧接在数据处理页上的数据整理之后、 紧接在建模之前,是整条流水线中杠杆最高的阶段。
它由三类工作构成,本页的其余部分依次讲每一类:
- 清洗——处理缺失值、离群点与错误类型,好让数据可信。
- 转换——缩放、归一化、编码,好让每个特征都处于模型能用的形式。
- 创造——组合并派生出更直接地暴露信号的新特征。
02
清洗与缺失数据
真实数据缺着值,而你如何处理这些缺口,比人们预期的更要紧——因为一个值为什么缺失,改变了什么做法才安全。标准的分类法:
- MCAR(完全随机缺失)——缺口与任何东西都无关;最无害的情形。
- MAR(随机缺失)——缺失依赖于其他被观测的变量(年长的人跳过某个问题);只要 你把那些变量纳入考虑就可恢复。
- MNAR(非随机缺失)——缺失依赖于缺失的值本身(高收入者不披露收入)。危险的 情形:缺口本身携带信息,而天真地填补会让结果有偏。
选项从丢掉行(若数量少且为 MCAR 则没问题,否则有偏)一直到插补——用均值/中位数、 最频繁的类别,或一个基于模型的猜测(KNN、回归)来填。一个有用的技巧:添加一个「曾缺失」指示列,好让模型能从「缺失」这一事实本身学习——而这恰恰在 MNAR 的情形里最要紧。
03
缩放与变换
特征到来时尺度天差地别——年龄以十计,收入以万计。许多方法对此敏感,所以我们把特征放到一个 共同的基准上。最常见的是标准化(z 分数):减去均值,除以标准差,好让每个特征 均值为 0、标准差为 1:
这对任何使用距离或大小的方法——聚类、PCA、k-NN、梯度下降——都极其要紧。 没有它,尺度最大的特征会仅凭数值上的大小而主导,不管它实际相关性如何。(缩放到固定的 [0, 1] 范围的最小-最大缩放是常见的替代。)
另外,偏斜的变量——收入、人口、计数——往往受益于一次对数变换(或 Box-Cox),它 把一条长长的右尾拉向一个更对称、更模型友好的形状。贯穿始终的目标都一样:以「其信号最易被 使用」的形式呈现每个特征。
04
类别编码
模型吃的是数字,但许多真实数据是类别的——一个街区、一个状态、一个类型。编码把类别变成数字, 而方法必须尊重数据:
- 独热编码——每个类别一个二元列(「NSW」→ [1, 0, 0])。无序类别的安全 默认,但对高基数字段它会让列数爆炸。
- 序数编码——把有序的类别映射到有序的整数(低/中/高 → 0/1/2)。只有当 顺序是真实的时才正确;误用会发明一个本不存在的排名。
- 目标编码——用每个类别的平均目标值来替换它。对高基数字段(成千上万个邮编)很 强大,但它偷看了目标,所以如果做得草率,它是下面那个泄漏问题的主要来源。
05
创造特征:领域知识获得回报之处
最有价值的一步,往往是发明那些比原始数据更直接地暴露信号的特征。这正是人对问题的 理解胜过任何算法之处:
- 日期成分——一个原始时间戳几乎无用;星期几、月份、是否周末,或「距上次 事件的天数」可以极具预测力。
- 交互项与比率——每平方米价格、负债收入比、每天的事件数。一个比率能用一个 特征捕捉两个原始列藏起来的东西。
- 分箱——当关系不平滑时,把一个连续变量分成若干段(年龄段)。
- 领域特征——任何你对该领域的理解认为应当要紧的东西,明确地做出来,好让 模型不必从零重新发现它。
好的特征创造,是建模中最接近免费午餐的东西:它是一个理解问题的人递给模型一个先发优势之处。
06
大罪:数据泄漏
这就是那个比任何其他都更悄悄地毁掉更多分析的错误,而它就藏在上面那些步骤之中。数据泄漏是指:在预测时本不会真正可得的信息,在训练期间偷偷溜进了特征里。模型 在测试中看起来出色,随后在真实世界里失败——因为它一直在偷看它不会拥有的答案。
经典的版本:你用整个数据集的统计来做标准化或目标编码,然后才拆分成训练与 测试。现在均值与标准差携带了来自测试集的信息——模型已经听见了自己考试的一丝低语。修法是一条 铁律:先拆分,再仅在训练数据上拟合每一个变换,并把那些拟合好的变换应用到 测试集上。(这正是为什么诚实的评估与留出测试对顺序如此较真。)
07
选择特征:少即是多
特征更多并不总是更好。无关的或冗余的特征添加噪声、招致过拟合,并加剧维度灾难。特征选择把 输入修剪到那些配得上自己位置的,大体有三种方式:
- 过滤式——在建模之前,按一个简单的统计量(与目标的相关、互信息)给特征排名。 快且与模型无关。
- 包裹式——尝试子集,保留能改善模型的(前向/后向选择)。彻底但昂贵。
- 嵌入式——让模型在训练时自行选择(Lasso 的 L1 惩罚把弱系数压到零;树的 重要性)。往往是最佳折中点。
08
它在我工作中的体现
09
60 秒回顾
缺失数据的分类法、编码的选择,以及「先拆分再拟合」的泄漏规则,反映了当前的数据准备参考 文献,以及课程学习。