数据预处理与质量保证:数据清洗、缺失值处理、异常值初步识别与标准化

数据预处理这件事,我经常跟团队说一句话:「你花80%的时间折腾数据,后面建模20%的时间就顺了。」反过来,前面图省事跳过清洗,后面模型跑出来的结果,你根本不敢信。

做过几年异常检测的人都有体会——数据质量不过关,再漂亮的算法也是空中楼阁。我自己踩过的坑太多了,今天把这几个核心环节掰开揉碎讲清楚。

数据清洗:把脏东西筛出去

什么叫脏数据?举个简单的例子:用户年龄字段里出现「-5」「999」,或者性别字段既有「男」「M」「1」「Male」四种写法。这些不统一、不合逻辑、格式混乱的数据,统称脏数据。

清洗的第一步,是明确规则。我通常先做一次全字段的「摸底调查」——跑一遍 describe() 和 info(),看看每个字段的类型、范围、空值比例、唯一值个数。心里有数了,再对症下药。

常见清洗场景:

  • 格式统一:日期统一为 yyyy-MM-dd,电话号码去空格,文本去首尾空格
  • 逻辑校验:年龄 0-120、收入非负、时间戳不能早于数据采集开始日期
  • 去重:完全重复行、关键字段重复(比如同一设备同一时间戳的多条记录)
  • 脱敏:敏感字段做哈希或截断,不能直接暴露

我记得有一次做金融交易异常检测,原始数据里有个字段叫「交易金额」,居然出现了负数。乍一看以为是错误,但仔细查后发现——负数代表退款。这就是典型的「数据含义未对齐」问题。清洗不光要处理异常值,还要理解业务上下文。

缺失值处理:别一股脑全扔掉

缺失值,说白了就是数据表里空着的格子。如何处理?我个人习惯分三步判断:缺失比例、缺失机制、缺失字段的重要性。

缺失比例推荐策略适用场景
< 5%直接删除缺失行样本量充足,缺失随机
5% - 30%填充(均值/中位数/众数/插值)字段有价值,不希望损失样本
> 30%建模时单独处理或删除字段该字段信息量已不足

这里有个容易犯的错误:用均值填充所有数值缺失。我曾经遇到过一组传感器数据,温度字段在设备停机时全为空,均值填充后直接把「停机模式」的信号给抹掉了。后来改成按状态分组填充,效果才好。

对于时间序列数据,我更推荐前向填充(ffill)或线性插值。前者在设备状态变更时很好用,后者适合缓慢变化的环境参数。

避坑提醒: 填充缺失值之后,最好加一列「是否曾被填充」的标记位。这样模型如果发现填充模式有偏差,还可以通过这个特征学到信号。

异常值初步识别:先把「一眼假」揪出来

异常值识别的第一步,不是上复杂模型,而是做初步排查。为什么?因为很多异常其实是数据录入错误,根本不属于业务意义上的异常。

我常用的初步识别手段有这三种:

  1. 基于统计阈值——比如Z-score超过3的,或者IQR方法中超出1.5倍四分位距的。
  2. 基于业务规则——例如血压收缩压不可能低于50 mmHg,人体体温不可能超过42°C。这种规则最硬,也最可靠。
  3. 基于分布可视化——画个箱线图或直方图,一眼能看出尾巴拖得很长的字段。

举个例子。某个风速监测项目,其中一个传感器莫名其妙在深夜输出 「0.0」 持续两小时。IQR 方法没检测出来,因为整体数据分布没变,但业务人员一眼指出那段时间有持续大风。为什么?传感器冻住了。这就是「静默错误」——数据没超出正常范围,但实际是错误的。

注意: 初步识别只标记「疑似异常」,不要直接删除。把这些候选异常单独拎出来,留给下一步的领域专家做二次判断。我自己吃过亏:一次把真实的突发交易峰值当成了异常删掉,结果模型对高峰期预测一直偏低。

数据标准化:让不同量纲的数据站到同一起跑线

很多机器学习算法(比如KNN、SVM、PCA)默认假设所有特征的尺度一致。如果收入范围是几千到几万,年龄是0到100,不标准化的话,收入就会主导距离计算。

标准化方法主要有两种:

  • Z-score标准化:\( x' = \frac{x - \mu}{\sigma} \)。适合数据大致服从正态分布,且无严格上下界的情况。
  • Min-Max缩放:\( x' = \frac{x - x_{min}}{x_{max} - x_{min}} \)。把数据压缩到[0, 1]区间,适合有明确边界的特征。

这里我建议:先把异常值处理完再做标准化。为什么?因为离群点会严重拉偏均值和方差,导致标准化后正常数据被压缩成一条细线。

标准化要点:

  • 先拆分训练集和测试集,用训练集的参数(μ, σ 或 min, max)去变换测试集
  • 不要全局标准化后再做训练测试拆分——那是数据泄漏
  • 时序数据最好用滚动窗口统计量做标准化,避免用到未来信息

我接手的某个风险评分项目,原始数据中「交易金额」字段有极少数百万级交易,Min-Max 缩放后,90% 的正常交易被压缩到 0~0.01 之间,模型几乎学不到差异。换成 RobustScaler(基于中位数和四分位距),效果明显改善。

知识体系总览

下面这张图把数据预处理与质量保证的核心流程串起来了。你可以用它作为日常工作的检查清单。

数据预处理与质量保证核心流程 原始数据 数据清洗 缺失值处理 异常值初步识别 数据标准化 质量评估 & 交付 避坑要点 不跳过清洗 先异常处理再标准化 保留填充标记

流程清单(每步必做)

步骤输出物检查要点
1. 数据摸底字段清单 + 基础统计类型匹配、空值比例、唯一值数
2. 数据清洗清洗后数据集格式统一、去重、逻辑校验
3. 缺失值处理填充后数据集 + 填充标记分组填充、避免数据泄漏
4. 异常值初步识别异常候选清单结合业务规则,不直接删除
5. 数据标准化标准化后数据集 + 变换参数先拆分数据集,再拟合变换
6. 质量评估数据质量报告覆盖率、一致性、可解释性

本章核心记忆点:

  • 脏数据不洗,模型白做
  • 缺失值要「因病施治」,不是一刀切删除或填充
  • 异常值初步识别只是「提审」,不是「判决」
  • 标准化是很多算法的前置条件,顺序别搞反

嗯,数据预处理干得好,后面建模就像跑在高速上;干得不好,每一步都在泥潭里挣扎。这部分没什么捷径可走,但把流程固化下来、形成检查清单,就能少踩很多坑。