从“我的模型更好”到“如何科学证明模型更好”

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

Statistical Methods for AI Model Performance Comparison

图:模型比较中的单侧/双侧、配对/非配对、流程、选型与常见错误。

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 = Ours_i - Baseline_i $$

要回答的是:这些 $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)校正,仍然是最省事、也最不容易被挑刺的写法。