数值型数据:数据清洗#
苹果树结的果子,总是好果与虫果并存,但是在高档超市货架上的苹果却个个剔透。从果园到超市之间的那段路,靠的是工人挑出坏果、给凑合的果打上一层蜡。然而,在 ML 工程里我们也得做同样的事——花大量时间挑出坏例子、把凑合能用的例子修一修。 因为哪怕只是几个坏苹果,也可能毁掉一整筐数据。
数据集里有相当一部分样本是不可靠的,要么缺、要么多、要么错。下面这张表把最常见的四种成因摊开:
| 问题类别 | 例子 |
|---|---|
| 缺漏值(Omitted values) | 普查员漏记了一位居民的年龄。 |
| 重复样本(Duplicate examples) | 一台服务器把同一批日志上传了两次。 |
| 越界特征值(Out-of-range feature values) | 人手误多敲了一位数字。 |
| 坏标签(Bad labels) | 标注员把橡树图错标成了枫树。 |
其中前 3 类是可由程序 / 脚本自动检测的,坏标签就只能靠人抽检或者多个标记者互相校验了。
下面先看前 3 类怎么用脚本揪出来。
自动检测的常见套路#
下面这几类问题,写一个程序或者脚本就能揪出来:
缺漏值
重复样本
越界特征值
下面看两个具体例子。
重复样本#
比如下面这组数据——前 6 个值是重复的,剩下的 8 个值彼此都不重复。

越界值#
再举一个例子。假设某个特征要求温度落在 10 到 30 度之间(含端点),但意外总是会来——温度计临时被太阳一晒,就会扔出一个离谱的越界值。脚本要能把「小于 10 或大于 30」这两种情况都揪出来:

多人标注时的额外校验#
当标签由多个标记者共同给出时,我们建议先做一个统计层面的核查,即确认每个标记者产出的标签集是否彼此相当。否则就会出现这种情况:某个标记者下手更狠,或者用的根本是另一套评分标准。这种偏差会悄悄渗进训练数据里,靠统计方法比逐条肉眼去发现更稳。
检测出"坏"之后怎么修#
一旦识别出问题,我们通常有两种修法——删掉,或者补上一个合理的值:
从数据集中直接删掉——干净利落,但样本会少;样本量本就紧张时慎用。
用插补(imputation)补上一个合理的值——保住了样本量,但补什么就要拍脑袋;用均值 / 中位数 / 模型预测都行,关键是同一种处理在训练集和推理集要保持一致。
MLWM: 关于数据清洗和预处理的示例,可以参见 随机森林实战:泰坦尼克号生还预测示例 中第9.3.3节 缺失值填充部分的内容。
具体做法不在本章展开,可参阅 数据集、泛化与过拟合 模块里的数据特征一节。