缺失数据基础:缺失值的类型及其对模型的影响
在数据挖掘与机器学习项目中,缺失数据几乎是无法避免的常态。理解缺失值的产生机制——即缺失数据的类型——是选择正确处理方法的前提。错误的假设会导致偏差的估计、失效的统计推断,甚至使模型在线上环境中表现断崖式下跌。
缺失数据的分类体系由统计学家 Donald Rubin 于 1976 年提出,至今仍是数据预处理的理论基石。根据缺失机制与观测数据、未观测数据之间的依赖关系,缺失值可分为三种类型:完全随机缺失(MCAR)、随机缺失(MAR) 和 非随机缺失(MNAR)。
三种缺失机制的定义与对比
| 类型 | 英文全称 | 缺失是否依赖其他变量 | 缺失是否依赖自身真实值 | 典型场景 |
|---|---|---|---|---|
| MCAR | Missing Completely At Random | 否 | 否 | 传感器随机断电、问卷随机漏填 |
| MAR | Missing At Random | 是(依赖已观测变量) | 否 | 高收入人群更倾向不填收入字段 |
| MNAR | Missing Not At Random | 是 | 是 | 血压仪在血压过高时停止测量 |
关键认知: 在实际工业数据中,纯粹的 MCAR 极为罕见。大多数场景属于 MAR 或 MNAR。LightGBM 对缺失值的原生处理(默认将缺失值分到增益最大的子节点)在 MAR 下表现稳健,但在 MNAR 下需要额外谨慎。
MCAR:完全随机缺失
缺失的发生与任何变量(包括缺失变量本身)无关。数据中是否存在缺失,完全是一个随机事件。这是最理想的缺失类型,因为观测到的子集仍然是总体的无偏代表。
- 数学表达: P(Missing | X, Y) = P(Missing),其中 X 为特征,Y 为目标变量。
- 对模型的影响: 仅损失样本量,参数估计无偏。直接删除缺失样本(listwise deletion)是安全的,但效率降低。
- 检测方法: 将数据按缺失标记分组,对每个特征做 t 检验或卡方检验。若所有特征在两组间均无显著差异,则支持 MCAR 假设。
MAR:随机缺失
缺失的概率依赖于其他已观测变量,但与缺失变量自身的真实值无关。这是实际业务中最常见的缺失机制。
- 数学表达: P(Missing | X, Y) = P(Missing | X_obs),其中 X_obs 为已观测到的特征。
- 对模型的影响: 直接删除缺失样本会引入选择性偏差。例如,高收入人群不填收入字段,若直接删除,剩余样本的收入分布会偏低。
- 处理方法: 多重插补(MICE)、基于似然的估计、或使用 LightGBM 的原生缺失处理(通过将缺失值作为独立分支学习)。
MNAR:非随机缺失
缺失的概率依赖于缺失变量自身的真实值。这是最棘手的情况,因为缺失本身携带了信息。
- 数学表达: P(Missing | X, Y) = P(Missing | X_mis),其中 X_mis 为缺失变量的真实值。
- 对模型的影响: 参数估计有偏且不一致。例如,重症监护室中,病情越重的患者越可能漏测某项指标,若直接忽略缺失,模型会低估病情严重程度。
- 处理方法: 需要引入领域知识建立缺失模型(Heckman 选择模型、模式混合模型),或使用敏感性分析评估偏差范围。LightGBM 在此场景下需配合缺失指示特征(missing indicator)使用。
实战警示: 在金融风控或医疗诊断场景中,MNAR 往往与样本选择偏差叠加。例如,信用评分中“拒绝推断”问题——被拒绝贷款的客户没有后续还款表现,这种缺失属于 MNAR。直接建模会导致模型对拒绝样本的预测能力完全失效。
三种缺失机制对模型影响的对比
| 维度 | MCAR | MAR | MNAR |
|---|---|---|---|
| 参数估计偏差 | 无偏 | 有偏(若直接删除) | 严重有偏 |
| LightGBM 原生处理效果 | 优秀 | 良好(需足够样本) | 需配合缺失指示特征 |
| 是否需要领域知识 | 不需要 | 部分需要 | 强烈需要 |
| 推荐处理方法 | 删除或均值填充 | 多重插补 / 模型填充 | 模式混合模型 / 敏感性分析 |
缺失机制与 LightGBM 的交互
LightGBM 在处理缺失值时采用了一种独特的策略:在训练时,缺失值不会被直接填充,而是被暂时忽略,在分裂节点时,算法会分别计算将缺失样本分到左子节点和右子节点的增益,选择增益更大的方向。这种机制天然适应 MAR 场景,因为模型可以从其他特征中学习缺失模式。
然而,对于 MNAR,由于缺失本身与目标变量相关,LightGBM 的默认行为可能不足以捕捉这种依赖。此时,建议手动构造一个缺失指示特征(0/1 标记是否缺失),让模型显式学习缺失事件与目标的关系。
代码示例:构造缺失指示特征
import pandas as pd
import lightgbm as lgb
# 原始数据
df = pd.read_csv('data.csv')
# 对每个特征构造缺失指示特征
for col in ['age', 'income', 'blood_pressure']:
df[col + '_missing'] = df[col].isnull().astype(int)
# 定义特征列和标签
features = [c for c in df.columns if c != 'target']
X = df[features]
y = df['target']
# 训练 LightGBM
lgb_data = lgb.Dataset(X, y)
params = {'objective': 'binary', 'metric': 'auc', 'verbosity': -1}
model = lgb.train(params, lgb_data, num_boost_round=100)
如何在实际数据中识别缺失机制
虽然缺失机制无法被严格证明(因为缺失值本身不可观测),但可以通过以下步骤进行合理推断:
- 缺失模式可视化: 使用
missingno库绘制缺失矩阵和热力图,观察缺失是否集中在某些特征或样本子集。 - 分组统计检验: 将数据按目标变量或关键特征分层,比较缺失组与非缺失组在其他特征上的分布差异。
- 领域知识验证: 与业务方确认数据采集流程。例如,如果某个传感器在高温下容易失效,则温度数据的缺失很可能属于 MNAR。
- 敏感性分析: 对 MNAR 假设下的缺失值进行多重插补,比较不同假设下模型性能的波动范围。
快速诊断代码:缺失模式可视化
import missingno as msno
import matplotlib.pyplot as plt
# 缺失矩阵:每行一个样本,白色为缺失
msno.matrix(df)
plt.show()
# 缺失相关性热力图
msno.heatmap(df)
plt.show()