前两个文章主要讲的是 McNemar 的原理,文章参考如下:
谈谈 Python 中的 McNemar 检验(一)-优快云博客
谈谈 Python 中的 McNemar 检验(二)-优快云博客
这一篇主要说一说 McNemar 的具体算法。
引用上面第一篇文章里的例子,关键是看数据 b 和 c。在第二篇文章里的例子,主要是将模型2的结果比模型1大的个数定义为b,而将模型2的结果比模型1小的个数定义为c,其实二个例子的原理是相同的,都是在比较 b 和 c。
下面,开始将具体算法。
首先,对b和c取较小值,定义为 m=min(b,c)
其次,无论你使用的是 游程模块 还是 列联表模块的 McNemar,算法都是一样的。即 m 服从参数为 (b+c, 0.5)的二项分布的,并由此得到m对应的p值。这是因为,当两个模型无差异时,m应该接近(b+c)的一半,因此用二项分布做检验。其实,m就是代码结果中的统计量值。在第二篇文章中的m=2也就是输出的统计量值。
需要提到的一点是,在我们的代码中使用了一个参数 exact=True,它的目的就是使用严格的二项分布的意思。我们可以选择 exact=False,但这样做的话,算法中将用 卡方分布 代替 二项分布