前言
在机器学习中,不同模型的性能度量以及比较远比大家想象的要复杂的多。
这里面涉及到几个重要因素:
首先,我们希望比较的是泛化性能,然后通过实验评估方法获得的是测试集上的性能,两者对比的结果未必相同。
其二,测试集上的性能与测试集本身的选择有很大的关系,且不论使用不同大小的测试集会得到不同的结果,即便使用相同大小的测试集,若包含的测试样例不同,测试结果也会不同。
其三,很多机器学习算法本身有一定的随机性,即便使用相同的参数设置在同一个测试集上多次运行,其结果也会有所不同。
那么,有没有适当的方法对写吸气的性能进行比较呢?
统计假设检验(hypothesis test
)为我们进行学习器性能比较提供了重要依据。基于假设检验结果我们可以推断出,若在测试集上观察到学习器
A
A
A 比
B
B
B 好,则
A
A
A 的泛化性能是否在统计意义上优于
B
B
B ,以及这个结论的把握有多大。下面我们先介绍两种最基本的假设检验,然后介绍几种常用的机器学习性能比较方法。为了便于讨论,我们默认以错误率为性能度量,用
ϵ
\epsilon
ϵ 表示。
1.1 假设检验
假设检验中的“假设”是对学习器泛化错误率分布的某种判断或猜想,例如“
ϵ
=
ϵ
0
\epsilon = \epsilon_0
ϵ=ϵ0”。现实任务中我们并不知道学习器的泛化错误率,只能获知其测试错误率
ϵ
^
\hat{\epsilon}
ϵ^ 。泛化错误率与测试错误率未必相同,但直观上,二者接近的可能性应比较大,相差很远的可能性比较小,因此,可根据测试错误率估推出泛化错误率的分布。
泛化错误率为
ϵ
\epsilon
ϵ 的学习器在一个样本上犯错的概率是
ϵ
\epsilon
ϵ ;测试错误率
ϵ
^
\hat{\epsilon}
ϵ^ 意味着在
m
m
m 个测试样本中恰好有
ϵ
^
×
m
\hat{\epsilon} \times m
ϵ^×m 个被误分类。假定测试样本是从样本总体分布中独立采样而得,那么泛化错误率为
ϵ
\epsilon
ϵ 的学习器将其中
m
′
m'
m′ 个样本误分类、其余样本全都分类正确的概率是
ϵ
m
′
(
1
−
ϵ
)
m
−
m
′
\epsilon^{m'}(1- \epsilon)^{m - m'}
ϵm′(1−ϵ)m−m′ ;由此可估算出其恰好将
ϵ
^
×
m
\hat{\epsilon} \times m
ϵ^×m 个样本误分类的概率如下式①所示,这也表达了在包含
m
m
m 个样本的测试集上,泛化错误率为
ϵ
\epsilon
ϵ 的学习器被测得测试错误率为
ϵ
^
\hat{\epsilon}
ϵ^ 的概率为:
P
(
ϵ
^
;
ϵ
)
=
(
m
ϵ
^
×
m
)
ϵ
ϵ
^
×
m
(
1
−
ϵ
)
m
−
ϵ
^
×
m
⋯
⋯
①
P(\hat{\epsilon}; \epsilon) = \binom{m}{\hat{\epsilon} \times m} \epsilon^{\hat{\epsilon} \times m}(1- \epsilon)^{m - \hat{\epsilon} \times m} \quad \text{$\cdots \cdots$①}
P(ϵ^;ϵ)=(ϵ^×mm)ϵϵ^×m(1−ϵ)m−ϵ^×m⋯⋯①
给定测试错误率,则求解
∂
P
(
ϵ
^
;
ϵ
)
/
∂
ϵ
=
0
\partial P(\hat{\epsilon}; \epsilon) / \partial \epsilon = 0
∂P(ϵ^;ϵ)/∂ϵ=0 可知,
P
(
ϵ
^
;
ϵ
)
P(\hat{\epsilon}; \epsilon)
P(ϵ^;ϵ) 在
ϵ
=
ϵ
^
\epsilon = \hat{\epsilon}
ϵ=ϵ^ 时最大,
∣
ϵ
−
ϵ
^
∣
|\epsilon - \hat{\epsilon}|
∣ϵ−ϵ^∣ 增大时
P
(
ϵ
^
;
ϵ
)
P(\hat{\epsilon}; \epsilon)
P(ϵ^;ϵ) 减小。这符合二项分布(binomial distribution
),如图所示,若
ϵ
=
0.3
\epsilon = 0.3
ϵ=0.3 ,则 10
个样本中测得 3
个被误分类的概率最大。
我们可以使用“二项检验”(binomial test
)来对“
ϵ
≤
0.3
\epsilon \leq 0.3
ϵ≤0.3”(即“泛化错误率是否不大于
0.3
0.3
0.3”)这样的假设进行检验。更一般的,考虑假设“
ϵ
≤
ϵ
0
\epsilon \leq \epsilon_0
ϵ≤ϵ0”,则在
1
−
α
1 - \alpha
1−α 的概率内所能观测到的最大错误率如下式计算。这里
1
−
α
1 - \alpha
1−α 反映了结论的“置信度”(confidence
,即相信这个结果是准确的可信程度,用概率表示),直观的来看,相应于上图中的非阴影部分的范围。
ϵ
‾
=
max
ϵ
subject to
∑
i
=
ϵ
0
×
m
+
1
m
(
m
i
)
ϵ
i
(
1
−
ϵ
)
m
−
i
<
α
\overline{\epsilon} = \max{\epsilon} \quad \text{subject to} \quad \sum_{i=\epsilon_0 \times m + 1}^m \binom{m}{i} \epsilon^i(1 - \epsilon)^{m - i} \lt \alpha
ϵ=maxϵsubject toi=ϵ0×m+1∑m(im)ϵi(1−ϵ)m−i<α
此时若测试错误率
ϵ
^
\hat{\epsilon}
ϵ^ 小于临界值
ϵ
‾
\overline{\epsilon}
ϵ ,则根据二项检验可得出结论:在
α
\alpha
α 的显著度下,假设“
ϵ
≤
ϵ
0
\epsilon \leq \epsilon_0
ϵ≤ϵ0”不能被拒绝,即能以
1
−
α
1-\alpha
1−α 的置信度认为,学习器的泛化错误率不大于
ϵ
0
\epsilon_0
ϵ0 ;否则该假设可被拒绝,即在
α
\alpha
α 的显著度下可认为学习器的泛化错误率大于
ϵ
0
\epsilon_0
ϵ0 。
在很多时候我们并非仅做一次留出法估计,而是通过多次重复留出法或是交叉验证法等进行多次训练/测试,这样会得到多个测试错误率,此时可使用“t检验”(t-test
)。假定我们得到了
k
k
k 个测试错误率,
ϵ
^
1
,
ϵ
^
2
,
.
.
.
,
ϵ
^
k
\hat{\epsilon}_1, \hat{\epsilon}_2, ..., \hat{\epsilon}_k
ϵ^1,ϵ^2,...,ϵ^k ,则平均测试错误率
μ
\mu
μ 和方差
σ
2
\sigma^2
σ2 为:
μ
=
1
k
∑
i
=
1
k
ϵ
^
i
⋯
⋯
②
\mu = \frac{1}{k} \sum_{i=1}^k \hat{\epsilon}_i \quad \text{$\cdots \cdots$②}
μ=k1i=1∑kϵ^i⋯⋯②
σ
2
=
1
k
−
1
∑
i
=
1
k
(
ϵ
^
i
−
μ
)
2
⋯
⋯
③
\sigma^2 = \frac{1}{k - 1} \sum_{i = 1}^k (\hat{\epsilon}_i - \mu)^2 \quad \text{$\cdots \cdots$③}
σ2=k−11i=1∑k(ϵ^i−μ)2⋯⋯③
考虑到这
k
k
k 个测试错误率可看作泛化错误率
ϵ
0
\epsilon_0
ϵ0 的独立采样,则变量:
τ
t
=
k
(
μ
−
ϵ
0
)
σ
⋯
⋯
④
\tau_t = \frac{\sqrt{k}(\mu - \epsilon_0)}{\sigma} \quad \text{$\cdots \cdots$④}
τt=σk(μ−ϵ0)⋯⋯④
服从自由度为
k
−
1
k - 1
k−1 的
t
t
t 分布,如图所示:
对假设“
μ
=
ϵ
0
\mu = \epsilon_0
μ=ϵ0”和显著度
α
\alpha
α ,我们可以计算出当测试错误率均值为
ϵ
0
\epsilon_0
ϵ0 时,在
1
−
α
1-\alpha
1−α 概率内能观测到的最大错误率,即临界值。这里考虑双边(two-tailed
)假设,如上图所示,两边阴影部分各有
α
/
2
\alpha / 2
α/2 的面积;假定阴影部分范围分别为
[
−
∞
,
t
−
α
/
2
]
[-\infty, t_{-\alpha / 2}]
[−∞,t−α/2] 和
[
t
α
/
2
,
∞
]
[t_{\alpha / 2}, \infty]
[tα/2,∞] 。若平均错误率
μ
\mu
μ 与
ϵ
0
\epsilon_0
ϵ0 之差
∣
μ
−
ϵ
0
∣
|\mu - \epsilon_0|
∣μ−ϵ0∣ 位于临界值范围
[
t
−
α
/
2
,
t
α
/
2
]
[t_{-\alpha / 2}, t_{\alpha / 2}]
[t−α/2,tα/2] 内,则不能拒绝假设“
μ
=
ϵ
0
\mu = \epsilon_0
μ=ϵ0”,即可认为泛化错误率为
ϵ
0
\epsilon_0
ϵ0,置信度为
1
−
α
1-\alpha
1−α ;否则可拒绝该假设,即在该显著度下可认为泛化错误率与
ϵ
0
\epsilon_0
ϵ0 有显著不同。
α
\alpha
α常用取值有
0.05
0.05
0.05 和
0.1
0.1
0.1 ,下表给出了一些常用临界值:
上面介绍的两种方法都是对关于单个学习器泛化性能的假设进行检验,而在现实任务中,更多时候我们需要对不同的学习器性能进行比较,下面将介绍适用于此类情况的假设检验方法。
1.2 交叉验证 t 检验
对两个学习器
A
A
A 和
B
B
B ,若我们使用
k
k
k 折交叉验证法得到的测试错误率分别为
ϵ
1
A
,
ϵ
2
A
,
.
.
.
,
ϵ
k
A
\epsilon_1^A, \epsilon_2^A, ..., \epsilon_k^A
ϵ1A,ϵ2A,...,ϵkA 和
ϵ
1
B
,
ϵ
2
B
,
.
.
.
,
ϵ
k
B
\epsilon_1^B, \epsilon_2^B, ..., \epsilon_k^B
ϵ1B,ϵ2B,...,ϵkB ,其中
ϵ
i
A
\epsilon_i^A
ϵiA 和
ϵ
i
B
\epsilon_i^B
ϵiB 是在相同的第
i
i
i 折训练/测试集上得到的结果,则可用
k
k
k 折交叉验证“成对 t 检验”(paired t-test
)来进行比较检验。这里的基本思想是若两个学习器的性能相同,则它们使用相同的训练/测试集得到的测试错误率应相同,即
ϵ
i
A
=
ϵ
i
B
\epsilon_i^A = \epsilon_i^B
ϵiA=ϵiB 。
具体来说,对
k
k
k 折交叉验证产生的
k
k
k 对测试错误率:先对每对结果求差,
Δ
i
=
ϵ
i
A
−
ϵ
i
B
\Delta_i = \epsilon_i^A - \epsilon_i^B
Δi=ϵiA−ϵiB ;若两个学习器性能相同,则差值均值为零。因此,可根据差值
Δ
1
,
Δ
2
,
.
.
.
,
Δ
k
\Delta_1, \Delta_2, ..., \Delta_k
Δ1,Δ2,...,Δk 来对“学习器
A
A
A 与
B
B
B 性能相同”这个假设做
t
t
t 检验,计算出差值的均值
μ
\mu
μ 和方差
σ
2
\sigma^2
σ2 ,在显著度
α
\alpha
α 下,若变量:
τ
t
=
∣
k
μ
σ
∣
\tau_t = |\frac{\sqrt{k} \mu}{\sigma}|
τt=∣σkμ∣
小于临界值
t
α
/
2
,
k
−
1
t_{\alpha / 2, k - 1}
tα/2,k−1 ,则假设不能被拒绝,即认为两个学习器的性能没有显著性差别;否则可认为两个学习器的性能有显著差别,且平均错误率较小的那个学习器性能较优。这里
t
α
/
2
,
k
−
1
t_{\alpha / 2, k-1}
tα/2,k−1 是自由度为
k
−
1
k-1
k−1的
t
t
t 分布上尾部累积分布为
α
/
2
\alpha / 2
α/2 的临界值。
欲进行有效的假设检验,一个重要前提是测试错误率均为泛化错误率的独立采样。然而,通常情况下由于样本有限,在使用交叉验证等实验估计方法时,不同轮次的训练集会有一定程度的重叠,这就使得测试错误率实际上并不独立,会导致过高估计假设成立的概率。为缓解这一问题,可采用“
5
×
2
5 \times 2
5×2 交叉验证”法。
5
×
2
5 \times 2
5×2 交叉验证是做
5
5
5 次
2
2
2 折交叉验证,在每次
2
2
2 折交叉验证之前随机将数据打乱,使得
5
5
5 次交叉验证中的数据划分不重复。对两个学习器
A
A
A 和
B
B
B ,第
i
i
i 次
2
2
2 折交叉验证将产生两对测试错误率,我们对它们分别求差,得到第
1
1
1 折上的差值
Δ
i
1
\Delta_i^1
Δi1 和第
2
2
2 折上的差值
Δ
i
2
\Delta_i^2
Δi2 。为缓解测试错误率的非独立性,我们仅计算第
1
1
1 次
2
2
2 折交叉验证的两个结果的平均值
μ
=
0.5
(
Δ
1
1
+
Δ
1
2
)
\mu = 0.5(\Delta_1^1 + \Delta_1^2)
μ=0.5(Δ11+Δ12) ,但对每次
2
2
2 折实验的结果都计算出其方差
σ
2
=
(
Δ
i
1
−
Δ
i
1
+
Δ
i
2
2
)
2
+
(
Δ
i
2
−
Δ
i
1
+
Δ
i
2
2
)
2
\sigma^2 = (\Delta_i^1 - \frac{\Delta_i^1 + \Delta_i^2}{2})^2 + (\Delta_i^2 - \frac{\Delta_i^1 + \Delta_i^2}{2})^2
σ2=(Δi1−2Δi1+Δi2)2+(Δi2−2Δi1+Δi2)2 ,变量:
τ
t
=
μ
0.2
∑
i
=
1
5
σ
i
2
\tau_t = \frac{\mu}{\sqrt{0.2\sum_{i=1}^5 \sigma_i^2}}
τt=0.2∑i=15σi2μ
服从自由度为
5
5
5 的
t
t
t 分布, 其双边检验的临界值
t
α
/
2
,
5
t_{\alpha / 2, 5}
tα/2,5 当
α
=
0.05
\alpha = 0.05
α=0.05 时为
2.5706
2.5706
2.5706 ,
α
=
0.1
\alpha = 0.1
α=0.1 时为
2.0150
2.0150
2.0150 。
1.3 McNemar检验(麦克尼马尔检验)
对二分类问题,使用留出法不仅可估计出学习器
A
A
A 和
B
B
B 的测试错误率,还可获得两学习器分类结果的差别,即两者都正确、都错误、一个正确另一个错误的样本数,如“列联表”(contingency table
)所示:
若我们做的假设是两学习器性能相同,则应有
e
01
=
e
10
e_{01} = e_{10}
e01=e10 ,那么变量
∣
e
01
−
e
10
∣
|e_{01} - e_{10}|
∣e01−e10∣ 应当服从正态分布,且均值为
1
1
1 ,方差为
e
01
+
e
10
e_{01} + e_{10}
e01+e10 。因此变量:
τ
χ
2
=
(
∣
e
01
−
e
10
∣
−
1
)
2
e
01
+
e
10
\tau_{\chi^2} = \frac{(|e_{01} - e_{10}| - 1)^2}{e_{01} + e_{10}}
τχ2=e01+e10(∣e01−e10∣−1)2
服从自由度为
1
1
1 的
χ
2
\chi^2
χ2 分布(卡方分布),即标准正态分布变量的平方。给定显著度
α
\alpha
α ,当以上变量值小于临界值
χ
α
2
\chi_{\alpha}^2
χα2 时, 不能拒绝假设,即认为两学习器的性能没有显著差别;否则拒绝假设,即认为两者性能有显著差别,且平均错误率较小的那个学习器性能较优。自由度为
1
1
1 的
χ
2
\chi^2
χ2 检验的临界值当
α
=
0.05
\alpha = 0.05
α=0.05 时为
3.8415
3.8415
3.8415 ,
α
=
0.10
\alpha = 0.10
α=0.10 时为
2.7055
2.7055
2.7055 。
1.4 Friedman 检验 与 Nemenyi 后续检验
交叉验证
t
t
t 检验和 McNemar 检验都是在一个数据集上比较两个算法的性能,而在很多时候,我们会在一组数据集上对多个算法进行比较。当有多个算法参与比较时,一种做法是在每个数据集上分别列出两两比较的结果,而在两两比较时可使用前述方法;另一种方法更为直接,即使用基于算法排序的 Friedman 检验。
假定我们用
D
1
,
D
2
,
D
3
,
D
4
D_1, D_2, D_3, D_4
D1,D2,D3,D4 四个数据集对算法
A
,
B
,
C
A, B, C
A,B,C 进行比较。
首先,使用留出法或交叉验证法得到每个算法在每个数据集上的测试结果,然后在每个数据集上根据测试性能好坏由好到坏排序,并赋予序值
1
,
2
,
.
.
.
1, 2, ...
1,2,... ;若算法的测试性能相同,则平分序值。例如,在
D
1
D_1
D1 和
D
3
D_3
D3 上,
A
A
A 最好、
B
B
B 其次、
C
C
C 最差,而在
D
2
D_2
D2 上,
A
A
A 最好、
B
B
B 与
C
C
C 性能相同,
⋯
⋯
\cdots \cdots
⋯⋯ ,则可列出下表,其中最后一行通过对每一列的序值求平均,得到平均序值:
然后,使用 Friedman 检验来判断这些算法是否性能都相同。若相同,则它们的平均序值应当相同。假定我们在
N
N
N 个数据集上比较
k
k
k 个算法,令
r
i
r_i
ri 表示第
i
i
i 个算法的平均序值,为简化讨论,暂不考虑平分序值的情况,则
r
i
r_i
ri 服从正态分布,其均值和方差分别为
(
k
+
1
)
/
2
(k+1)/2
(k+1)/2 和
(
k
2
−
1
)
/
12
(k^2-1)/12
(k2−1)/12 。变量:
τ
χ
2
=
k
−
1
k
⋅
12
N
k
2
−
1
∑
i
=
1
k
(
r
i
−
k
+
1
2
)
2
\tau_{\chi^2} = \frac{k-1}{k} \cdot \frac{12N}{k^2 - 1} \sum_{i=1}^k \bigg(r_i - \frac{k + 1}{2}\bigg)^2
τχ2=kk−1⋅k2−112Ni=1∑k(ri−2k+1)2
=
12
N
k
(
k
+
1
)
∑
i
=
1
k
(
r
i
2
−
k
(
k
+
1
)
2
4
)
⋯
⋯
⑤
= \frac{12N}{k(k+1)} \sum_{i=1}^k \bigg(r_i^2 - \frac{k(k+1)^2}{4}\bigg) \quad \text{$\cdots \cdots$⑤}
=k(k+1)12Ni=1∑k(ri2−4k(k+1)2)⋯⋯⑤
在
k
k
k 和
N
N
N 都较大时, 服从自由度为
k
−
1
k-1
k−1 的
χ
2
\chi^2
χ2 分布。
然而,上述这样的“原始 Friedman 检验”过于保守,现在通常使用变量:
τ
F
=
(
N
−
1
)
τ
χ
2
N
(
k
−
1
)
−
τ
χ
2
⋯
⋯
⑥
\tau_F = \frac{(N-1)\tau_{\chi^2}}{N(k-1)-\tau_{\chi^2}} \quad \text{$\cdots \cdots$⑥}
τF=N(k−1)−τχ2(N−1)τχ2⋯⋯⑥
其中
τ
χ
2
\tau_{\chi^2}
τχ2 由式⑤得到。
τ
F
\tau_F
τF 服从自由度为
k
−
1
k-1
k−1 和
(
k
−
1
)
(
N
−
1
)
(k-1)(N-1)
(k−1)(N−1) 的
F
F
F 分布,下表给出了一些常用的临界值:
若“所有算法的性能相同”这个假设被拒绝,则说明算法的性能显著不同。这时需要进行“后续检验”(post-hoc test
)来进一步区分各个算法。常用的有 Nemenyi 后续检验。
Nemenyi 检验计算出平均序值差别的临界值域:
C
D
=
q
α
k
(
k
+
1
)
6
N
⋯
⋯
⑦
CD = q_{\alpha} \sqrt{\frac{k(k+1)}{6N}} \quad \text{$\cdots \cdots$⑦}
CD=qα6Nk(k+1)⋯⋯⑦
下表给出了
α
=
0.05
\alpha=0.05
α=0.05 和
α
=
0.1
\alpha=0.1
α=0.1 时常用的
q
α
q_{\alpha}
qα 值。若两个算法的平均序值之差超出了临界值域
C
D
CD
CD ,则以相应的置信度拒绝“两个算法性能相同”这一假设。
以算法比较序值表
中的数据为例,先根据式⑤和⑥计算出
τ
F
=
24.429
\tau_F = 24.429
τF=24.429 ,由F检验的常用临界值表
可知,它大于
α
=
0.05
\alpha=0.05
α=0.05 时的
F
F
F 检验临界值为
5.143
5.143
5.143 (此处有 4
个数据集,3
种学习器),很明显计算出的
F
F
F 值远大于临界值,因此拒绝“所有算法性能相同”这个假设。然后使用 Nemenyi 后续检验,在Nemenyi 检验常用的
q
α
q_{\alpha}
qα值表中找到
k
=
3
k=3
k=3 时
q
0.05
=
2.344
q_{0.05} = 2.344
q0.05=2.344 ,根据式⑦计算出临界值域
C
D
=
1.657
CD=1.657
CD=1.657 ,由算法比较序值表
中的平均序值可知,算法
A
A
A 与
B
B
B 的差距
2.125
−
1
=
1.125
2.125-1=1.125
2.125−1=1.125 ,以及算法
B
B
B 与
C
C
C 的差距
2.875
−
2.125
=
0.75
2.875-2.125=0.75
2.875−2.125=0.75 均未超过临界值域,而算法
A
A
A 与
C
C
C 的差距
2.875
−
1
=
1.875
2.875-1=1.875
2.875−1=1.875 超过临界值域,因此检验结果认为算法
A
A
A 与
C
C
C 的性能显著不同,而算法
A
A
A 与
B
B
B、以及算法
B
B
B 与
C
C
C 的性能没有显著差别。
上述检验比较可以直观的用 Friedman 检验图显示。例如根据算法比较序值表
的序值结果可绘制出下图:
图中纵轴显示各个算法,横轴是平均序值。对每个算法,用一个圆点显示其平均序值,以圆点为中心的横线段表示临界值域的大小。然后就可从图中观察,若两个算法的横线段有交叠,则说明这两个算法没有显著差别,否则即说明有显著差别。从图中还可轻易的看出,算法
A
A
A 与
B
B
B 没有显著差别,因为它们的横线段有交叠区域,而算法
A
A
A 显著优于算法
C
C
C ,因为它们的横线段没有交叠区域。
总结
- 学习器的泛化错误率我们无法直接获得,但是我们可以间接的通过学习器的测试错误率来估推出泛化错误率的分布。
- 二项检验和 双边 t 检验适用于对单个学习器性能进行评估的场景。
- 交叉验证 t 检验在样本有限的情况下,不同轮次的训练集会有一定程度的重叠,使得测试错误率实际上并不相互独立,会导致估计假设成立的概率过高。这个时候我们可以使用 5 × 2 5 \times 2 5×2 交叉验证法即 5 5 5 次 2 2 2 折交叉验证,缓解测试错误率的非独立性问题。
- 在一个数据集上比较两个学习器的性能可以使用交叉验证 t 检验和 McNemar 检验。
- 在一组数据集上比较多个学习器的性能则使用 Friedman 检验和 Nemenyi 后续检验更加方便。
参考文献
① 机器学习-周志华【37-44】