数据预处理与质量保证:数据清洗、缺失值处理、异常值初步识别与标准化
数据预处理这件事,我经常跟团队说一句话:「你花80%的时间折腾数据,后面建模20%的时间就顺了。」反过来,前面图省事跳过清洗,后面模型跑出来的结果,你根本不敢信。
做过几年异常检测的人都有体会——数据质量不过关,再漂亮的算法也是空中楼阁。我自己踩过的坑太多了,今天把这几个核心环节掰开揉碎讲清楚。
数据清洗:把脏东西筛出去
什么叫脏数据?举个简单的例子:用户年龄字段里出现「-5」「999」,或者性别字段既有「男」「M」「1」「Male」四种写法。这些不统一、不合逻辑、格式混乱的数据,统称脏数据。
清洗的第一步,是明确规则。我通常先做一次全字段的「摸底调查」——跑一遍 describe() 和 info(),看看每个字段的类型、范围、空值比例、唯一值个数。心里有数了,再对症下药。
常见清洗场景:
- 格式统一:日期统一为 yyyy-MM-dd,电话号码去空格,文本去首尾空格
- 逻辑校验:年龄 0-120、收入非负、时间戳不能早于数据采集开始日期
- 去重:完全重复行、关键字段重复(比如同一设备同一时间戳的多条记录)
- 脱敏:敏感字段做哈希或截断,不能直接暴露
我记得有一次做金融交易异常检测,原始数据里有个字段叫「交易金额」,居然出现了负数。乍一看以为是错误,但仔细查后发现——负数代表退款。这就是典型的「数据含义未对齐」问题。清洗不光要处理异常值,还要理解业务上下文。
缺失值处理:别一股脑全扔掉
缺失值,说白了就是数据表里空着的格子。如何处理?我个人习惯分三步判断:缺失比例、缺失机制、缺失字段的重要性。
| 缺失比例 | 推荐策略 | 适用场景 |
|---|---|---|
| < 5% | 直接删除缺失行 | 样本量充足,缺失随机 |
| 5% - 30% | 填充(均值/中位数/众数/插值) | 字段有价值,不希望损失样本 |
| > 30% | 建模时单独处理或删除字段 | 该字段信息量已不足 |
这里有个容易犯的错误:用均值填充所有数值缺失。我曾经遇到过一组传感器数据,温度字段在设备停机时全为空,均值填充后直接把「停机模式」的信号给抹掉了。后来改成按状态分组填充,效果才好。
对于时间序列数据,我更推荐前向填充(ffill)或线性插值。前者在设备状态变更时很好用,后者适合缓慢变化的环境参数。
避坑提醒: 填充缺失值之后,最好加一列「是否曾被填充」的标记位。这样模型如果发现填充模式有偏差,还可以通过这个特征学到信号。
异常值初步识别:先把「一眼假」揪出来
异常值识别的第一步,不是上复杂模型,而是做初步排查。为什么?因为很多异常其实是数据录入错误,根本不属于业务意义上的异常。
我常用的初步识别手段有这三种:
- 基于统计阈值——比如Z-score超过3的,或者IQR方法中超出1.5倍四分位距的。
- 基于业务规则——例如血压收缩压不可能低于50 mmHg,人体体温不可能超过42°C。这种规则最硬,也最可靠。
- 基于分布可视化——画个箱线图或直方图,一眼能看出尾巴拖得很长的字段。
举个例子。某个风速监测项目,其中一个传感器莫名其妙在深夜输出 「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. 质量评估 | 数据质量报告 | 覆盖率、一致性、可解释性 |
本章核心记忆点:
- 脏数据不洗,模型白做
- 缺失值要「因病施治」,不是一刀切删除或填充
- 异常值初步识别只是「提审」,不是「判决」
- 标准化是很多算法的前置条件,顺序别搞反
嗯,数据预处理干得好,后面建模就像跑在高速上;干得不好,每一步都在泥潭里挣扎。这部分没什么捷径可走,但把流程固化下来、形成检查清单,就能少踩很多坑。