前言
二项检验在周志华老师的西瓜书中并没有做太多解释,自己也是网上搜索了相关的资料和其他人的看法,并结合了自己的一些理解写下博客记录一下。
内容引出
我们在对学习器的性能进行评估比较的时候,有了评估方法和性能度量也不一定能很好判断学习器的优劣,通常是用统计假设检验,基于假设检验的结果我们可以推断出,若在测试集上观察到学习器A比B好,则A的泛化性能是否在统计意义上优于B,以及这个结论的把握有多大。这里,默认以错误率为性能度量,用 ϵ \epsilon ϵ表示,即泛化错误率。
假设检验中的“假设”是对学习器泛化错误率分布的某种判断或者是猜想,比如“ ϵ = ϵ 0 \epsilon=\epsilon_{0} ϵ=ϵ0”。现实的任务中我们不知道学习器的泛化错误率,只能获知其测试错误率 ϵ ^ \hat{\epsilon} ϵ^,而且泛化错误率和测试错误率不一定相同,直观上,它们两者接近的可能性比较大,相差很远的可能性比较小。由此我们可以根据测试错误率估推出泛化错误率的分布。这也是此章节的目的。
二项检验
泛化错误率为 ϵ \epsilon ϵ的学习器在一个样本上犯错的概率是 ϵ \epsilon ϵ,而测试错误率 ϵ ^ \hat{\epsilon} ϵ^表示的是在m个测试样本中恰好有 ϵ ^ ∗ m \hat{\epsilon}*m ϵ^∗m个被误分类。我们假定测试样本是从总体分布中独立采样得到的,那请问泛化错误率为 ϵ \epsilon ϵ的学习中将m0个样本误分类,其余样本全部分类正确的概率是多少?
如果上面的看不懂没关系,我们来分析一下这个问题,假如你去投篮,你不能投中的概率是 ϵ \epsilon ϵ,你总共只能投m个,其中m0个投不中的概率是多少?这个问题我们都不陌生吧,因为你每次投篮都是相互独立的,所以我们可以用二项分布的方法迅速得出结果 ( m m 0 ) ∗ ϵ m 0 ∗ ( 1 − ϵ ) m − m 0 \begin{pmatrix} m \\ m_0 \end{pmatrix}*\epsilon^{m_0}*(1-\epsilon)^{m-m_0} (mm0)∗ϵm0∗(1−ϵ)m−m0这个公式的前面的矩阵的意思其实就是排列组合,相当于C(m,m0)。那对之前的问题也是一样的道理,它也满足二项分布,所以结果也是一样 ( m m 0 ) ∗ ϵ m 0 ∗ ( 1 − ϵ ) m − m 0 \begin{pmatrix} m \\ m_0 \end{pmatrix}*\epsilon^{m_0}*(1-\epsilon)^{m-m_0} (mm0)∗ϵm0∗(1−ϵ)m−m0所以由此我们可以估算出恰好将 ϵ ^ ∗ m \hat{\epsilon}*m ϵ^∗m个样本误分类的概率,这也表达了在包含m个样本的测试集上,泛化错误率为 ϵ \epsilon ϵ的学习器被测得测试错误率为 ϵ ^ \hat{\epsilon} ϵ^的概率: P ( ϵ ^ ; ϵ ) = ( m m ∗ ϵ ^ ) ∗ ϵ m ∗ ϵ ^ ∗ ( 1 − ϵ ) m − m ∗ ϵ ^ P(\hat{\epsilon};\epsilon)=\begin{pmatrix} m \\ m*\hat{\epsilon} \end{pmatrix}*\epsilon^{m*\hat{\epsilon}}*(1-\epsilon)^{m-m*\hat{\epsilon}} P(ϵ^;ϵ)=(mm∗ϵ^)∗ϵm∗ϵ^∗(1−ϵ)m−m∗ϵ^书上给出的公式其实是很好理解的,但是其最后直接得出结论概率在 ϵ = ϵ ^ \epsilon=\hat{\epsilon} ϵ=ϵ^时最大,其中略过求解过程,所以这里对其进行推导。
这里其实用到的时极大似然法(不太懂的同学可以看看这篇博客极大似然估计)我们先对原式进行求对数
l
n
(
P
(
ϵ
^
;
ϵ
)
)
=
l
n
(
(
m
m
∗
ϵ
^
)
∗
ϵ
m
∗
ϵ
^
∗
(
1
−
ϵ
)
m
−
m
∗
ϵ
^
)
ln(P(\hat{\epsilon};\epsilon))=ln(\begin{pmatrix} m \\ m*\hat{\epsilon} \end{pmatrix}*\epsilon^{m*\hat{\epsilon}}*(1-\epsilon)^{m-m*\hat{\epsilon}})
ln(P(ϵ^;ϵ))=ln((mm∗ϵ^)∗ϵm∗ϵ^∗(1−ϵ)m−m∗ϵ^)这里要提一个关于对数函数的性质
l
n
(
a
∗
b
)
=
l
n
(
a
)
+
l
n
(
b
)
ln(a*b)=ln(a)+ln(b)
ln(a∗b)=ln(a)+ln(b)所以根据这个性质我们可以对原式进行分解
l
n
(
P
(
ϵ
^
;
ϵ
)
)
=
l
n
(
(
m
m
∗
ϵ
^
)
∗
ϵ
m
∗
ϵ
^
∗
(
1
−
ϵ
)
m
−
m
∗
ϵ
^
)
=
l
n
(
(
m
m
∗
ϵ
^
)
)
+
l
n
(
ϵ
m
∗
ϵ
^
)
+
l
n
(
(
1
−
ϵ
)
m
−
m
∗
ϵ
^
)
=
l
n
(
(
m
m
∗
ϵ
^
)
)
+
(
m
∗
ϵ
^
)
∗
l
n
(
ϵ
)
+
(
m
−
m
∗
ϵ
^
)
l
n
(
(
1
−
ϵ
)
)
ln(P(\hat{\epsilon};\epsilon))=ln(\begin{pmatrix} m \\ m*\hat{\epsilon} \end{pmatrix}*\epsilon^{m*\hat{\epsilon}}*(1-\epsilon)^{m-m*\hat{\epsilon}})\\=ln(\begin{pmatrix} m \\ m*\hat{\epsilon} \end{pmatrix})+ln(\epsilon^{m*\hat{\epsilon}})+ln((1-\epsilon)^{m-m*\hat{\epsilon}})\\=ln(\begin{pmatrix} m \\ m*\hat{\epsilon} \end{pmatrix})+({m*\hat{\epsilon}})*ln(\epsilon)+({m-m*\hat{\epsilon}})ln((1-\epsilon))
ln(P(ϵ^;ϵ))=ln((mm∗ϵ^)∗ϵm∗ϵ^∗(1−ϵ)m−m∗ϵ^)=ln((mm∗ϵ^))+ln(ϵm∗ϵ^)+ln((1−ϵ)m−m∗ϵ^)=ln((mm∗ϵ^))+(m∗ϵ^)∗ln(ϵ)+(m−m∗ϵ^)ln((1−ϵ))然后我们再对式子进行求导,现在对
ϵ
\epsilon
ϵ求导,此时要比之前更容易求导
∂
(
l
n
(
P
(
ϵ
^
;
ϵ
)
)
)
∂
ϵ
=
∂
(
l
n
(
(
m
m
∗
ϵ
^
)
)
)
+
∂
(
(
m
∗
ϵ
^
)
∗
l
n
(
ϵ
)
)
+
∂
(
(
m
−
m
∗
ϵ
^
)
l
n
(
(
1
−
ϵ
)
)
)
=
0
+
(
m
∗
ϵ
^
)
∗
1
ϵ
+
(
m
∗
ϵ
^
−
m
)
∗
1
1
−
ϵ
=
m
∗
(
ϵ
^
−
ϵ
)
(
1
−
ϵ
)
∗
ϵ
\frac{\partial(ln(P(\hat{\epsilon};\epsilon)))}{\partial\epsilon}=\partial(ln(\begin{pmatrix} m \\ m*\hat{\epsilon} \end{pmatrix}))+\partial(({m*\hat{\epsilon}})*ln(\epsilon))+\partial(({m-m*\hat{\epsilon}})ln((1-\epsilon)))\\=0+({m*\hat{\epsilon}})*\frac{1}{\epsilon}+({m*\hat{\epsilon}-m})*\frac{1}{1-\epsilon}\\=\frac{m*(\hat{\epsilon}-\epsilon)}{(1-\epsilon)*\epsilon}
∂ϵ∂(ln(P(ϵ^;ϵ)))=∂(ln((mm∗ϵ^)))+∂((m∗ϵ^)∗ln(ϵ))+∂((m−m∗ϵ^)ln((1−ϵ)))=0+(m∗ϵ^)∗ϵ1+(m∗ϵ^−m)∗1−ϵ1=(1−ϵ)∗ϵm∗(ϵ^−ϵ)
我们也知道当其导数为0时有最大值,且此时
ϵ
=
ϵ
^
\epsilon=\hat{\epsilon}
ϵ=ϵ^。根据书上的例子,
ϵ
=
0.3
\epsilon=0.3
ϵ=0.3,m=10,我们可以用Python代码将其表示出来:
import matplotlib.pyplot as plt
from scipy.special import comb
from matplotlib.font_manager import FontProperties
import numpy as np
import matplotlib
a = 0.3
m = 10
p = []
for error in range(11):
k = comb(m,error)*(a**error)*((1-a)**(m-error))
p.append(k)
fig = plt.figure()
ax = fig.add_subplot(111)
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
plt.xlabel('误分类样本数',fontproperties=font)
plt.ylabel('概率',fontproperties=font)
y = np.arange(0,0.35,0.05)
x = np.arange(0,11.0,1.0)
plt.xticks(x)
plt.yticks(y)
ax.scatter(x,p)
plt.plot(x,p)
plt.show()
我们可以得到和书上基本一致的图像
图中的横坐标虽然是误分类的样本数,但是除以样本总数即可得到此时的测试错误率
ϵ
^
\hat{\epsilon}
ϵ^,由图我们也可以看出当泛化错误率
ϵ
\epsilon
ϵ为
ϵ
^
\hat{\epsilon}
ϵ^时其概率最大。
我们可以由图看出当泛化错误率给定时,测试错误率与总样本数的乘积即误分类样本数说一个二项分布,我们对其进行假设检验,也称为二项检验。书中给出原假设“ ϵ < = ϵ 0 \epsilon<=\epsilon_0 ϵ<=ϵ0”,那么其备择假设就是“ ϵ > ϵ 0 \epsilon>\epsilon_0 ϵ>ϵ0”,即原假设不成立时的对立结果,由此我们也可以得出这是一个右侧单边检验。书中直接给出了公式(最新的印刷有些不一样) ϵ ˉ = m i n ϵ s . t . ∑ i = ϵ ∗ m + 1 m ( m i ) ∗ ϵ 0 i ∗ ( 1 − ϵ 0 ) m − i < α \bar{\epsilon}=min\ \epsilon\ \ s.t.\ \displaystyle\sum_{i=\epsilon*m+1}^{m} \begin{pmatrix} m \\ i \end{pmatrix}* \epsilon_0^{i}*(1-\epsilon_0)^{m-i}<\alpha ϵˉ=min ϵ s.t. i=ϵ∗m+1∑m(mi)∗ϵ0i∗(1−ϵ0)m−i<α
我们知道假设检验如果结果落入拒绝域范围,那么我们则可以拒绝原假设,所以对于上述公式也同样的道理。用书上的图来解释
α \alpha α是显著水平,1- α \alpha α是置信区间,我们可以将图看作是普通的假设检验的单边检验的函数图像,图中的 α \alpha α区域看成拒绝域,其他部分看成是接受域,只要在 ϵ = ϵ 0 \epsilon=\epsilon_0 ϵ=ϵ0的情况下,该学习器的测试错误率 ϵ ^ \hat{\epsilon} ϵ^没有落入拒绝域中,那么我们就有1- α \alpha α的置信度认为学习器的泛化错误率 ϵ {\epsilon} ϵ小于 ϵ 0 {\epsilon_0} ϵ0,(因为 ϵ {\epsilon} ϵ是不知道的,我们只是假设),所以我们的关键就在于求出那个临界值。
我们之前的概率值是在泛化错误率给定的情况下,学习器对
ϵ
^
\hat{\epsilon}
ϵ^的概率估计,我们要求假设接受的临界值,相当于就是满足概率相加的和小于
α
\alpha
α最小的那个测试错误率,书中给出的这个公式的作用也就是这个意思,我们可以看出图中5就是那个临界值,因为当误分类样本数为6,7,8,9,10的这些概率相加的和小于
α
\alpha
α,但若是加上5的这个概率值,那么就会大于
α
\alpha
α,不满足条件,所以5就是最小的临界值。得到临界值后,只要判断其与测试错误率的大小即可。