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

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

---

## 0. 结论

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

| 划分方式 | 准确率 | macro-F1 |
|---|---:|---:|
| A 细胞随机划分（常见做法） | 0.9912 | **0.9543** |
| B 患者分组划分（无泄漏基线） | 0.9884 | **0.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.9306 | 0.9543 | +0.0237 | 2.6% |
| 2000 | 40 | 0.9103 | 0.9361 | +0.0258 | 2.8% |
| 2000 | 15 | 0.8559 | 0.8878 | +0.0319 | 3.7% |
| 200 | 15 | 0.8165 | 0.8364 | +0.0200 | 2.4% |
| 50 | 15 | **0.7265** | 0.7959 | **+0.0694** | **9.6%** |

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

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

## 1. 判定规则（跑之前写死，见 `claims.json`）

- 任务：用表达谱预测非恶性细胞的类型（T / B / Macro / Endo / CAF / NK）
- 分类器：多分类逻辑回归，C=0.1，max_iter=300，两种划分**完全相同**
- 特征：方差最大的 2000 个基因，列标准化；两种划分用同一套特征
- 主指标：macro-F1（六类等权，不被 72% 的 T 细胞主导）
- 零模型：细胞类型标签随机打乱 200 次，在两种划分下各评一遍，得到差值分布
- **H1 推翻条件**：差 ≤ 0
- **H2 推翻条件**：差落在零模型差值分布的 95 分位以内

两条都没被推翻。

## 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% 不等，
差别就在任务难度。只报一个数字，读者没法判断它是天花板附近的假象还是真的稳。
