缺失值处理
根据特征类型、缺失机制和业务语义,在训练集内学习填补规则并保留必要的缺失信息。
学习前需要掌握
背景与问题
缺失值不只是一个需要填成数字的空位。它可能来自设备故障、问卷跳题、不适用或信息尚未产生,不同原因可能与标签和使用环境有关系。
填补让估计器能接收统一结构,却不会恢复未观察到的真实数值,也不能消除缺失机制带来的偏差。
概念定义
缺失值填补依据既定规则为未观测位置提供替代值,例如数值中位数、类别众数、常量或由其他信息估计的值。数据驱动的规则属于已学状态,应仅从训练范围估计。
缺失指示列记录原始位置是否缺失,它与填补后的数值承担不同信息;是否加入指示列应通过合适验证判断,不能默认必然提高效果。
直观理解
中位数填补相当于给缺失位置放一个训练集的典型值。填入 15 只表示采用了这个约定,不意味着该记录的真实值恰好是 15。
同一个填补值用于两条未来记录
训练列为 [10,缺失,20],非缺失部分的中位数是 15。未来列 [100,缺失] 应变为 [100,15],而不是根据未来的 100 再估计一个新填补值。
若保留缺失指示,则两行分别附上 0 与 1。这样模型能区分真实观测到的 15 与由规则填成的 15,但不能据此认定缺失一定代表某种类别。
核心原理
先判断缺失含义与可用信息,再选择策略。全部删除可能改变样本分布,简单平均可能压缩方差,复杂估计也可能引入额外假设和计算成本。
填补统计量只能由训练数据学习,交叉验证时也必须折内拟合。未来大数值若参与计算,会提前改变训练规则,即使没有直接使用测试标签也可能泄漏。
数值与类别列一般采用不同处理,类别常量还要避免与真实类别混淆。整列缺失、训练没有缺失而未来出现缺失等情况,需要核对变换器的输出列规则与版本。
保留缺失率监控和原始标识有助于发现采集变化。预测时缺失模式大量变化,不能只靠继续填补就认为输入仍处于已验证范围。
计算与实现步骤
- 统计每列缺失比例。
- 区分数值、类别和结构性缺失。
- 判断缺失是否可能携带信息。
- 在训练集拟合填补器。
- 对其他分块只 transform。
- 比较不同策略并检查填补后的分布。
代码实现
示例 1
核对训练中位数与缺失指示
example_01.py用途:完整演示 fit 与 transform 的填补边界。
import numpy as np
from sklearn.impute import SimpleImputer
train = np.array([[10.0], [np.nan], [20.0]])
future = np.array([[100.0], [np.nan]])
imputer = SimpleImputer(strategy="median", add_indicator=True).fit(train)
print("median:", imputer.statistics_.tolist())
print("future:", imputer.transform(future).tolist())代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
完整演示 fit 与 transform 的填补边界。
Step 1 · 1–7 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.impute import SimpleImputer
train = np.array([[10.0], [np.nan], [20.0]])
future = np.array([[100.0], [np.nan]])
imputer = SimpleImputer(strategy="median", add_indicator=True).fit(train)
print("median:", imputer.statistics_.tolist())
print("future:", imputer.transform(future).tolist())预期输出或运行结果
median: [15.0] future: [[100.0, 0.0], [15.0, 1.0]]
常见错误 · 3 条
- 用完整数据算填补值
- 把未知类别和缺失混为一谈
- 不分析高缺失比例特征的业务含义
实际应用
- 表格分类与回归
- 医疗和问卷数据
- 传感器缺测
常见错误
- 用完整数据算填补值
- 把未知类别和缺失混为一谈
- 不分析高缺失比例特征的业务含义
推荐学习资料
参考库不会生成虚假资源或无效外部链接。