2. 数据清洗基础:缺失值与异常值处理
数据清洗是特征工程的基石。原始数据中几乎必然存在缺失值和异常值,若不经处理直接建模,会导致模型偏差、方差膨胀甚至训练失败。本章系统讲解缺失值处理的三种策略与异常值检测的两类主流方法,并给出业务场景下的选择建议。
2.1 缺失值处理
缺失值产生的原因包括:设备故障、用户未填写、数据合并错位等。处理前需先分析缺失机制(完全随机缺失 MCAR、随机缺失 MAR、非随机缺失 MNAR),再选择对应方法。
2.1.1 删除法
删除法是最简单直接的方式,但会损失样本量,适用于缺失比例极低或随机缺失的场景。
| 方法 | 操作 | 适用场景 | 风险 |
|---|---|---|---|
| 行删除 | 删除含缺失值的整行 | 缺失率 < 5%,且为 MCAR | 样本量锐减,引入偏差 |
| 列删除 | 删除缺失率过高的整列 | 缺失率 > 70%,或该列无业务价值 | 丢失潜在重要特征 |
| 成对删除 | 只在计算具体统计量时排除缺失值 | 相关性分析、协方差计算 | 不同统计量基于不同样本,结果不一致 |
⚠️ 避坑提示: 删除法在时间序列数据中需格外谨慎。直接删除含缺失的时间点会破坏时间连续性,导致后续滞后特征构造失败。时间序列缺失应优先考虑插值或前向填充。
2.1.2 填充法:均值 / 中位数 / 众数
用统计量填充缺失值,简单高效,但会降低方差、削弱特征区分度。
- 均值填充: 适用于近似正态分布的数值特征。例如用户年龄缺失,用全体用户平均年龄填充。
- 中位数填充: 适用于偏态分布或存在离群点的数值特征。例如收入分布右偏,用中位数填充更稳健。
- 众数填充: 适用于分类特征。例如性别缺失,用出现频率最高的性别填充。
💡 进阶技巧: 分组填充效果通常优于全局填充。例如按“城市”分组后,用该城市用户的平均收入填充收入缺失值,能保留组间差异。代码实现时可用
groupby().transform() 完成。
2.1.3 模型预测填充
将缺失特征作为目标变量,利用其他完整特征构建预测模型来估算缺失值。精度高,但计算成本大,且可能引入模型偏差。
| 模型类型 | 特点 | 典型算法 |
|---|---|---|
| 回归填充 | 连续值预测,线性假设 | 线性回归、KNN回归 |
| 分类填充 | 离散值预测 | 逻辑回归、决策树 |
| 迭代填充 | 多轮交替预测,逐步收敛 | MICE(链式方程多重插补) |
# 使用 KNN 进行缺失值填充示例
from sklearn.impute import KNNImputer
import numpy as np
X = np.array([[1, 2, np.nan],
[3, 4, 5],
[7, 8, 9],
[np.nan, 11, 12]])
imputer = KNNImputer(n_neighbors=2)
X_filled = imputer.fit_transform(X)
print(X_filled)
# 输出: [[ 1. 2. 7. ]
# [ 3. 4. 5. ]
# [ 7. 8. 9. ]
# [ 5. 11. 12. ]]
📌 选择建议: 小数据集(< 10万行)且缺失率 < 20% 时,优先尝试模型预测填充;大数据集或缺失率极低时,均值/中位数填充更高效。生产环境中建议用 KNN 或 MICE 作为基准,再与简单填充对比模型效果。
2.2 异常值检测与处理
异常值(离群点)是指显著偏离数据集中趋势的观测值。异常值可能由测量误差、数据录入错误或真实稀有事件产生,需结合业务判断是否保留。
2.2.1 基于统计的方法
Z-Score 方法: 假设数据服从正态分布,计算每个样本的 Z 分数:
Z = (x - μ) / σ
通常设定阈值 |Z| > 3 为异常值(对应 99.7% 置信区间)。适用于近似正态分布的数据,对极端值敏感。
IQR(四分位距)方法: 不依赖正态假设,基于分位数检测异常值:
IQR = Q3 - Q1
下限 = Q1 - 1.5 * IQR
上限 = Q3 + 1.5 * IQR
超出 [下限, 上限] 区间的值视为异常值。适用于偏态分布,对极端值稳健。
| 方法 | 假设 | 阈值 | 优点 | 缺点 |
|---|---|---|---|---|
| Z-Score | 正态分布 | |Z| > 3 | 计算简单,有统计理论支撑 | 对极端值敏感,小样本不适用 |
| IQR | 无分布假设 | 1.5×IQR | 稳健,适用于偏态分布 | 对尾部数据不敏感 |
2.2.2 基于业务规则的方法
业务规则是最高优先级的异常检测手段。统计方法只能发现“数值异常”,而业务规则能识别“语义异常”。
- 范围约束: 年龄 > 0 且 < 120,温度 > -50°C 且 < 60°C。
- 逻辑约束: 下单时间 < 发货时间 < 签收时间,子金额之和等于总金额。
- 频次约束: 同一 IP 一天内下单次数 > 100 视为刷单。
- 组合约束: 男性用户不可能怀孕,未成年人不可能持有驾照。
🔧 实战建议: 先执行业务规则清洗(硬约束),再使用 IQR 或 Z-Score 做统计检测。对于检测出的异常值,不要直接删除,应标记后分析原因:若是录入错误则修正或删除;若是真实稀有事件(如金融欺诈),应保留并单独建模。
2.3 本章小结
- 缺失值处理: 删除法(低缺失率)、统计填充(均值/中位数/众数)、模型预测填充(高精度需求)。分组填充优于全局填充。
- 异常值检测: IQR 稳健适用于偏态分布,Z-Score 适用于正态分布,业务规则用于语义异常检测。
- 处理原则: 先业务规则,后统计方法;先标记分析,后决定修正或保留;不盲目删除异常值。
📘 延伸阅读: 缺失值处理可进一步学习多重插补(Multiple Imputation)和基于深度学习的生成式填充(如 GAIN 模型)。异常值检测可拓展到孤立森林(Isolation Forest)和 LOF(局部异常因子)等无监督方法。