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 | 非随机缺失 | 缺失与否依赖于缺失变量本身的值 | 需引入领域知识或敏感度分析 |
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()和热力图可快速完成缺失值检测与可视化。