缺失值是怎么产生的?
理解数据缺失的原因和类型
在真实世界的数据集中,缺失值几乎无法避免。由于各种原因(人为失误、设备故障、隐私保护等),数据中常常会出现空白、NaN或其他占位符。处理缺失值是数据预处理的重要环节。
MCAR
完全随机缺失
Missing Completely at Random - 缺失与任何变量无关,纯粹随机现象
MAR
随机缺失
Missing at Random - 缺失与其他特征相关,但与自身值无关
MNAR
非随机缺失
Missing Not at Random - 缺失与数据本身值存在关系
💻NaN:缺失值的通用表示
NaN(Not a Number)是最常用的缺失值标记。在NumPy和Pandas中,可以用np.nan生成缺失值。
⚡ NumPy函数处理NaN的差异
| 统计量 | 遇到NaN会报错 ❌ | 自动忽略NaN ✓ |
|---|---|---|
| 均值 | numpy.mean() | numpy.nanmean() |
| 中位数 | numpy.median() | numpy.nanmedian() |
| 标准差 | numpy.std() | numpy.nanstd() |
| 方差 | numpy.var() | numpy.nanvar() |
nan前缀的函数可以安全地处理含缺失值的数据缺失值模式可视化
交互式探索数据缺失的分布规律
在处理缺失值之前,首先要可视化缺失模式。通过热图可以直观看出:哪些行/列缺失严重?缺失是否有规律?这对选择合适的处理策略至关重要。
关键洞察:如果某列缺失率超过50%,考虑直接删除该列;如果缺失呈现明显的聚集模式,可能是MNAR类型,需要更谨慎的处理。
简单插补策略
均值、中位数、常数填补的实战对比
最简单的插补方法包括:用列均值、列中位数或固定常数填充缺失值。不同策略适用于不同场景:
均值填补
用列的平均值填充
中位数填补
用列的中位数填充
常数填补
用固定值填充(如0)
- • 观察黄色高亮的插补值,它们是如何计算出来的
- • 对比均值和中位数策略,思考为什么中位数更稳健
- • 尝试"删除行"策略,注意样本数量的变化
成对删除:智能的删除策略
针对特定任务保留最大数据量
成对删除(Pairwise Deletion)是一种更灵活的删除策略。与完全删除不同,成对删除在计算两个特征的关系时,只删除这两个特征中包含缺失值的样本,而保留其他特征的完整数据。这大大提高了数据利用率。
完全删除(Listwise)
删除任何包含缺失值的行,只保留完全没有缺失的样本
成对删除(Pairwise)
针对每对特征的计算,只删除这对特征中的缺失值
KNN插补:更智能的方法
利用相似样本的信息进行插补
K近邻(KNN)插补是一种更智能的方法:它不使用全局统计量,而是找到K个最相似的样本,用这些邻居的均值来填补缺失值。这样可以更好地保留局部数据结构。
🎯 KNN插补算法步骤
💡 KNN插补 vs 简单插补
- • 考虑样本间的相似性,插补更合理
- • 能保留局部数据结构
- • 对MNAR类型缺失效果更好
- • 计算复杂度较高(需算距离)
- • K值需要调优
- • 对特征尺度敏感,需标准化
多变量插补:利用特征间关系
迭代式插补,逐步优化插补值
多变量插补(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)- • 特征间高度相关
- • 缺失率中等(10%-30%)
- • 有足够计算资源
- • 数据量较大(> 1000样本)
- • 特征相互独立
- • 缺失率极高(> 50%)
- • 数据量很小(< 100样本)
- • 需要快速处理
🎯本章核心要点
📚理论知识
- •缺失值三大类型:MCAR、MAR、MNAR
- •NaN是通用缺失值标记
- •NumPy提供nan前缀函数处理缺失值
🛠️实用技能
- •用热图可视化缺失模式
- •掌握均值、中位数、常数填补
- •理解KNN插补的原理和优势