1. 缺失值概述

1.1 缺失值的定义

缺失值(Missing Value)是指数据集中某个或某些特征(字段)的值未被记录、未被采集或不可用的状态。在结构化数据中,缺失值通常表现为 NaN、NULL、None 或空字符串;在非结构化数据中,可能表现为空白字段、占位符或异常标记。

关键认知:缺失值 ≠ 0 值。0 是一个有效数值,而缺失值表示“未知”或“不存在”。将缺失值直接替换为 0 会引入系统性偏差,是特征工程中常见的错误做法。

1.2 缺失值的产生原因

缺失值的产生贯穿数据生命周期,主要分为以下三大阶段:

阶段 典型场景 示例
数据采集 传感器故障、人工录入遗漏、问卷拒答 温度传感器断电导致某时段无读数;用户未填写年龄字段
数据传输 网络丢包、协议解析失败、缓冲区溢出 IoT 设备上报数据时部分报文丢失;API 响应超时返回空值
数据存储 字段类型不匹配、ETL 清洗异常、权限限制 字符串字段存入数值列被截断;数据库迁移时部分记录未成功写入
数据合并 多表关联无匹配、时间对齐失败 左连接后右表无对应记录产生 NULL;不同采样频率的时间序列对齐后出现空窗
工程提示:在数据接入阶段记录缺失率日志,可以帮助快速定位采集或传输环节的故障。建议在 ETL 流程中增加缺失率监控告警阈值(如单字段缺失率 > 20% 触发告警)。

1.3 缺失值对模型的影响

缺失值对机器学习模型的影响是多维度的,主要体现在以下四个方面:

  • 信息损失:样本或特征被直接丢弃,导致训练数据量减少,模型无法学习到完整的数据分布。
  • 偏差引入:如果缺失并非完全随机(MNAR),直接删除或简单填充会引入系统性偏差,使模型估计有偏。
  • 算法兼容性:多数机器学习算法(如线性回归、SVM、神经网络)无法直接处理缺失值,必须预处理。
  • 预测性能下降:缺失值会降低特征的有效信息量,导致模型精度、召回率、AUC 等指标显著下降。
避坑指南:不要在所有模型上都使用同一种缺失值处理方法。树模型(如 XGBoost、LightGBM)可以原生处理缺失值,而线性模型和深度学习模型则必须插补。盲目填充可能破坏树模型的分支学习能力。

1.4 缺失机制分类

理解缺失机制是选择插补策略的前提。统计学家 Rubin 将缺失机制分为三类:

类型 全称 含义 处理建议
MCAR 完全随机缺失 缺失与否完全独立于任何观测或未观测数据 可直接删除或简单插补
MAR 随机缺失 缺失与否依赖于其他已观测变量,但不依赖于缺失变量本身 推荐使用模型插补(如 MICE、KNN)
MNAR 非随机缺失 缺失与否依赖于缺失变量本身的值 需引入领域知识或敏感度分析
缺失机制分类与处理策略 MCAR 完全随机缺失 MAR 随机缺失 MNAR 非随机缺失 缺失机制决定插补策略 MCAR → 简单删除/均值填充 | MAR → 模型插补 | MNAR → 领域知识 + 敏感度分析 缺失率 < 5% 5% ≤ 缺失率 < 20% 缺失率 ≥ 20% 特征删除 缺失率计算:缺失样本数 / 总样本数 × 100% 注:缺失率阈值仅为经验参考,需结合业务场景和特征重要性综合判断

1.5 缺失值检测与可视化

在 Python 中,快速检测缺失值的方法如下:

import pandas as pd
import numpy as np

# 加载数据
df = pd.read_csv('data.csv')

# 检测缺失值
print(df.isnull().sum())           # 每列缺失数量
print(df.isnull().sum() / len(df)) # 每列缺失率

# 缺失值热力图(可视化)
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(10, 6))
sns.heatmap(df.isnull(), cbar=False, cmap='viridis')
plt.title('缺失值分布热力图')
plt.show()
实战建议:在探索性数据分析(EDA)阶段,建议同时输出缺失率表格和热力图。缺失率表格用于定量分析,热力图用于发现缺失模式(如某几列同时缺失、缺失集中在某些样本等)。

1.6 本章小结

  • 缺失值是数据中“未知”状态的标记,不能简单等同于 0 或空字符串。
  • 缺失原因涵盖采集、传输、存储、合并四个环节,定位原因有助于选择处理策略。
  • 缺失机制(MCAR / MAR / MNAR)是选择插补方法的理论依据。
  • 缺失值会直接导致信息损失、偏差引入、算法不兼容和性能下降。
  • 在 Python 中通过 isnull() 和热力图可快速完成缺失值检测与可视化。