从“我的模型更好”到“如何科学证明模型更好”
写算法论文时,实验几乎总是同一句话:新方法比已有方法更好。可很多文章却用 paired two-sided Wilcoxon signed-rank test,而不是看起来更贴题的单侧检验。这并不矛盾——论文目标是“证明更好”,统计假设通常先问“差异是否可靠”。

图:模型比较中的单侧/双侧、配对/非配对、流程、选型与常见错误。
1. 比较的是差值,不是两堆分数
| Dataset | Ours | Baseline | $d_i$ |
|---|---|---|---|
| D1 | 0.72 | 0.65 | +0.07 |
| D2 | 0.81 | 0.74 | +0.07 |
| D3 | 0.68 | 0.70 | −0.02 |
| D4 | 0.76 | 0.71 | +0.05 |
要回答的是:这些 $d_i$ 是否大到不像随机波动。
2. 为什么常用双侧,而不是单侧
单侧直接对准“是否更好”:
$$ H_0: \mu_{ours} \leq \mu_{baseline},\quad H_1: \mu_{ours} > \mu_{baseline} $$双侧问的是“是否不同”:
$$ H_0: \mu_{ours} = \mu_{baseline},\quad H_1: \mu_{ours} \neq \mu_{baseline} $$药物试验里方向往往事先钉死(例如只关心是否降压),单侧合理。算法 benchmark 不然:个别数据集上变差也是信息,审稿人通常希望你先报告“是否存在可靠差异”,方向再由均值/中位数给出。若 $p<0.05$ 且中位差为正,仍可写 significantly outperformed。
单侧并非错误。若方法部分事先写明单向假设、分析流程预先固定,或任务本身只认一个方向(如压缩只关心更小),可以用。Benchmark、排名、多数生信/深度学习方法比较,双侧更稳妥。
3. 先分清配对还是非配对
选错配对结构,比选错单侧/双侧更糟。
配对:观测一一对应,共享同一实验单元。同一数据集上的 Ours vs Baseline、同一划分上的 ablation、同一患者治疗前后,都是配对。有效样本量是配对数。检验的是 $\{d_i\}$ 是否偏离 0。
非配对:两组独立,没有 $a_i\leftrightarrow b_i$。随机分组的药 vs 安慰剂、两个人群、两家医院,属于这一类;样本量可以不等。
判断口诀:能指出每一对、打乱一组顺序后结论就崩——配对;同一批 benchmark、同一划分下的方法对比,几乎总是配对。
| 近似正态 / $n$ 够大 | 不正态、不确定或小样本 | |
|---|---|---|
| 配对 | paired t-test | Wilcoxon signed-rank |
| 非配对 | Student / Welch t-test | Mann–Whitney U(又称 Wilcoxon rank-sum) |
注意:signed-rank ≠ rank-sum。前者配对看差值秩,后者非配对混合排秩。论文里写全称,别只写 “Wilcoxon test”。
4. 机器学习里为什么点名 Wilcoxon
Benchmark 往往只有几个数据集($n=5$–$10$),$d_i$ 很难谈正态,paired t-test 不踏实,于是用非参数的 signed-rank。同时,同一数据集上的两个分数必须成对进检验:把所有 Ours 堆一堆、Baseline 堆一堆再做独立样本检验,会把“数据难度差异”混进“方法差异”。
空间转录组里还有一类常见错误:拿数万个 spot/cell 当 $n$。统计单元应是独立数据集或生物学重复,不是模型内部高度相关的微观观测。
5. 多名对手时要校正
Ours 对上 A–E 共 5 次检验,每次 $\alpha=0.05$,至少一次假阳性的概率约为
$$ 1-(0.95)^5 \approx 22.6\% $$应用 Bonferroni($\alpha'=0.05/5$)或 BH(Benjamini–Hochberg)控制 FDR。多方法整体差异也可用 Friedman,再做 post-hoc 的配对 Wilcoxon,并校正 $p$ 值。
图注可写成:
Statistical significance was assessed using paired two-sided Wilcoxon signed-rank tests across datasets, with Benjamini–Hochberg correction for multiple comparisons.
非配对则明确写 Mann–Whitney U / Wilcoxon rank-sum,不要笼统写 Wilcoxon。
6. Python / R 示例:配对双侧 Wilcoxon + BH 校正
设定:多个数据集上,ours 分别与若干 baseline 成对比较;每个对手得到一个 $p$,再用 BH 校正。
Python(scipy + statsmodels)
import numpy as np
from scipy.stats import wilcoxon
from statsmodels.stats.multitest import multipletests
# 行 = 数据集,列 = 方法;同一行是配对观测
ours = np.array([0.72, 0.81, 0.68, 0.76, 0.79, 0.74])
baselines = {
"MethodA": np.array([0.65, 0.74, 0.70, 0.71, 0.75, 0.70]),
"MethodB": np.array([0.70, 0.78, 0.66, 0.73, 0.77, 0.72]),
"MethodC": np.array([0.69, 0.80, 0.67, 0.74, 0.76, 0.71]),
}
raw_p, names = [], []
for name, base in baselines.items():
# alternative="two-sided":双侧;默认即配对 signed-rank
stat, p = wilcoxon(ours, base, alternative="two-sided", zero_method="wilcox")
raw_p.append(p)
names.append(name)
reject, p_bh, _, _ = multipletests(raw_p, alpha=0.05, method="fdr_bh")
for name, p, q, sig in zip(names, raw_p, p_bh, reject):
print(f"{name}: p={p:.4g}, p_BH={q:.4g}, significant={sig}")
单次只比一个 baseline、不做多重比较时,去掉 multipletests 即可,只看 wilcoxon 的 $p$。
R
ours <- c(0.72, 0.81, 0.68, 0.76, 0.79, 0.74)
baselines <- list(
MethodA = c(0.65, 0.74, 0.70, 0.71, 0.75, 0.70),
MethodB = c(0.70, 0.78, 0.66, 0.73, 0.77, 0.72),
MethodC = c(0.69, 0.80, 0.67, 0.74, 0.76, 0.71)
)
raw_p <- sapply(baselines, function(base) {
# paired = TRUE:配对;alternative = "two.sided":双侧
wilcox.test(ours, base, paired = TRUE, alternative = "two.sided")$p.value
})
p_bh <- p.adjust(raw_p, method = "BH")
data.frame(method = names(raw_p), p = raw_p, p_BH = p_bh, significant = p_bh < 0.05)
几点实用注意:
- 配对数太少(例如 $n<6$)时,精确 $p$ 可能偏保守或出现 ties;报告时写明软件与
zero_method/ exact 设定。 - BH 控的是 FDR,通常比 Bonferroni 宽松,benchmark 多对手时更常用;若审稿人点名 FWER,再改 Bonferroni。
- 显著之后仍要看差值方向(中位数 / 均值是否为正),再写 outperformed。
7. 速查
| 场景 | 结构 | 常用做法 |
|---|---|---|
| 多数据集方法比较 | 配对 | paired two-sided Wilcoxon signed-rank |
| Ablation | 配对 | paired Wilcoxon / paired t |
| 多模型排名 | 配对(多方法) | Friedman + post-hoc Wilcoxon + BH/Bonferroni |
| 两组独立样本 | 非配对 | Mann–Whitney 或 t / Welch |
| 单次测试集比一次分数 | — | 不必硬做显著性充样本 |
顺序可以记成:配对与否 → 参数/非参数 → 单侧/双侧 → 多重比较是否校正。
论文目标可以是“证明更好”;统计上先建立的是“差异可靠”。差异成立且 $Performance_{ours}>Performance_{baseline}$,再下“显著优于”的结论即可。对多数 AI / 生信 benchmark,配对 + 双侧 + Wilcoxon signed-rank + BH(或 Bonferroni)校正,仍然是最省事、也最不容易被挑刺的写法。
CC BY-NC-SA 4.0
本文由 Xiang CHEN 陈向 创作,采用 CC BY-NC-SA 4.0 协议,首发于 https://chenxofhit.xyz 个人网站。
您可以自由地:
- 分享 — 在任何媒介以任何形式复制、发行本作品
- 演绎 — 修改、转换或以本作品为基础进行创作
惟须遵守下列条件:
- 署名 — 您必须给出适当的署名,提供指向本许可协议的链接,同时标明是否(对原始作品)作了修改。您可以用任何合理的方式来署名,但是不得以任何方式暗示许可人为您或您的使用背书。
- 非商业性使用 — 您不得将本作品用于商业目的。
- 相同方式共享 — 如果您再混合、转换或者基于本作品进行创作,您必须基于与原先许可协议相同的许可协议分发您贡献的作品。
商业使用请联系:[email protected]