ELAI S.r.l.

缺失的测量真的中性吗?AI 从采集流程学到了什么

用完全合成的生物医学示例解释选择、填补与缺失信号:何时有用,以及改变采集流程为何使其脆弱。

缺失的测量真的中性吗?AI 从采集流程学到了什么

问题:空单元格也记录一种选择

生物医学数据中,有些行有测量,有些是空格。直接填均值似乎就能继续,但测量为什么缺失?可能未请求、迟到,或传输丢失,而这些情况可能涉及不同群体。因此即使测量值没有额外信息,模型仍可能学会谁会被测量的流程。

核心问题是:保留“存在或缺失”能否改善预测?采集方式改变后会怎样?须区分预测结局、重建未见数值、描述总体三个任务。我们使用千条合成记录并公开计数,不是真实患者、诊断测试评价或临床决策建议,而是为 AI 设计与检查隔离一个统计机制。

符号与刻意简化的例子

抽象结局发生时 Y = 1,否则为零。回顾表中千例 Y 均已知,但未来预测时不能用 Y 作输入。X 为任意单位的测量。预测时 X 可用则 R = 1,否则为零。R 是观测指示量,缺失指示量为 1 − R。明确约定可防止在公式中颠倒存在与缺失。

为隔离流程影响,合成世界中 X 始终为 7,包括未见项。这是明确的极端设定:数值无法区分结局。两百例 Y = 1,八百例为零,总频率 20%。流程在 Y = 1 中让 80% 有测量,在 Y = 0 中仅 10%。这是统计关联,不表示操作者预知未来结局;相关线索或情境可能产生这种选择。

结局R = 1:存在R = 0:缺失合计
Y = 116040200
Y = 080720800
Σ2407601000

选择改变了分母

完整行中有 160/240 的阳性结局,约 66.67%;无测量行中为 40/760,约 5.26%。各自组内都正确,却都不是总体频率。删除不完整行后把 66.67% 当总体,会混淆选择与全体。这常是填补算法之前的首要问题。

π = P(Y=1), a = P(R=1|Y=1), b = P(R=1|Y=0) P(Y=1|R=1) = πa / [πa + (1−π)b] P(Y=1|R=0) = π(1−a) / [π(1−a) + (1−π)(1−b)]

竖线表示“给定”,即缩小计数群体。首个分子 πa 为结局一且测量存在的比例,分母包含所有存在者,包括结局零。代入 π = 0.2、a = 0.8、b = 0.1 得 0.16/0.24 = 2/3;缺失者得 0.04/0.76 = 1/19。信息不在数字 7,而在行选择方式。

填得准确不等于预测准确

填补是给缺失测量赋替代值。观测均值为 7,填 7 可完美重建本实验全部 X,因为我们知道生成设定。但删除 R 后所有行无法区分,只用 X 的规则可统一预测 0.2;保留 R 则可为存在者预测 2/3、缺失者 1/19。两者都完美重建 X,预测 Y 的信息却不同。

这不证明均值填补总差,也不证明显式指示量总必需:与真实值不同的替代码可能已揭示缺失。较窄的结论是:合并不同信息状态的填补可能丢失预测信号。这不违背一般填补理论,例如常量 X 不满足后文论文的连续密度假设。

用可解释误差评价预测

用二元 Brier 分数比较概率:预测 p 与 Y 差值平方的平均。预测 0.8 时,Y = 1 贡献 0.04,Y = 0 贡献 0.64,惩罚自信的错误。它无单位,越小越好,不是诊断错误百分比或临床获益。

BS = (1/N) Σᵢ (pᵢ − Yᵢ)² E[(Y−p)² | R] = q_R(1−q_R) + (p−q_R)², q_R = P(Y=1|R)

第二个恒等式分开组内剩余不确定性 q_R(1−q_R) 与偏离组频率的惩罚 (p−q_R)²。展开 q_R(1−p)² + (1−q_R)p² 即可验证,p = q_R 最小。原表固定 0.2 得 0.16,区分 R 的规则约 0.091228。这是用分数计算再舍入的精确表值,不是训练分类器后测试的泛化估计。

改变流程会改变缺失的含义

保留同样千例、两百阳性和 X = 7,但每种结局中各让一半有测量。存在组为 100 阳性、400 阴性,缺失组也相同,均为 20%。总体结局频率未变,R 信号却消失了。冻结旧规则,模拟未更新系统,仍预测 2/3 和 1/19。

BS_nuovo = 0.5 [0.2(1−2/3)² + 0.8(2/3)²] + 0.5 [0.2(1−1/19)² + 0.8(1/19)²] ≈ 0.279748

两个 0.5 表示两组人数相等;括号内以 0.2 加权阳性误差、0.8 加权阴性误差。旧规则约 0.279748,比仍为 0.16 的固定预测更差。若在新世界重算,两组概率均为 0.2,R 规则也恢复到 0.16。问题不是保留指示量,而是把它与结局的关联当作稳定事实。

两张合成表,无临床数据。左图为存在与缺失组结局频率,流程改变后差距消失。右图是固定概率与未更新 R 规则的 Brier 分数,越低越好。柱不是置信区间,也不是健康获益测量。
两张合成表,无临床数据。左图为存在与缺失组结局频率,流程改变后差距消失。右图是固定概率与未更新 R 规则的 Brier 分数,越低越好。柱不是置信区间,也不是健康获益测量。

分解还量化未更新成本:新 q_R 均为 0.2,额外惩罚 0.5(2/3 − 0.2)² + 0.5(1/19 − 0.2)² 约 0.119748,正好等于 0.279748 与 0.16 之差。不需改变人群或真值,仅改变观测即可恶化。这是可能性的构造证明,不估计真实服务中发生频率。

区分信息、因果与时间可用性

R 可预测 Y,不表示请求测量导致结局。公式是条件关联。让更多人有测量可改变 R 而不改变 Y,如第二例。赋予规则生物学意义并无根据。实际项目需理解请求、执行、结果到达、系统入库等不同时间的事件。

“有信息的缺失”不自动等于非随机缺失 MNAR。分类取决于缺失依赖哪些已观测或未观测变量。这里回顾性 Y 对所有人可见,机制依赖 Y,因此对缺失 X 而言依赖的是已观测变量。但预测时 Y 不可用。机制名称必须伴随信息集合和任务,缩写本身不能证明策略合理。

若 R 使用应决策之后才到达的测量,就泄露未来信息,回顾表现可能优秀却无法上线实现。这里 R 定义为预测时可用状态,不模拟延迟。真实数据需时间戳和可用性规则,不能因为最终数据库有某列就默认可用。

估计总体是另一个问题

若只用测量者恢复总体 20%,且确知选择概率 a = 0.8、b = 0.1,可按观测概率倒数加权。160 阳性代表 160/0.8 = 200 例,80 阴性代表 80/0.1 = 800 例,加权频率 200/(200 + 800) = 0.2。这解释选择校正,不是预测 Y 的规则,因为权重使用未来未知的结局。

真实选择概率可能未知,估错又添误差。被代表群体的概率还必须为正;从未观测的群体,无限权重也创造不了数据。极小概率带来巨大且不稳定的权重。完整表本来已知总体,因此无需加权;此处用于区分总体组成和个体预测。

仅凭现有数值无法知道什么

现在明确改变问题和假设,离开所有 X 已知为 7 的世界。仅保留可见事实:24% 被观测且值为 7,未见值只知在 0 至 10。设缺失组均值 μ₀,总均值为 0.24 × 7 + 0.76 × μ₀。现有数据无法确定 μ₀;未见值全为 1 或全为 9,两世界产生相同观测档案。

μ = 0.24 × 7 + 0.76 × μ₀ 0 ≤ μ₀ ≤ 10 ⇒ 1.68 ≤ μ ≤ 9.28

两世界总体均值分别为 2.44 和 8.52。1.68–9.28 仅由数值边界推出,不是 95% 置信区间。缩窄需额外信息或假设,如新增测量或与已观测变量有依据的关系。填 7 是选择不可见部分的假设,不是证明。多重填补也不自动消除歧义,它们反映填补模型及假设。

可复现性、研究与边界

下载包含两张表、公式、结果。Python 标准库 Fraction 避免中间舍入影响恒等式,仅在保存绘图时转小数。无随机抽样或种子。代码输出条件概率、Brier 与独立问题的均值界;断言检查 2/3、1/19、优势丧失和加权频率恢复。不是病历或训练模型测试。

Le Morvan、Josse、Scornet、Varoquaux 在 NeurIPS 2021 区分填补与预测质量,研究一致性假设并比较含缺失信息的合成回归方法。本文不复现 NeuMiss 或其实验,离散表回答不同且更窄的问题。

真实模型需时间有效的数据、记录明确的流程,并用测试组覆盖合理的采集或地点变化。在其他因素相同时比较仅填补值、值加指示量、原生缺失处理方法。均值及变换只在训练数据拟合,不用测试调流程。分别评价重要缺失模式,因为总体良好可掩盖小型问题组。这是未执行的验证设计。

还有运行限制:监控缺失率可提示变化,却不能自动揭示与 Y 关系如何改变,后者需要通常晚到的可靠结局。更完整采集可改善服务,却同时让依赖旧选择的模型过时。数据和流程应共同分析,不把历史相关当永久规则。

结论:保留数据的上下文

空格未必中性。这里可用性通过选择信息改善预测,流程改变后同一规则却差于固定概率。这既不支持忽略缺失,也不支持总利用缺失。应保留其含义与时间、分开填补与预测、检验流程稳定性,并说明观测无法揭示什么。AI 质量不仅取决于模型复杂度,也取决于这些知识。

参考文献与可复现性

Le Morvan, Josse, Scornet & Varoquaux — What’s a good imputation to predict with missing values? NeurIPS 2021.

from experiment import run
r = run()
for row in r['scenarios']:
    print(row['scenario'], row['conditional_p'])
    print(round(row['brier_prior'], 6),
          round(row['brier_frozen_mask'], 6))
print(r['separate_nonidentifiability'])

代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 10 月 4 日。