我们要比较两个学习器的学习性能,不仅仅需要求出两个关于性能度量的值,然后定量比较就完事儿的。因为,机器学习中,学习器性能的比较涉及到很多方面,而这些方面有时候又有矛盾关系。
我们需要考虑的评估学习性能的因素主要有以下几点:
因此,我们需要专门研究一下机器学习的比较检验问题。
首先引入两个概念:
两者区别就是:泛化错误率是一个理论上的值,无法获得,而测试错误率是一个我们可以测量得到的值。统计假设检验的方法就是用 e ′ e' e′估计 e e e的值;
一个泛化错误率为 e ′ e' e′的学习器来测试一个大小为 m m m的测试样例集,只可能有分对和分错两种情况,其中 e ′ m e'm e′m个分错,其余的分对,因此这就是一个典型的二项分布,那么我们可以得出测试的错误率分布函数:
P ( e ′ ; e ) = ( m e ′ m ) e e ′ m ( 1 − e ) m − e ′ m P(e';e)= \left(\begin{matrix} m\\ e'm \end{matrix}\right) e^{e'm}(1-e)^{m-e'm} P(e′;e)=(me′m)ee′m(1−e)m−e′m
对 P ( e ′ ; e ) P(e';e) P(e′;e)作关于 e e e的一阶导,令 δ P ( e ′ ; e ) / δ e = 0 \delta P(e';e)/\delta e=0 δP(e′;e)/δe=0,解得 e = e ′ e=e' e=e′时, P ( e ′ ; e ) P(e';e) P(e′;e)最大; ∣ e − e ′ ∣ |e-e'| ∣e−e′∣增大, P ( e ′ ; e ) P(e';e) P(e′;e)减小,就像二项分布一样;
之后便是检验的过程,由于西瓜书上讲的有点晦涩,所以我尽量用稍微简单点的方式描述一下二项假设检验。
前提条件:对于一个分布函数,我们已知这是一个二项分布了,但是这个二项分布的参数(二项分布就只有一个参数,就是正例概率p,在这个例子里面是泛化错误率)的取值是未知的。
假设方法
我们可以用假设的办法,人为的规定一个参数取值的“阈值范围”,在这个例子中,我们假设 e ≤ e 0 e\leq e_0 e≤e0;
然后我们根据客观需要或者一些计算公式(这里不再赘述,具体问题具体分析),再人为设定一个用于检验的置信度 α \alpha α,这个变量表示出现明显错误的标准,比如这个二项分布中大于6的概率为 α \alpha α,我设定阈值为 α \alpha α就说明我认为如果学习器分类错误个数大于6,那么就属于明显错误,这个假设是不成立的;
反之, 1 − α 1-\alpha 1−α则表示不会出现明显错误的标准,也就是可信任的标准;
我们现在就是要利用这个 1 − α 1-\alpha 1−α,来推出在这个置信度下,我们假设的 e 0 e_0 e0是不是合理的;
判断假设的合理性
判断合理性一共有两种方法,我主要介绍一下西瓜书上的那种;
大致的思路就是:利用我们设定好的 1 − α 1-\alpha 1−α的值作为约束,求得分布曲线不大于这个值的积分面积。在书中的例子中用的是条形1统计图,那就把每一条的横纵坐标相乘再做一个求和运算,求出不大于 1 − α 1-\alpha 1−α的最大值,最后求得这个时候的 e i e_i ei;
写成计算公式是这样的:
∑ i = e 0 m + 1 m ( m i ) e i ( 1 − e ) m − i < 1 − α \sum_{i=e_0m+1}^{m} \left(\begin{matrix} m\\ i \end{matrix}\right) e^i(1-e)^{m-i} <1-\alpha i=e0m+1∑m(mi)ei(1−e)m−i<1−α
意思就是对这个条形统计图从最左边的一条开始累加“横坐标和纵坐标的面积”,然后一直加到刚好不大于 1 − α 1-\alpha 1−α为止。我们取出此时的 i i i,对应的横坐标即为可接受的阈值标准,再拿我们预先设定好的 e 0 e_0 e0跟它作比较,若 e 0 e_0 e0在小于这个阈值标准,则说明该假设可接受,是合理的假设;否则就是不合理的,需要重新假设。
其实说到头,这就是一个“自编自导”的过程,总结起来就是首先通过二项分布的特征,得到一个大致的阈值,然后在这个阈值中寻找更为精确的点。针对不同的学习器,我们可以使用这种方法,来人为设定参数,比较两个学习器的好坏。
很多时候我们为了确保结果的普适性和精确度,我们会做很多次估计检测,假设我们得到了k个错误率 e 1 ′ , . . . . , e k ′ e_1',....,e_k' e1′,....,ek′,那么我们很容易得到平均错误率 μ \mu μ和方差 δ 2 \delta^2 δ2为:
μ = 1 k ∑ i = 1 k e i ′ , δ 2 = 1 k − 1 ∑ i = 1 k ( e i ′ − μ ) 2 . \mu=\frac{1}{k} \sum_{i=1}^{k}e_i' ,\\ \delta^2=\frac{1}{k-1} \sum_{i=1}^{k}(e_i'-\mu)^2. μ=k1i=1∑kei′,δ2=k−11i=1∑k(ei′−μ)2.
由于每次估计检测都是独立的,所以这个概率分布函数可以写成:
T t = k ( μ − e 0 ) δ T_t=\frac{\sqrt{k}(\mu-e_0)}{\delta} Tt=δk(μ−e0)
其中这个 e 0 e_0 e0是泛化错误率,这是一个满足正态分布的函数;
接下来我们还是跟二项检验一样,设定一个置信度 α \alpha α,在正态分布曲线两边的 α 2 \frac{\alpha}{2} 2α处各取一个明显错误区间,如图所示:
然后假设一个阈值区间 μ = e ′ \mu=e' μ=e′,计算白色图像曲线下的定积分(条形统计图计算方法参照二项检验),将两个假设做一个对比,如果 e ′ e' e′在置信度 α \alpha α推出的区间内,则说明是可接受的。
双边t检验常用的临界值表:
这一部分的总体过程跟二项检验很相似,除了公式和分布曲线不一样,其余的步骤都是可以仿照二项检验的步骤的,这里就不再赘述。
以上两个方法主要针对单个学习器性能的衡量,如果对于多学习器来说,则可以用k折交叉验证t检验来完成。
比如两个学习器A和B经过k次测试的错误率分别为 e 1 A , . . . , e k A {e_1^A,...,e_k^A} e1A,...,ekA, e 1 B , . . . , e k B e_1^B,...,e_k^B e1B,...,ekB,其中 e i A , e i B e_i^A,e_i^B eiA,eiB是经过k折训练得到的第i折结果,对每一组训练测试结果求差值: Δ i = e i A − e i B \Delta_i=e_i^A-e_i^B Δi=eiA−eiB;
假设每次测试都是相互独立的,所以我们可以把 Δ 1 . . . Δ k \Delta_1...\Delta_k Δ1...Δk视作k次性能差值的独立采样过程,计算出这组数据的均值 μ \mu μ和方差 δ 2 \delta^2 δ2,因此我们有:
α i s a c c e p t a b l e s . t . T t = a b s ( k μ δ ) < t α 2 \alpha~is~acceptable~~~~ s.t. T_t=abs(\frac{\sqrt{k}\mu}{\delta})
这个过程的思路同样也是设定一个置信度 α \alpha α,然后判断阈值是否在置信度可接受范围内。
实际上,我们的训练\测试集很容易产生重叠,所以每一次的测试不一定是相互独立的。
我们可以粗略的推测一下,如果我们的训练测试集出现重叠,那么我们得到的k折测试结果是有一定程度的相关性和相似度的,而我们如果还是假设这些测试结果相互独立,也就是说原本“粘合在一起的一堆结果”,我们把它们视作“没有粘合在一起”,那么就相当于我们假设的可接受范围实际上是偏大的,我们会高估假设成立的概率。
所以我们可以采用“5×2交叉验证”,来缓解这个问题。所谓5×2,就是做5次2折交叉验证,在每次2折交叉验证之前一定要把数据打乱,保证划分不重复。基本思路如下:
对于两个学习器A和B,每次2折交叉验证会产生两组测试错误率,我们对它们分别求差,得到第1折上的差值 Δ i 1 \Delta_i^1 Δi1和第2折上的差值 Δ i 2 \Delta_i^2 Δi2;
对第一次2折验证的两个结果取平均值 μ ′ \mu' μ′,对每次2折实验结果做方差 δ ′ 2 \delta'^{2} δ′2,平均值采用之前第一折的均值 μ ′ \mu' μ′;
其概率分布函数为:
T t ′ = μ ′ 0.2 ∑ i = 1 5 δ i 2 T_t'=\frac{\mu'}{\sqrt{0.2\sum_{i=1}^{5}\delta_i^2}} Tt′=0.2∑i=15δi2μ′为什么这样就可以缓解测试结果之间的独立性问题了呢?其实很简单,因为我们的均值只是一次测试结果的一组错误率,此后所有的测试结果在计算方差的时候都用的是前面的一组错误率,因此方差的大小仅仅跟原始数据和第一次测试的错误率有关。但是我觉得这种方法得建立在第一次测试的结果比较贴合实际的基础上才会比较好的说服力(个人的一点想法,欢迎大佬指正)。
这个检验方法的主要思路是针对两个二分类学习器的分类结果列出列联表,然后推出两个学习器性能差别的卡方分布函数,再作假设检验;接下来大致的描述一下这个方法的步骤:
然后取 ∣ e 01 − e 10 ∣ |e_{01}-e_{10}| ∣e01−e10∣,这个变量服从正态分布;这个检验方法考虑变量
T x 2 = ( ∣ e 01 − e 10 ∣ − 1 ) 2 e 01 + e 10 T_{x^2}=\frac{(|e_{01}-e_{10}|-1)^2}{e_{01}+e_{10}} Tx2=e01+e10(∣e01−e10∣−1)2
这是一个自由度为1的卡方分布,剩余的假设检验步骤同上:做出假设置信度、推出可接受的范围,检验假设阈值是否在可接受范围内、得出结论。
交叉验证t检验和McNemar检验只适用于两两比对,当要比对多个算法的学习器的时候,显然将算法两两比对太麻烦了,所以引入一种可以在同一组数据集上对多个算法进行比对的检验方法。
F检验法的基本思想是在同一组数据集上,根据测试结果对学习器的性能进行排序,赋予序值1,2,3…,相同则平分序值,如下图所示:
性能越好,赋予的值就越小,然后计算出每个算法在各个数据集上的平均序值 r i r_i ri;
这里需要注意,表中的数据只是一个特例,有了这个平均序值并不能完全说明序值小的算法一定更好,因为针对不同的数据集,也许A算法会不如B算法,而且两种学习器在同一个数据集上也可能会有相似的结果,所以我们需要用一个估计阈值,来判定哪个算法更加好。
假设在N个数据集上比较k个算法, r i r_i ri的均值和方差分别是 ( k + 1 ) / 2 (k+1)/2 (k+1)/2和 ( k 2 − 1 ) / 12 N (k^2-1)/12N (k2−1)/12N,得到分布函数(推导过程略):
T X 2 = 12 N k ( k + 1 ) ( ∑ i = 1 k r i 2 − k ( k + 1 ) 2 4 ) T F = ( N − 1 ) T X 2 N ( k − 1 ) − T X 2 T_{X^2}=\frac{12N}{k(k+1)}(\sum_{i=1}^{k}r_i^2-\frac{k(k+1)^2}{4}) \\ \\ T_F=\frac{(N-1)T_{X^2}}{N(k-1)-T_{X^2}} TX2=k(k+1)12N(i=1∑kri2−4k(k+1)2)TF=N(k−1)−TX2(N−1)TX2
T X 2 T_{X^2} TX2为原始Friedman检验分布函数, T F T_F TF为F检验分布函数;这个算法中,西瓜书明确的给了一个临界值表:
是否可接受的检验仍然同上。
如果所有算法的性能相同这个假设被拒绝了,则需要进行后续检验,来对算法做一个进一步的比较。因为前面的步骤我们只是了解了这k个算法并不是全部性能相同,现在我们需要把性能不相同的学习器“找出来”,并且比较出孰优孰劣。
下面介绍一下Nemenyi检验算法的具体过程:
基本原理是根据两个算法的平均序值之差与CD值比较,如果均值差超过CD值,则说明这两个学习器的性能有差别。
CD值计算公式如下:
C D = q α k ( k + 1 ) 6 N CD=q_\alpha \sqrt{\frac{k(k+1)}{6N}} CD=qα6Nk(k+1)
其中 q α q_\alpha qα值的取值表如下:如果两个序值之差大于CD值,那么平均序值小的算法在一定程度上是要优于平均序值大的算法。
所以回过头来看,平均序值只是一个参考的方面,我们还需要在Friedman检验和Nemenyi后续检验的前提下,才可以比较严谨的用平均序值来衡量算法的优劣。
下一节:机器学习笔记3——线性回归