案例 · 用户提交方向,已匿名
核心问题:单细胞数据上,按细胞随机划分训练/测试,会不会因为同一患者的细胞同时出现在两侧而系统性高估细胞状态分类器的跨患者泛化性能?高估多少?
本轮判定:两条预注册预测(H1 随机划分更高、H2 超出评估噪声)都成立,经验 p = 0.025
数据:GEO GSE72056(黑色素瘤单细胞 RNA-seq),匿名游客可直接从 NCBI FTP 下载;取 2840 个非恶性、类型标注明确的细胞,来自 19 位患者,六类细胞状态
真跑了:细胞随机划分 vs 患者分组划分(同分类器、同超参、同算力)· 200 次标签置换零模型 · 两项核心复核 · 纯 CPU 约 12 分钟

案例速览

判定:正结果(两条预注册预测都成立)

数据源与对照规模:GEO GSE72056,2840 个非恶性细胞 / 19 位患者 / 6 类细胞状态;两种划分各 5 折,200 次标签置换零模型,纯 CPU 约 12 分钟

主要结论:细胞随机划分 macro-F1 0.9543,患者分组划分 0.9306,差 +0.0237(相对高估 2.6%);200 次标签置换里两种划分之差的均值 +0.0010、95 分位 +0.0204,观测值落在分布之外,经验 p = 0.025。更要紧的是第二件事:这个任务太容易(患者分组划分下准确率已经 98.8%),把任务逐级调难之后,同一份数据上的高估从 2.6% 涨到 9.6%。所以 2.6% 只能当成易任务上的下界。

这些结果不支持:只有一个队列,跨队列泄漏(批次、平台、建库协议)本轮一个字都没说。2.6% 不能外推到别的数据集。类别极不平衡(T 细胞 2040 个、NK 只有 51 个),macro-F1 等权会放大稀有类抖动。只跑了逻辑回归一个分类器。细胞类型标签用的是原作者注释,不是独立验证过的真值。19 位患者,GroupKFold 每折只留 3–4 位做测试,折间方差不小。难度扫描的 6 个格点里有一格不单调,只能说方向对、两端差 3 倍,不能说它单调。

代码 / 原始结果 / 日志:主实验、两项核心复核(假患者对照 / 注入患者特异偏移 / 折大小照搬的随机划分,以及难度扫描)、results.json 与三份运行日志全部随附。

DeepGraph 免费验证案例 · 单细胞里"按细胞随机划分"到底高估了多少

提交方向:在两个独立公开单细胞队列上,检验按细胞随机划分是否因患者身份泄漏而系统性高估 跨患者与跨队列泛化性能(提交人选定选项一:先做单队列的划分方式对比) 交付时间:2026-08-27 这一轮真跑了:GEO GSE72056 黑色素瘤单细胞,2840 个非恶性细胞、19 位患者、6 类细胞状态; 细胞随机划分 vs 患者分组划分,同分类器、同超参、同算力;200 次标签置换零模型; 两项核心复核。纯 CPU,总墙钟约 12 分钟。


0. 结论

泄漏是真的,但在这个数据集上只值 2.4 个 macro-F1 点(相对高估 2.6%)。 而这个数字是下界,不是普适值 —— 任务越难,高估越大。

划分方式准确率macro-F1
A 细胞随机划分(常见做法)0.99120.9543
B 患者分组划分(无泄漏基线)0.98840.9306
+0.0028+0.0237

200 次标签置换的零模型里,两种划分之差的均值是 +0.0010、95 分位是 +0.0204。 观测到的 +0.0237 落在分布之外,经验 p = 0.025。 所以跑之前写下的两条预测都成立:随机划分确实高的(H1),而且高出的部分超出评估噪声(H2)。

但更值得你注意的是第二件事。 这个任务太容易了 —— 患者分组划分下准确率已经 98.8%, 离天花板只剩 1.2 个点,泄漏再大也没地方涨。我们把任务逐级调难之后:

基因数每类训练细胞患者划分 F1随机划分 F1绝对高估相对高估
2000全部0.93060.9543+0.02372.6%
2000400.91030.9361+0.02582.8%
2000150.85590.8878+0.03193.7%
200150.81650.8364+0.02002.4%
50150.72650.7959+0.06949.6%

任务从 F1 0.93 变难到 0.73,高估幅度涨了近 3 倍。 所以「2.6%」只能当成易任务上的下界,不能拿去当你自己数据上的预期值。 如果做的是细分亚群、稀有状态、或者跨条件迁移这类本来就不好分的任务, 泄漏能吃掉的比 2.6% 多得多。

这里有一条不单调:200 基因 / 每类 15 细胞那一格是 +0.0200,比它上面一格还低。 6 个格点不足以拟合"难度—高估"的函数形状,我们只能说方向是对的、两端差了 3 倍, 不能说它单调。

1. 判定规则(跑之前写死,见 claims.json

两条都没被推翻。

主结果图
主结果图(本轮实验的关键对比)。原图见随附材料。

2. 我们怎么确认这不是实现问题

只做了两项,都是能直接掀翻结论的那种。

复核一:这把尺子测的到底是不是"患者身份"。

对照该出现什么实际
主实验+0.0237————
a 假患者(把患者标签打乱重贴)+0.0032分组划分退化成随机划分,差应塌到 ≈0✅ 塌了(三次 +0.0033 / −0.0031 / +0.0095,跨过 0)
b 注入患者特异偏移+0.0265人为放大患者效应,差应变大✅ 变大了
c 折大小照搬患者折的随机划分+0.0282排除"两种划分折几何不同"这个混杂✅ 同号同量级

a 是最强的一条:同一批数据、同一套代码,只把患者身份换成随机的,2.4 个点的差就没了。 b 只涨了 0.003,方向对但幅度弱 —— 我们注入的偏移相对已标准化的特征来说不算强, 这条只能算旁证,不能单独当证据。

复核二:2.6% 是不是被天花板压住了。 就是第 0 节那张难度扫描表,结论已在上面。

3. 这一轮不能支持什么推断

按顺序,从最要紧的开始:

  1. 只有一个队列。 提交方向要的是两个独立队列 + 跨队列验证,这一轮只做了单队列内部的 划分方式对比。跨队列泄漏是另一回事(批次、平台、建库协议),本轮一个字都没说。
  2. 2.6% 不能外推到别的数据集。 见上面的难度扫描。这个数字绑在"黑色素瘤 + 六大类细胞 + 逻辑回归"这一组具体条件上。
  3. 类别极不平衡。 T 细胞 2040 个,NK 只有 51 个。macro-F1 等权,所以稀有类的抖动 会被放大;GroupKFold 分 5 折时,个别折里稀有类的测试样本可能只有个位数。
  4. 一个分类器。 只跑了逻辑回归。非线性模型(随机森林、深度模型)更容易记住患者特异模式, 泄漏幅度大概率更大,但这一轮没测。
  5. 标签不是金标准。 细胞类型用的是原作者的注释,不是独立验证过的真值。 这一轮的结论只关于"划分方式带来的差异",不关于标签本身对不对。
  6. 19 位患者。 患者数少,GroupKFold 的每一折只留 3–4 位患者做测试,折间方差不小。

4. 落到实践上

如果只带走一条:在单细胞上报跨患者泛化性能,必须用患者分组划分, 而且要把"这个任务有多容易"一起报出来 —— 因为同一份数据上,泄漏的代价从 2.6% 到 9.6% 不等, 差别就在任务难度。只报一个数字,读者没法判断它是天花板附近的假象还是真的稳。

随附材料(点开即看,不用下载)

打包下载全部材料(.zip)
包里不含体积大的原始下载数据(取数脚本会自动重新下载)。
本案例源自一位研究者通过公开表单提交的方向,已隐去其姓名、单位与一切可定位信息。结论与代码可复查、可反驳。
← 全部案例 · JouleBeat · DeepGraph