白话机器学习:假设检验(二)

时间:2024-05-23 12:03:52


​ 之前的一篇关于假设检验的文章主要是针对一个学习算法的假设检验。在真是工作环境中,很多情况下,我们都是想比较两个学习算法到底哪个更好。或者用概率的思路来说,学习算法A比学习算法B更好的机率有多大?

​ 这一篇接着上一篇来讲一讲这个问题。

t检验

​ 上一篇也提到了t检验。这里把单算法的假设:μ=ϵ0\mu = \epsilon_0改成 μA=μB\mu_A = \mu_B,也就是假设两个学习算法的错误率均值相同。

​ 那么跟着上一篇文章的结论,如果t检验公式计算值ϵ0\leq \epsilon_0,那么表示在1α1-\alpha的置信度下,两个学习期的平均错误率μA\mu_AμB\mu_B差不多的假设成立。

卡方检验

​ 卡方检验也是针对两个学习算法比较的假设检验。

​ 卡方检验和t检验一样,是通过构造一个服从卡方分布(χ2\chi^2)的统计量来计算某种假设的概率。在讲卡方检验之前,首先要讲另外的一个概念:列联表。

​ 针对二分类问题,有两个学习算法A和学习算法B,可以把所有的测试集样本划分成四种情况:

  • 两个学习算法都分类正确的样本数目e00e_{00}
  • 两个学习算法都分类错误的样本数目e11e_{11}
  • A学习算法分类正确,B学习算法分类错误的数目e01e_{01}
  • A学习算法分类错误,B学习算法分类正确的数目e01e_{01}

​ 针对这四个数字,列出一张列联表:
白话机器学习:假设检验(二)

​ 如果我们做出假设两个算法的性能相同,还是以错误率来衡量,那么我们的假设就是:ϵA=ϵB\epsilon_A = \epsilon_B。通过这个列联表的数目来看,如果两个算法的错误率相同,那么可以知道:e01=e10e_{01} = e_{10}。也就是说我们可以把假设改成:e01=e10e_{01} = e_{10}

​ 所以我们可以构造统计量X=e01e10X=e_{01}-e_{10},然后再构造统计量τχ2=(e01e101)2e01+e10\tau_{\chi^2} = \frac{(|e_{01}-e_{10}-1|)^2}{e_{01}+e_{10}},这个统计量是服从卡方χ2\chi^2分布的。此时的*度k=1k=1。(我理解的*度就是类别数减一)

​ 卡方检验也有一张查询表:

白话机器学习:假设检验(二)

​ 从表中看出,*度为1的情况下,如果显著性水平α=0.05\alpha = 0.05,也就是置信度为95%的情况下,临界值为3.841。换句话说就是上面的卡方值τχ23.841\tau_{\chi^2} \leq 3.841的话,我们的假设e01=e10e_{01} = e_{10}成立的概率为95%,也就是说两个学习算法性能相同的的概率是95%。

Friedman检验

​ 回头看看前面几种检验方法:

  • t检验可以检验单个算法在某个数据集上的测试指标是否可以代表整体
  • t检验改造一下可以检验两个算法在某个数据集上的测试测试指标是否相同
  • 卡方检验也是可以检验两个算法在某个数据集上的测试测试指标是否相同

​ 在实际工作中,通常是会使用到多个数据集,使用多个算法去进行尝试,试图获得最好的算法。那么此时如何比较哪个算法最好(不是由某种抽烟误差导致),就需要使用更牛逼的检验方法了。当然也可以在某一个数据集上对算法进行两两比较,然后再换数据集进行两两比较,但是这种方法太笨拙了。这时候就可以用F检验(Friedman检验,油炸男?)方法了。

  1. 假设有kk个算法在NN个数据集上来做比较。假设在数据集DjD_j上,k个算法存在k个指标(以错误率为例),将这些指标从高到低排序(假设都不一样):ϵ1,ϵ2...ϵk\epsilon_1, \epsilon_2...\epsilon_k,称作算法序值。

    我们可以做出假设:k个算法的性能基本相同。

    ​ 表 1

数据集 算法A 算法B 算法C
D1 1 2 3
D2 1 2.5 2.5
D3 1 2 3
D4 1 2 3
平均序值 1 2.125 2.875
  1. 然后设统计变量rir_i为第ii个算法的平均序值。rir_i的序值为(k+1)/2(k+1)/2,因为所有的序值(N个数据集,k个算法)相加就是N(k+1)/2N(k+1)/2,那么平均值就是(k+1)/2(k+1)/2,方差为(k21)/12(k^2-1)/12

  2. rir_i服从正态分布(什么中心极限定理,不去研究了,大佬说服从就服从)。所以再构造统计变量:
    τχ2=k1k12Nk21i=1kri(k+12)2=12Nk(k+1)i=1k(ri2k(k+1)24) \tau_{\chi^2} =\frac{k-1}{k}*\frac{12N}{k^2-1}\sum_{i=1}^k{r_i-(\frac{k+1}{2})^2} ① \\ =\frac{12N}{k(k+1)}*\sum_{i=1}^k{({r_i}^2-\frac{k(k+1)^2}{4})} ②
    这个随机变量是服从χ2\chi^2分布的,从①式可看出来。

  3. 然后再构造一个随机变量(不知道为啥要怎么搞,听大佬的)
    τF=(N1)τχ2N(k1)τχ2 \tau_F=\frac{(N-1)\tau_{\chi^2}}{N(k-1)-\tau_{\chi^2}}
    然后,这么个随机变量τF\tau_F服从的分布就是*度为k1k-1(k1)(N1)(k-1)(N-1)的F分布,F分布有两个*度。

  4. 同样,F分布有临界值表格:

白话机器学习:假设检验(二)

​ 这里的含义也是相同的,如果τF\tau_F计算得到的值小于某个临界值,比如2.250,那么就是说,在数据集为4,算法个数为10的情况下,有95%的置信度,这些算法的性能是相同的。

​ 这里存在一个问题,就是说,如果计算得出,这些算法在95%的置信度下,τF\tau_F的值大于了2.250,那么表示在数据集为4,算法个数为10的情况下,这些算法的性能是有差异的,上面提出的假设不成立。那么问题来了,哪个算法好一些呢?

Nemenyi后续检验

​ 在Nemenyi检验中,引入一个新的临界值:
CD=qαk(k+1)6N CD = q_{\alpha}\sqrt{\frac{k(k+1)}{6N}}
​ 如果两个算法的平均序值rAr_ArBr_B的差值小于这个邻接值,那么表示这两个算法之间没有明显的差异,如果有,平均序值小的那个算法更牛逼。

​ 根据表1可以画出下面这个图:

白话机器学习:假设检验(二)

​ 把算法的平均序值rir_i在图上画一个圆点,然后在圆点两边延长Nemenyi临界值CD的长度。如果不同算法代表的线段有重复的部分,那么就是没有明显的差异,如果没有重复的,左边线段代表的算法就更牛逼一点。

偏差与方差

​ 这里主要有几个概念需要好好捋一下:噪声、偏差、方差、偏差。

​ 在说这几个值之前,又要先提到三个标记值:

​ 有一个测试样本数据xx,那么

  • yy为测试数据样本的真实标记,也就是这个样本真正属于哪一类。
  • f(x,D)f(x, D)表示学习算法在训练集D上训练之后,对测试样本的输出值。书上是写的期望预测f(x)\overline{f(x)},也就是平均值。
  • yDy_D表示在测试集中,样本xx的标记值。

​ 有了上面几个概念之后,再来看下面几个差值(不是书上的公式证明,写的是我的理解)

  • 误差:首先讲误差,误差是学习算法对测试样本的输出值与标记值的区别。也就是说学习后,算法对数据样本的拟合程度怎么样。书上通过公式换算可知误差由偏差+方差+噪声组成。

  • 偏差:指的是预测值与真实值之间的区别,也就是f(x,D)f(x,D)yy之间的区别。这个是衡量一个学习算法是否准确的指标。

  • 方差:指的是每个预测值与平均预测值之间的偏差,如果方差较大,表示学习算法的抖动很大,一下天上,一下地上的感觉。

  • 噪声:表示标记值与真实值之间的区别,因为精度等各种各样的问题,难免有点差距。

  • 偏差-方差窘境:刚开始训练时,误差主要偏差导致,因为还没有学习到训练集样本的具体分布情况。当训练集足够多的时候,学习算法基本能拟合当前的训练集了,误差就基本由偏差导致。这是因为太拟合当前的训练集了,只要来一个稍微偏离拟合曲线的数据,就会造成很大的方差,从而导致误差。
    白话机器学习:假设检验(二)