一、为什么需要比较检验?

在2.4节前,我们已学“模型评估方法”(留出法、交叉验证)和“性能度量”(错误率、AUC),能得到模型的“测试性能”(如模型A错误率8%,模型B错误率10%)。但直接“比大小”会忽略三个关键问题:

  1. 泛化性能≠测试性能:我们关心的是模型在新样本上的泛化能力,但测试性能只是“有限测试集上的抽样结果”,可能存在偏差;
  2. 测试集波动:换一组测试集,同一模型的性能可能变化(如模型A错误率从8%变12%);
  3. 算法随机性:部分算法(如神经网络、随机森林)有随机初始化,即使同参数、同测试集,多次运行结果也会波动。

比较检验的作用就是:通过统计推断,判断“测试性能差异”是否能代表“泛化性能差异”,以及这个结论的“可信度”(如95%置信度)。

二、假设检验的核心逻辑(通用框架)

无论哪种假设检验,都遵循“先提假设、再用数据验证”的逻辑,核心术语需先明确:

  • 原假设(H₀):“无差异”的假设(如“模型A与模型B的泛化性能相同”“模型的泛化错误率≤10%”);
  • 备择假设(H₁):“有差异”的假设(如“模型A的泛化性能优于B”“模型的泛化错误率>10%”);
  • 显著性水平α:允许“误判”的风险(常用α=0.05,即“把‘无差异’误判为‘有差异’”的概率≤5%);
  • 统计量:基于测试数据计算的“衡量差异程度”的指标(如t值、χ²值);
  • 结论规则:若统计量超过“临界值”(或p值<α),则“拒绝原假设”(认为差异显著);否则“无法拒绝原假设”(认为差异是随机波动)。

机器学习中,假设检验的核心目标是:判断“测试性能差异”是否由“泛化性能差异”导致,而非随机因素。

三、2.4节核心方法:4类假设检验(按场景划分)

文档2.4节围绕“单个模型性能验证”“两个模型比较”“多个模型比较”三大场景,介绍了4类实用检验方法,需结合场景记忆适用条件和步骤。

1. 2.4.1 单个学习器的假设检验(验证“单个模型是否达标”)

场景:判断“一个模型的泛化性能是否满足要求”(如“模型泛化错误率是否≤10%”),分两种情况:

(1)二项检验(适合“单次测试”,如单次留出法)

适用场景:用“单次留出法”得到测试错误率(如m个测试样本,错误数为a,错误率ϵ^=a/m\hat{\epsilon}=a/mϵ^=a/m),判断“泛化错误率ε是否≤ε₀”(如ε₀=10%)。

核心逻辑:泛化错误率为ε的模型,在m个独立测试样本上的“错误数”服从二项分布(每次测试是“伯努利实验”:对或错)——例如ε=0.3(30%错误率),10个样本中“错3个”的概率最大(如图2.6所示)。

具体步骤:

  1. 提假设:H₀(ε≤ε₀),H₁(ε>ε₀);
  2. 计算临界值ϵ‾\overline{\epsilon}ϵ:在“H₀成立”的前提下,找到“1-α置信度下最大可接受的测试错误率”(公式见文档2.27);
  3. 比较:若测试错误率ϵ^<ϵ‾\hat{\epsilon} < \overline{\epsilon}ϵ^<ϵ,则“无法拒绝H₀”(可认为泛化错误率≤ε₀);否则“拒绝H₀”(泛化错误率可能>ε₀)。

示例:若ε₀=10%,m=100个测试样本,α=0.05,计算得临界值ϵ‾=15\overline{\epsilon}=15%ϵ=15;若模型测试错误率ϵ^=12\hat{\epsilon}=12% < 15%ϵ^=12,则可95%置信度认为“泛化错误率≤10%”。

(2)t检验(适合“多次测试”,如k折交叉验证)

适用场景:用“多次评估”得到多个测试错误率(如10折交叉验证得到10个错误率:7%、8%、9%…),判断“平均泛化错误率是否等于ε₀”。

核心逻辑:多次测试的错误率可视为“泛化错误率的独立抽样”,其均值服从t分布(样本量较小时比正态分布更贴合实际)。

具体步骤:

  1. 提假设:H₀(平均泛化错误率=ε₀),H₁(平均泛化错误率≠ε₀);
  2. 计算统计量:
    • 先算k个错误率的均值μ和方差σ²(公式见文档2.28-2.29);
    • 再算t统计量:τt=k(μ−ϵ0)σ\tau_t = \frac{\sqrt{k}(\mu - \epsilon_0)}{\sigma}τt​=σk​(μ−ϵ0​)​(衡量“均值与ε₀的差异程度”);
  3. 比较临界值:t分布的临界值tα/2,k−1t_{\alpha/2, k-1}tα/2,k−1​(自由度k-1,α=0.05时可查表2.3)。若∣τt∣<tα/2,k−1|\tau_t| < t_{\alpha/2, k-1}∣τt​∣<tα/2,k−1​,则“无法拒绝H₀”;否则“拒绝H₀”。

示例:10折交叉验证得错误率均值μ=8%,ε₀=10%,计算得τt=−2.1\tau_t=-2.1τt​=−2.1,查t分布表(k=10,α=0.05)得临界值2.262。因∣−2.1∣<2.262|-2.1| < 2.262∣−2.1∣<2.262,无法拒绝H₀?不——若H₁是“μ<ε₀”(单侧检验),则临界值为1.833,∣−2.1∣>1.833|-2.1|>1.833∣−2.1∣>1.833,可拒绝H₀,认为平均泛化错误率<10%。

2. 2.4.2 交叉验证t检验(比较“两个模型的性能”)

适用场景:用“k折交叉验证”比较两个模型A和B(如SVM vs 决策树),判断“性能差异是否显著”。

核心问题:k折交叉验证中,A和B在“同一折”的训练/测试集上测试(如第1折A错误率7%、B错误率9%),因此两组错误率不独立(同一测试集的偏差会同时影响A和B),需用“成对t检验”。

具体步骤:

  1. 提假设:H₀(A与B的泛化性能相同,即“每折错误率差值Δᵢ=εᵢᴬ - εᵢᴮ的均值=0”),H₁(Δᵢ均值≠0);
  2. 计算差值:对每折,算Δᵢ=εᵢᴬ - εᵢᴮ(如第1折Δ₁=7%-9%=-2%);
  3. 计算统计量:基于Δᵢ的均值μ_Δ和方差σ_Δ²,算t统计量τt=k⋅μΔσΔ\tau_t = \frac{\sqrt{k} \cdot \mu_\Delta}{\sigma_\Delta}τt​=σΔ​k​⋅μΔ​​;
  4. 比较临界值:若∣τt∣>tα/2,k−1|\tau_t| > t_{\alpha/2, k-1}∣τt​∣>tα/2,k−1​,则拒绝H₀,认为A与B性能有显著差异(均值小的模型更优)。

改进:5×2交叉验证法
普通k折交叉验证的“不同折训练集有重叠”,导致Δᵢ不独立,可能高估显著性。5×2交叉验证的解决思路:

  • 做5次“2折交叉验证”,每次2折前随机打乱数据;
  • 每次2折产生2个Δ(Δᵢ¹、Δᵢ²),用特定公式计算t统计量(服从自由度为5的t分布),缓解非独立性问题(详情见文档2.4.2)。
3. 2.4.3 McNemar检验(比较“两个二分类模型”,适合留出法)

适用场景:用“留出法”比较两个二分类模型A和B,且能获得“分类结果的差异”(如“哪些样本A对B错,哪些B对A错”)。

核心逻辑:通过“列联表”统计两类关键错误,判断“错误差异是否显著”——若A和B性能相同,则“A对B错”的样本数(e₀₁)与“B对A错”的样本数(e₁₀)应相近。

具体步骤:

  1. 构建列联表(记录两类错误):
    模型B正确模型B错误
    模型A正确e₀₀(都对)e₀₁(A对B错)
    模型A错误e₁₀(B对A错)e₁₁(都错)
  2. 提假设:H₀(e₀₁=e₁₀,A与B性能相同),H₁(e₀₁≠e₁₀);
  3. 计算χ²统计量:τχ2=(∣e01−e10∣−1)2e01+e10\tau_{\chi^2} = \frac{(|e_{01} - e_{10}| - 1)^2}{e_{01} + e_{10}}τχ2​=e01​+e10​(∣e01​−e10​∣−1)2​(“-1”是连续性修正,服从自由度为1的χ²分布);
  4. 比较临界值:α=0.05时,χ²临界值为3.8415。若τχ2>3.8415\tau_{\chi^2} > 3.8415τχ2​>3.8415,则拒绝H₀,认为A与B性能有显著差异。

示例:e₀₁=5(A对B错5个),e₁₀=15(B对A错15个),计算得τχ2=(∣5−15∣−1)25+15=8120=4.05>3.8415\tau_{\chi^2} = \frac{(|5-15|-1)^2}{5+15} = \frac{81}{20}=4.05 > 3.8415τχ2​=5+15(∣5−15∣−1)2​=2081​=4.05>3.8415,拒绝H₀,认为B的性能显著优于A。

4. 2.4.4 Friedman检验+Nemenyi后续检验(比较“多个模型”)

适用场景:在“多个数据集”上比较“多个模型”(如在5个数据集上比较A、B、C三个算法),判断“所有模型性能是否有差异”,若有差异再定位“哪两个差异显著”。

核心逻辑:先通过Friedman检验判断“是否存在整体差异”,再用Nemenyi检验“定位具体差异”——核心是“按性能排序算序值”,避免 pairwise 比较的繁琐。

(1)Friedman检验(整体差异判断)

步骤:

  1. 算序值:对每个数据集,按模型性能从好到坏排序(性能越好,序值越小,如第1名序值1,第2名序值2;性能相同则平分序值,如两个模型并列第2,序值均为2.5);
  2. 提假设:H₀(所有模型序值相同,即性能无差异),H₁(存在模型序值不同);
  3. 计算统计量:
    • 先算每个模型的“平均序值”rᵢ;
    • 再算Friedman统计量(文档2.34),修正后服从F分布(文档2.35),更贴合实际;
  4. 比较临界值:若统计量>临界值(查表2.6),则拒绝H₀,认为“所有模型性能有显著差异”。
(2)Nemenyi后续检验(定位具体差异)

若Friedman检验拒绝H₀,需进一步判断“哪两个模型差异显著”:

  1. 计算临界值域CD:CD=qα⋅k(k+1)6NCD = q_\alpha \cdot \sqrt{\frac{k(k+1)}{6N}}CD=qα​⋅6Nk(k+1)​​(k为模型数,N为数据集数,qα查表2.7);
  2. 比较序值差:若两个模型的“平均序值差”>CD,则认为“两者性能有显著差异”(α置信度)。

示例:3个模型(k=3)、4个数据集(N=4),α=0.05时qα=2.344,计算得CD=1.657。若模型A平均序值1.0,模型C平均序值2.875,差值1.875>1.657,则A显著优于C;若A与B差值0.5<1.657,则无显著差异。

四、关键总结:假设检验的核心价值与适用场景

2.4节的本质是“给模型比较加‘统计保险’”,不同检验方法的适用场景需精准匹配:

检验方法适用场景核心目标
二项检验单个模型+单次留出法判断泛化错误率是否≤阈值
t检验单个模型+多次评估(如k折交叉验证)判断平均泛化错误率是否等于阈值
交叉验证t检验两个模型+k折交叉验证比较两个模型的泛化性能差异是否显著
McNemar检验两个二分类模型+留出法基于分类结果差异(列联表)比较性能
Friedman+Nemenyi多个模型+多个数据集先判断整体差异,再定位具体优劣势模型

一句话概括:假设检验让“模型性能比较”从“主观比大小”变成“客观统计推断”,是机器学习中“模型选择”“算法对比”的科学基础——没有它,再好的性能数据也可能是“随机运气”。

更多推荐