R语言实战:四种方法可视化混淆矩阵(confusion matrix)

张开发
2026/4/19 10:06:41 15 分钟阅读

分享文章

R语言实战:四种方法可视化混淆矩阵(confusion matrix)
1. 为什么需要可视化混淆矩阵在机器学习分类任务中混淆矩阵Confusion Matrix是最基础也最重要的评估工具之一。简单来说它就是一个表格用来展示模型预测结果和实际标签的对应关系。但很多新手可能会问既然已经有了准确率、召回率这些指标为什么还要看这个表格呢想象一下你去医院做体检医生告诉你检查准确率是90%但这个数字并不能告诉你是健康人被误诊为患者的概率高还是患者被漏诊的概率高。而混淆矩阵就像一份详细的检查报告能清晰显示出真阳性、假阳性、真阴性、假阴性的具体数量让你对模型的表现有更全面的了解。在R语言环境中我们通常用table()函数就能生成一个基础的混淆矩阵。比如set.seed(123) data - data.frame( Actual sample(c(Positive,Negative), 100, replace TRUE), Prediction sample(c(Positive,Negative), 100, replace TRUE) ) confusion_table - table(data$Prediction, data$Actual) print(confusion_table)这个表格虽然包含了所有关键数据但纯数字的呈现方式不够直观特别是在向非技术人员汇报时。这就是为什么我们需要将混淆矩阵可视化——通过图形化的方式让人一眼就能看出模型的表现好坏。2. 自写函数绘制混淆矩阵2.1 基础准备首先我们需要使用caret包中的confusionMatrix函数生成一个标准的混淆矩阵对象。这个对象不仅包含基础的频数表还有各种衍生指标library(caret) result_matrix - confusionMatrix(data$Prediction, data$Actual)这个result_matrix对象包含两个主要部分table基础的混淆矩阵频数byClass和overall各种评估指标灵敏度、特异度、准确率等2.2 自定义绘图函数下面这个自写函数可以生成一个专业的可视化效果左侧是矩阵本身右侧是详细指标draw_confusion_matrix - function(cm) { layout(matrix(c(1,1,2))) # 设置画布布局 par(marc(2,2,2,2)) # 调整边距 # 绘制主标题 plot(c(100, 345), c(300, 450), type n, xlab, ylab, xaxtn, yaxtn) title(CONFUSION MATRIX, cex.main2) # 绘制矩阵框架 rect(150, 430, 240, 370, col#3F97D0) # 左上 rect(250, 430, 340, 370, col#F7AD50) # 右上 rect(150, 305, 240, 365, col#F7AD50) # 左下 rect(250, 305, 340, 365, col#3F97D0) # 右下 # 添加标签 text(195, 435, Negative, cex1.2) text(295, 435, Positive, cex1.2) text(125, 370, Predicted, cex1.3, srt90, font2) text(245, 450, Actual, cex1.3, font2) # 填充数值 res - as.numeric(cm$table) text(195, 400, res[1], cex1.6, font2, colwhite) # TN text(195, 335, res[2], cex1.6, font2, colwhite) # FP text(295, 400, res[3], cex1.6, font2, colwhite) # FN text(295, 335, res[4], cex1.6, font2, colwhite) # TP # 绘制指标区域 plot(c(100, 0), c(100, 0), type n, xlab, ylab, main DETAILS, xaxtn, yaxtn) # 添加指标 metrics - c(Sensitivity, Specificity, Precision, Recall) values - round(as.numeric(cm$byClass[c(1,2,5,6)]), 3) for(i in 1:4) { text(20, 85-(i*15), metrics[i], cex1.2, font2) text(50, 85-(i*15), values[i], cex1.2) } # 添加准确率 text(30, 35, Accuracy, cex1.5, font2) text(70, 35, round(cm$overall[1], 3), cex1.4) }使用这个函数非常简单draw_confusion_matrix(result_matrix)这个自写函数的优势在于完全可控你可以自由调整颜色、布局、显示内容等。但缺点是代码量较大适合需要高度定制化的场景。3. 使用内置函数fourfoldplot3.1 基础用法R基础包中就有一个专门用于可视化2×2表格的函数——fourfoldplot。这个函数特别适合展示两个二分变量的关系ctable - table(data$Actual, data$Prediction) fourfoldplot(ctable, color c(#CC6666, #99CC99), conf.level 0, margin 1, main Confusion Matrix)这个函数生成的图形很有特点四个象限的面积代表对应类别的比例颜色对比直观显示正确分类和错误分类对角线上的象限表示正确分类的样本3.2 高级定制fourfoldplot有很多参数可以调整fourfoldplot(ctable, color c(#E41A1C, #377EB8), # 自定义颜色 std ind.max, # 标准化方法 conf.level 0.95, # 显示置信区间 margin 2, # 调整边距 space 0.2, # 象限间距 main Customized Fourfold Plot)这个方法的优点是简单快捷不需要额外安装包。但缺点是只适用于2×2的混淆矩阵对于多分类问题就无能为力了。4. 使用yardstick包可视化4.1 现代tidyverse风格yardstick是tidymodels生态系统的一部分提供了更现代的API来处理模型评估指标。配合ggplot2可以生成美观的热力图library(yardstick) library(ggplot2) cm - conf_mat(data, Actual, Prediction) autoplot(cm, type heatmap) scale_fill_gradient(low white, high #3498DB) theme_minimal() ggtitle(Confusion Matrix Heatmap) theme(plot.title element_text(hjust 0.5))4.2 多种可视化类型yardstick的autoplot方法支持三种可视化类型heatmap热力图默认mosaic马赛克图tile平铺图# 马赛克图 autoplot(cm, type mosaic) scale_fill_brewer(palette Blues) ggtitle(Mosaic Plot of Confusion Matrix) # 平铺图 autoplot(cm, type tile) geom_text(aes(label Freq), color white, size 8) scale_fill_viridis_c()yardstick方法的优势是与tidyverse生态无缝集成代码简洁优雅。但需要安装额外的包且对R新手来说可能需要先了解tidyverse的基本概念。5. 处理多类别混淆矩阵5.1 多分类问题的挑战当我们的分类问题超过两个类别时混淆矩阵就变成了一个n×n的表格。这时可视化变得更加重要也更具挑战性。我们以经典的iris数据集为例# 生成示例数据 set.seed(123) iris_confusion - confusionMatrix(iris$Species, sample(iris$Species))5.2 使用ggplot2自定义可视化我们可以将混淆矩阵转换为数据框然后用ggplot2灵活可视化# 转换数据格式 cm_df - as.data.frame(iris_confusion$table) cm_prop - as.data.frame(prop.table(iris_confusion$table)) cm_df$Perc - round(cm_prop$Freq * 100, 2) # 绘制热力图 library(ggplot2) ggplot(cm_df, aes(x Prediction, y Reference, fill Freq)) geom_tile(color white) geom_text(aes(label paste(Freq, (, Perc, %), sep )), color black, size 4) scale_fill_gradient(low white, high #27AE60) theme_minimal() labs(title Multi-class Confusion Matrix, x Predicted Class, y Actual Class) theme(axis.text.x element_text(angle 45, hjust 1))5.3 添加统计指标我们可以将统计指标和矩阵图并排展示library(gridExtra) library(grid) # 准备统计指标 stats_df - data.frame( Metric names(iris_confusion$overall), Value round(as.numeric(iris_confusion$overall), 3) ) # 创建表格图 stats_table - tableGrob(stats_df, rows NULL) # 组合图形 grid.arrange( ggplot(cm_df, aes(x Prediction, y Reference, fill Freq)) geom_tile() geom_text(aes(label Freq), color white, size 6) scale_fill_gradient(low #2980B9, high #2C3E50) theme_minimal(), stats_table, nrow 1, widths c(2, 1), top textGrob(Iris Species Classification Results, gp gpar(fontsize 18, font 2)) )多类别混淆矩阵可视化的关键在于使用颜色梯度帮助识别高频错误同时显示绝对数量和百分比合理组织布局避免信息过载添加旋转的轴标签提高可读性在实际项目中我经常需要向非技术背景的客户解释模型表现这种可视化方式比单纯的数字表格要有效得多。特别是在医疗领域清晰展示哪些类别的样本容易被混淆对后续的模型改进非常有帮助。

更多文章