news 2026/6/24 23:44:35

深度学习中的McNemar检验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度学习中的McNemar检验

在深度学习模型中,McNemar检验(McNemar's Test,麦克尼马尔检验)是检验不同的深度学习分类器模型(准确率)或回归模型(命中率)在相同测试数据上性能是否存在显著差异的统计检验方法

McNemar检验基于两个模型预测结果的2x2列联表(contingency table),如下图所示:

1. 列联表:是对两个分类或回归变量进行列表或计数。列联表的依据是两个分类模型或回归模型均使用完全相同的训练数据进行训练,并使用完全相同的测试数据进行评估

2.McNemar检验仅关注两个条件存在差异的单元格:McNemar仅关心n01和n10。n00:模型A和模型B均未命中的样本数。n11:模型A和模型B均命中的样本数。n01:模型A未命中,但模型B命中的样本数。n10:模型A命中,但模型B未命中的样本数。

3. 判断逻辑:如果n01约等于n10:两模型差异可能是随机的。如果n01 >> n10:模型B显著优于模型A。如果n01 << n10:模型A显著优于模型B。

4. 卡方分布表(chi-square distribution table),如下图所示:

5. 公式:推荐使用连续性校正

(1).原始公式(未校正):10 <= n01 + n10 < 25,服从自由度df=1(或χ²(1))的卡方分布

(2).连续性校正(Yates)公式:n01 + n10 >= 25,服从自由度df=1(或χ²(1))的卡方分布

(3).精确检验:n01 + n10 < 10,scipy.stats.binomtest

6. 判断标准,计算pvalue得结论:

(1).pvalue < 0.05:两个模型有显著差异。

(2).pvalue >= 0.05:两个模型差异不显著。

以下测试代码是用McNemar检验两个回归模型是否有显著差异:

def parse_args(): parser = argparse.ArgumentParser(description="mcnemar test") parser.add_argument("--src_file", required=True, type=str, help="src file name") parser.add_argument("--src_file2", required=True, type=str, help="src file name") parser.add_argument("--threshold", type=float, default=0.5, help="error margin") args = parser.parse_args() return args def mcnemar_test(src_file, src_file2, threshold): if src_file is None or not src_file or not Path(src_file).is_file(): raise ValueError(colorama.Fore.RED + f"{src_file} is not a file") if src_file2 is None or not src_file2 or not Path(src_file2).is_file(): raise ValueError(colorama.Fore.RED + f"{src_file2} is not a file") def parse_csv(file): with open(file, "r", encoding="utf-8") as f: reader = csv.reader(f) all_rows = list(reader) data = all_rows[1:-1] # remove the first and last rows return data data1 = parse_csv(src_file) data2 = parse_csv(src_file2) if len(data1) != len(data2): raise ValueError(colorama.Fore.RED + f"length mismath: {src_file}:{len(data1)}, {src_file2}:{len(data2)}") print(f"number of data rows: {len(data1)}") is_same = all(row1[0] == row2[0] for row1, row2 in zip(data1, data2)) if not is_same: raise ValueError(colorama.Fore.RED + f"image name mismatch: {src_file}, {src_file2}") n11 = 0; n10 = 0; n01 = 0; n00 = 0 for i in range(len(data1)): value1 = abs(float(data1[i][1]) - float(data1[i][2])) value2 = abs(float(data2[i][1]) - float(data2[i][2])) if value1 <= threshold and value2 <= threshold: n11 += 1 elif value1 > threshold and value2 > threshold: n00 += 1 elif value1 <= threshold and value2 > threshold: n10 += 1 elif value1 > threshold and value2 <= threshold: n01 += 1 else: raise ValueError(colorama.Fore.RED + f"unsupported conditions: value: {value1}, {value2}") print(f"n11: {n11}; n10: {n10}; n01: {n01}; n00: {n00}") if n10 + n01 == 0: print(colorama.Fore.YELLOW + "unable to test differences") return def calculate_pvalue(n10, n01, method): # method: 0:Yates; 1:original; 2:exact binomial test if method == 0: stat = (abs(n01 - n10) - 1) ** 2 / (n10 + n01) return chi2.sf(stat, df=1) elif method == 1: stat = (n01 - n10) ** 2 / (n10 + n01) return chi2.sf(stat, df=1) else: return binomtest(k=min(n10, n01), n=n10+n01, p=0.5, alternative="two-sided").pvalue if n10 + n01 >= 25: pvalue = calculate_pvalue(n10, n01, 0) elif 10 <= n10 + n01 < 25: pvalue = calculate_pvalue(n10, n01, 1) else: pvalue = calculate_pvalue(n10, n01, 2) if pvalue < 0.05: print(colorama.Fore.GREEN + f"pvalue: {pvalue:.4f}, the two models show a significant difference") else: print(colorama.Fore.YELLOW + f"pvalue: {pvalue:.4f}, the two models no not show a significant difference") if __name__ == "__main__": colorama.init(autoreset=True) args = parse_args() mcnemar_test(args.src_file, args.src_file2, args.threshold) print(colorama.Fore.GREEN + "====== execution completed ======")

执行结果如下图所示:

GitHub:https://github.com/fengbingchun/NN_Test

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 11:51:20

军储作业全过程三维态势感知与事后数字化复盘应用场景

军储作业全过程三维态势感知与事后数字化复盘应用场景摘要军储作业具有流程严谨、责任明确、事后可追溯要求极高等特点。传统基于二维视频的管理方式&#xff0c;虽可实现作业过程的画面留存&#xff0c;但难以对人员与车辆在复杂库区结构中的真实空间行为进行准确刻画&#xf…

作者头像 李华
网站建设 2026/6/10 18:29:56

2026年AI智能产品开发领域十大黑马如何炼成?

2026年AI智能产品开发领域十大创新实践案例解析在数字化转型浪潮中&#xff0c;AI智能产品开发已成为企业突破技术瓶颈、提升市场竞争力的核心手段。本文通过剖析十家企业的创新实践案例&#xff0c;展示不同技术方案如何解决实际业务问题&#xff0c;并为行业提供参考。一、虎…

作者头像 李华
网站建设 2026/6/16 18:05:54

C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战

一. 自动化测试基础&#xff1a;先搞懂"为什么"和"做什么"在学习 Web 自动化测试前&#xff0c;我们需要先明确自动化测的核心点定位&#xff0c;它并不可以完全“取代人工”而是帮助测试人员提高效率(主要体现在回归测试上)&#xff0c;让测试人员将更多的…

作者头像 李华
网站建设 2026/6/24 9:34:16

2026年琼海必打卡的8大特色海鲜餐厅推荐

在琼海&#xff0c;海鲜与川湘风味的结合为食客带来了独特的美食体验。本文将介绍2026年不可错过的琼海特色餐厅&#xff0c;让你尽情享受海南地方菜的魅力。这些餐厅提供新鲜美味的海鲜&#xff0c;其中琼海辣炒海鲜更是深受喜爱。每家餐厅都有各自的特点和招牌菜&#xff0c;…

作者头像 李华
网站建设 2026/6/9 23:46:14

conda使用指南

内容来自尚硅谷 Conda使用指南1. Conda 基本介绍 1.1 什么是 Conda、MiniConda、AnacondaConda是一个包和环境管理的工具。支持 Windows、macOS和 Linux。Conda可以快速的安装、运行和更新包和相关的依赖。Conda也可以轻易地创建、保存、加载和转换环境。 Anaconda是一个用于科…

作者头像 李华
网站建设 2026/6/18 22:54:58

19岁嫁豪门,20岁离婚带儿子净身出户,单亲40年如今儿子为她争气

1958年的香港&#xff0c;19岁的林淑芬穿着租来的婚纱站在教堂彩窗前&#xff0c;钻石项链在颈间泛着冷光。这场豪门婚姻像一场绚丽的烟火&#xff0c;在众人艳羡中绽放&#xff0c;又在一年后骤然熄灭。当她抱着襁褓中的儿子走出半山别墅时&#xff0c;晨雾打湿了旗袍下摆&…

作者头像 李华