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 作为基准,再与简单填充对比模型效果。
缺失值处理策略决策流程 原始数据含缺失值 缺失率 < 5% 且 MCAR? 是 行删除 / 列删除 否 特征类型? 数值 均值 / 中位数填充 分类 众数填充 需要更高精度? 是 模型预测填充 否 保留当前填充结果 💡 建议:先尝试简单填充,若模型效果不佳再升级为模型预测填充 MICE 和 KNN 是模型预测填充的常用选择

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 做统计检测。对于检测出的异常值,不要直接删除,应标记后分析原因:若是录入错误则修正或删除;若是真实稀有事件(如金融欺诈),应保留并单独建模。
异常值检测与处理流程 原始数据 业务规则检测(优先) IQR 方法 Z-Score 方法 标记异常值并分析原因 🔍 异常值处理:修正 → 删除 → 保留(稀有事件)→ 单独建模 业务规则优先级最高,统计方法作为辅助验证

2.3 本章小结

  • 缺失值处理: 删除法(低缺失率)、统计填充(均值/中位数/众数)、模型预测填充(高精度需求)。分组填充优于全局填充。
  • 异常值检测: IQR 稳健适用于偏态分布,Z-Score 适用于正态分布,业务规则用于语义异常检测。
  • 处理原则: 先业务规则,后统计方法;先标记分析,后决定修正或保留;不盲目删除异常值。
📘 延伸阅读: 缺失值处理可进一步学习多重插补(Multiple Imputation)和基于深度学习的生成式填充(如 GAIN 模型)。异常值检测可拓展到孤立森林(Isolation Forest)和 LOF(局部异常因子)等无监督方法。