缺失值与缺失机制

本节目标

把缺失表示、缺失原因和处理动作分开,避免用“统一填 0”掩盖采集故障、引入偏差或泄漏测试分布。

缺失不是一个值

空字符串、null、NaN、N/A、-1 和字段不存在可能都被用来表达缺失,但它们的语义不同。先把约定统一,再统计缺失;不要直接用 == np.nan 判断,pandas 提供 isna()/notna()。

为什么会缺失

  • 近似完全随机缺失(MCAR):与已观察和未观察信息都无明显关系,例如偶发传输损坏。
  • 条件随机缺失(MAR):缺失与已观察字段有关,例如某客户端版本不上传延迟。
  • 非随机缺失(MNAR):缺失本身与未记录值有关,例如失败调用更可能没有成本数据。

这三类是分析假设,不是仅靠表格就能证明的标签。需要结合采集流程、日志和领域知识。

处理策略

  1. 修采集源:关键字段缺失优先修上游,而非长期填补。
  2. 保留缺失指示:缺失本身可能有信息,可增加 latency_missing。
  3. 删除:只在缺失少、删除不造成系统偏差且字段非关键时使用。
  4. 填补:数值可用训练集统计量,类别可用显式 unknown;必须验证影响。
  5. 隔离:无法解释的关键字段缺失进入问题队列。

机器学习场景中,均值/中位数等填补器必须只在训练集 fit。对全量数据计算统计量再划分会泄漏测试分布。

Agent/RAG 示例

  • 工具调用的 response 为空:可能是超时、取消、解析失败或真正返回空,应靠状态码区分。
  • 文档标题为空:可从文件名生成候选,但必须标记 title_source=filename。
  • 评测分数为空:不能默认填 0;“未执行”与“执行失败”是不同状态。

练习与自测

选择三个字段,为每个字段写:允许为空吗、有哪些缺失原因、是否可填补、填补会引入什么偏差。若无法说明原因,就先保留缺失并上报。

  • 我能区分字段不存在、显式 null、空字符串和业务上的“未知”。
  • 我不会仅凭当前表格声称已证明 MCAR、MAR 或 MNAR。
  • 我会让训练统计量只在训练集拟合,并把缺失指示与填补策略纳入 Pipeline。
  • 我能解释“未执行”“执行失败”和“真实值为 0”为何不能合并。

下一步:重复数据与实体身份。

参考资料

资料核验日期:2026-07-14。