← 返回目录
Chapter 02Missing Data

缺失值处理

通过交互式可视化深度理解缺失值的模式、类型和插补策略

🔍 模式识别🧪 插补实验🎯 KNN算法📊 实时对比

"数据质量是机器学习成功的基石,而缺失值处理是数据清洗的第一道关卡。"

— 数据科学实践准则

2.1

缺失值是怎么产生的?

理解数据缺失的原因和类型

在真实世界的数据集中,缺失值几乎无法避免。由于各种原因(人为失误、设备故障、隐私保护等),数据中常常会出现空白、NaN或其他占位符。处理缺失值是数据预处理的重要环节。

🎲

MCAR

完全随机缺失

Missing Completely at Random - 缺失与任何变量无关,纯粹随机现象

例如:调查问卷部分页面打印错误导致无法填写
📊

MAR

随机缺失

Missing at Random - 缺失与其他特征相关,但与自身值无关

例如:收入数据的缺失与性别、年龄相关,但与收入高低无关
⚠️

MNAR

非随机缺失

Missing Not at Random - 缺失与数据本身值存在关系

例如:高收入群体不愿透露收入,导致高收入数据缺失

💻NaN:缺失值的通用表示

NaN(Not a Number)是最常用的缺失值标记。在NumPy和Pandas中,可以用np.nan生成缺失值。

# 创建含缺失值的列
df['holder'] = np.nan
# 读取CSV时指定缺失值标记
pd.read_csv('data.csv', na_values='?')

⚡ NumPy函数处理NaN的差异

统计量遇到NaN会报错 ❌自动忽略NaN ✓
均值numpy.mean()numpy.nanmean()
中位数numpy.median()numpy.nanmedian()
标准差numpy.std()numpy.nanstd()
方差numpy.var()numpy.nanvar()
💡 技巧:使用nan前缀的函数可以安全地处理含缺失值的数据
✦
2.2

缺失值模式可视化

交互式探索数据缺失的分布规律

在处理缺失值之前,首先要可视化缺失模式。通过热图可以直观看出:哪些行/列缺失严重?缺失是否有规律?这对选择合适的处理策略至关重要。

💡

关键洞察:如果某列缺失率超过50%,考虑直接删除该列;如果缺失呈现明显的聚集模式,可能是MNAR类型,需要更谨慎的处理。

✦
2.3

简单插补策略

均值、中位数、常数填补的实战对比

最简单的插补方法包括:用列均值、列中位数或固定常数填充缺失值。不同策略适用于不同场景:

📊

均值填补

用列的平均值填充

✓ 保持总体均值不变
✗ 减小方差
✗ 对异常值敏感
📈

中位数填补

用列的中位数填充

✓ 对异常值稳健
✓ 适合偏态分布
✗ 仍减小方差
🔢

常数填补

用固定值填充(如0)

✓ 简单直接
✓ 适合分类特征
✗ 可能引入偏差
🎓
学习要点:
  • • 观察黄色高亮的插补值,它们是如何计算出来的
  • • 对比均值和中位数策略,思考为什么中位数更稳健
  • • 尝试"删除行"策略,注意样本数量的变化
✦
2.3.1

成对删除:智能的删除策略

针对特定任务保留最大数据量

成对删除(Pairwise Deletion)是一种更灵活的删除策略。与完全删除不同,成对删除在计算两个特征的关系时,只删除这两个特征中包含缺失值的样本,而保留其他特征的完整数据。这大大提高了数据利用率。

❌

完全删除(Listwise)

删除任何包含缺失值的行,只保留完全没有缺失的样本

✗ 数据浪费严重
✗ 可能丢失大量信息
✓ 结果一致性高
✓

成对删除(Pairwise)

针对每对特征的计算,只删除这对特征中的缺失值

✓ 最大化数据利用
✓ 保留更多信息
✗ 不同计算样本数不同
⚠️
使用场景:
• 适合:计算相关性矩阵、协方差矩阵等成对统计量
• 不适合:需要一致样本集的机器学习算法(如需要固定样本数)
• 注意:可能导致协方差矩阵不是正定的
✦
2.4

KNN插补:更智能的方法

利用相似样本的信息进行插补

K近邻(KNN)插补是一种更智能的方法:它不使用全局统计量,而是找到K个最相似的样本,用这些邻居的均值来填补缺失值。这样可以更好地保留局部数据结构。

🎯 KNN插补算法步骤

1
计算距离
对于含缺失值的样本,计算它与所有其他样本的距离(只用完整特征)
2
找出近邻
选择距离最小的K个样本作为近邻
3
均值插补
用这K个近邻在缺失特征上的均值来填补缺失值

💡 KNN插补 vs 简单插补

✓ KNN的优势
  • • 考虑样本间的相似性,插补更合理
  • • 能保留局部数据结构
  • • 对MNAR类型缺失效果更好
⚠️ 注意事项
  • • 计算复杂度较高(需算距离)
  • • K值需要调优
  • • 对特征尺度敏感,需标准化
✦
2.5

多变量插补:利用特征间关系

迭代式插补,逐步优化插补值

多变量插补(Multivariate Imputation)是最先进的插补方法之一。它不仅考虑单个特征的统计量,而是利用其他特征来预测缺失值。通过迭代过程,每个缺失特征都被建模为其他特征的函数,逐步优化插补值直到收敛。

📊 三种插补方法对比

方法原理优势劣势
单变量插补用单列统计量(均值/中位数)填充简单快速忽略特征关系
KNN插补用K个相似样本的均值填充考虑局部相似性计算开销大
多变量插补用回归模型预测缺失值保留特征关系复杂度最高

💻sklearn实现:IterativeImputer

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.ensemble import RandomForestRegressor

# 创建迭代插补器,使用随机森林作为估算器
imputer = IterativeImputer(
    estimator=RandomForestRegressor(random_state=0),
    max_iter=10,  # 最大迭代次数
    random_state=0
)

# 对数据进行插补
X_imputed = imputer.fit_transform(X_with_nan)
• estimator:可选BayesianRidge(默认)、RandomForest、KNN等
• max_iter:最大迭代次数,默认10
• initial_strategy:初始插补策略,默认'mean'
🎯 何时使用多变量插补?
✓ 推荐使用
  • • 特征间高度相关
  • • 缺失率中等(10%-30%)
  • • 有足够计算资源
  • • 数据量较大(> 1000样本)
⚠️ 谨慎使用
  • • 特征相互独立
  • • 缺失率极高(> 50%)
  • • 数据量很小(< 100样本)
  • • 需要快速处理
✦

🎯本章核心要点

📚理论知识

  • •缺失值三大类型:MCAR、MAR、MNAR
  • •NaN是通用缺失值标记
  • •NumPy提供nan前缀函数处理缺失值

🛠️实用技能

  • •用热图可视化缺失模式
  • •掌握均值、中位数、常数填补
  • •理解KNN插补的原理和优势
🚀 下一步建议
• 在真实项目中,先可视化缺失模式,再选择处理策略
• 对于MCAR类型,简单插补即可;对于MNAR,优先考虑KNN或模型插补
• 插补后务必评估对模型性能的影响