麦克内马尔检验(McNemar‘s Test)
麥克內馬爾檢驗(McNemar’s Test)
配對標稱數據的麥克內馬爾檢驗(McNemar’s Test)
from mlxtend.evaluate import mcnemar
概述
McNemar的檢驗[1](有時也稱為“受試者內卡方檢驗”)是對配對名義數據的統計檢驗。在機器學習中,我們可以使用兩種統計模型(NEMAR)來測試機器學習的準確性。麥克內馬爾的測試是基于兩個模型預測的2倍連續表。
McNemar’s Test Statistic
在麥克內馬爾的檢驗中,我們提出了零假設,即概率 p(b)p(b)p(b) and p(c)p(c)p(c),或者用簡化的術語來說:兩個模型中沒有一個比另一個更好。因此,另一種假設是,這兩種模型的性能并不相同。
McNemar檢驗統計量(“卡方”)可計算如下:
χ2=(b?c)2(b+c),\chi^2 = \frac{(b - c)^2}{(b + c)}, χ2=(b+c)(b?c)2?,
如果單元格c和b的總和足夠大,則 χ2\chi^2χ2 值遵循一個自由度的卡方分布。設置顯著性閾值后,例如,α=0.05α=0.05α=0.05。我們可以計算 ppp 值——假設零假設為真,ppp 值是觀察這個經驗(或更大)卡方值的概率。如果 ppp 值低于我們選擇的顯著性水平,我們可以拒絕兩個模型性能相等的無效假設。
連續性校正
在Quinn McNemar發表McNemar測試[1]大約一年后,Edwards[2]提出了一個連續性修正版本,這是當今更常用的變體:
χ2=(∣b?c∣?1)2(b+c).\chi^2 = \frac{( \mid b - c \mid - 1)^2}{(b + c)}. χ2=(b+c)(∣b?c∣?1)2?.
精確p值
如前所述,建議對小樣本量(b+c<25b + c < 25b+c<25[3])進行精確二項檢驗,因為卡方分布可能無法很好地近似卡方值。精確的p值可計算如下:
p=2∑i=bn(ni)0.5i(1?0.5)n?i,p = 2 \sum^{n}_{i=b} \binom{n}{i} 0.5^i (1 - 0.5)^{n-i}, p=2i=b∑n?(in?)0.5i(1?0.5)n?i,
其中 n=b+cn = b + cn=b+c,系數2用于計算雙邊 ppp 值。
實例
例如,鑒于兩個模型的精度分別為99.7%和99.6%,2x2連續性表可以為模型選擇提供進一步的見解。
在子圖A和B中,兩個模型的預測精度如下所示:
- model 1 accuracy: 9,960 / 10,000 = 99.6%
- model 2 accuracy: 9,970 / 10,000 = 99.7%
現在,在子圖A中,我們可以看到模型2得到了11個正確的預測,而模型1得到了錯誤的預測。反之亦然,模型2的預測是對的,模型2的預測是錯的。因此,基于這一11:1的比例,我們可以得出結論,模型2的表現明顯優于模型1。然而,在子圖B中,比例為25:15,這對于選擇哪種模型更好來說不太確定。
在下面的編碼示例中,我們將使用這兩種場景A和B來說明McNemar的測試。
References
- [1] McNemar, Quinn, 1947. “Note on the sampling error of the difference between correlated proportions or percentages”. Psychometrika. 12 (2): 153–157.
- [2] Edwards AL: Note on the “correction for continuity” in testing the significance of the difference between correlated proportions. Psychometrika. 1948, 13 (3): 185-187. 10.1007/BF02289261.
- [3] https://en.wikipedia.org/wiki/McNemar%27s_test
示例1-創建2x2連續表
mcnemar功能需要2x2列聯表作為NumPy數組,格式如下:
可以使用mlxtend的mcnemar_表函數創建這樣的鄰接矩陣。估計例如:
import numpy as np from mlxtend.evaluate import mcnemar_table# The correct target (class) labels y_target = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])# Class labels predicted by model 1 y_model1 = np.array([0, 1, 0, 0, 0, 1, 1, 0, 0, 0])# Class labels predicted by model 2 y_model2 = np.array([0, 0, 1, 1, 0, 1, 1, 0, 0, 0])tb = mcnemar_table(y_target=y_target, y_model1=y_model1, y_model2=y_model2)print(tb) [[4 1][2 3]]示例2——麥克內馬爾對方案B的測試
不,讓我們繼續概述部分中提到的示例,并假設我們已經計算了2x2連續表:
為了檢驗兩個模型的預測性能相等的零假設(使用顯著性水平 α=0.05α=0.05α=0.05 ),我們可以進行修正的麥克內馬爾檢驗,以計算卡方( chi-squared )和 p值(p-value),如下所示:
from mlxtend.evaluate import mcnemarchi2, p = mcnemar(ary=tb_b, corrected=True) print('chi-squared:', chi2) print('p-value:', p) chi-squared: 2.025 p-value: 0.154728923485由于 ppp 值大于我們假設的顯著性閾值(α=0.05α=0.05α=0.05),我們不能拒絕我們的零假設,并假設兩個預測模型之間沒有顯著差異。
示例3——麥克內馬爾對場景A的測試
與方案B(例2)相比,方案A中的樣本量相對較小(b+c=11+1=12b+c=11+1=12b+c=11+1=12),且小于建議的25[3],以通過卡方分布井近似計算出的卡方值。
在這種情況下,我們需要根據二項分布計算精確的p值:
from mlxtend.evaluate import mcnemar import numpy as nptb_a = np.array([[9959, 11],[1, 29]])chi2, p = mcnemar(ary=tb_a, exact=True)print('chi-squared:', chi2) print('p-value:', p) chi-squared: None p-value: 0.005859375假設我們在顯著性水平 α=0.05α=0.05α=0.05 的情況下進行了該測試,我們可以拒絕兩個模型在該數據集上表現相同的無效假設,因為 ppp 值(p≈0.006)小于 ααα。
API
mcnemar(ary, corrected=True, exact=False)
配對標稱數據的McNemar檢驗
參數
-
ary : array-like, shape=[2, 2]
2 x 2 contigency table (as returned by evaluate.mcnemar_table), where a: ary[0, 0]: # of samples that both models predicted correctly b: ary[0, 1]: # of samples that model 1 got right and model 2 got wrong c: ary[1, 0]: # of samples that model 2 got right and model 1 got wrong d: aryCell [1, 1]: # of samples that both models predicted incorrectly
2 x 2 contigency table(由evaluate.mcnemar_table返回),
? 其中
- a:ary[0,0]:# 兩個模型正確預測的樣本
- b:ary[0,1]:#模型1正確預測的樣本和模型2錯誤預測的樣本
- c:ary[1,0]:#模型2正確預測的樣本和模型1錯誤預測的樣本
- d:aryCell[1,1]:#兩個模型都預測錯誤的樣本數量
-
corrected : array-like, shape=[n_samples] (default: True)
如果True,則使用Edward的連續性校正進行卡方檢驗
-
exact : bool, (default: False)
If True, uses an exact binomial test comparing b to a binomial distribution with n = b + c and p = 0.5. It is highly recommended to use exact=True for sample sizes < 25 since chi-squared is not well-approximated by the chi-squared distribution!
如果 True,則使用精確的二項檢驗,將 b 與 n=b+c 且 p=0.5 的二項分布進行比較。對于小于25的樣本量,強烈建議使用’exact=True’,因為卡方分布不能很好地近似卡方分布!
Returns
-
chi2, p : float or None, float
返回卡方值和p值;如果’exact=True’(默認值為’False’),‘chi2’是’None’`
Examples
For usage examples, please see [http://rasbt.github.io/mlxtend/user_guide/evaluate/mcnemar/](http://rasbt.github.io/mlxtend/user_guide/evaluate/mcnemar/)reference
@online{Raschka2021Sep,
author = {Raschka, S.},
title = {{McNemar’s Test - mlxtend}},
year = {2021},
month = {9},
date = {2021-09-03},
urldate = {2022-03-10},
language = {english},
hyphenation = {english},
note = {[Online; accessed 10. Mar. 2022]},
url = {http://rasbt.github.io/mlxtend/user_guide/evaluate/mcnemar},
abstract = {{A library consisting of useful tools and extensions for the day-to-day data science tasks.}}
}
總結
以上是生活随笔為你收集整理的麦克内马尔检验(McNemar‘s Test)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学分析-基本积分表
- 下一篇: C++学习——基于binance的AS做