20  三维混淆矩阵

混淆矩阵大家应该都不陌生,但是3d版的混淆矩阵你见过吗?

今天的3d版混淆矩阵来自一位粉丝,图形如下:

文章DOI:doi:10.1007/s12072-021-10188-5

千万不要被这个图难住了,它其实非常简单,你把它的z轴去掉,看看是不是就是普通的混淆矩阵?

这个3d版不过是增加了一个维度,用来表示人数而已。

我们通过R语言可以轻松实现这个图,当然,Excel也很简单!3d柱状图嘛

我们就用这篇推文中的混淆矩阵为例:ROC阳性结果还是阴性结果?

上次用到的数据如下:

rm(list = ls())
suppressMessages(library(tidyverse))
load(file = "./datasets/df1.rdata")
psych::headTail(df1)
##     outcome  ca125         pred
## 1      肿瘤  51.88 猜他不是肿瘤
## 2      肿瘤  82.46   猜他是肿瘤
## 3      肿瘤 113.67   猜他是肿瘤
## 4      肿瘤  63.49   猜他是肿瘤
## ...    <NA>    ...         <NA>
## 27   非肿瘤  53.33 猜他不是肿瘤
## 28   非肿瘤  59.92 猜他不是肿瘤
## 29   非肿瘤  46.46 猜他不是肿瘤
## 30   非肿瘤  30.03 猜他不是肿瘤

这个结果变成混淆矩阵是下面这样的:

df1 %>% count(pred, outcome)
##           pred outcome  n
## 1 猜他不是肿瘤    肿瘤  1
## 2 猜他不是肿瘤  非肿瘤 15
## 3   猜他是肿瘤    肿瘤  9
## 4   猜他是肿瘤  非肿瘤  5

20.1 2d混淆矩阵可视化

如果要可视化混淆矩阵,简单的2维非常简单,比如用ggplot2即可:

ggplot(df1, aes(pred, outcome))+
  geom_tile(aes(fill=ca125))+
  geom_label(data = df1 %>% count(pred, outcome), aes(pred,outcome,label=n),size=12)+
  theme_minimal()+
  theme(legend.position = "none")

想要修改更多细节,大家自己动手即可,非常简单!

20.2 3d版混淆矩阵可视化

也是很简单,使用barplot3d这个包即可。这个包需要本地安装。

注意这个包画图的顺序:从左到右,从前到后

library(barplot3d)

# 把混淆矩阵结果放到1个向量里
inputdata <- c(15,5,1,9)

# 定义4个颜色
mycolors <- c("#00468BB2", "#ED0000B2", "#42B540B2", "#0099B4B2")

barplot3d(rows = 2,cols = 2, z = inputdata, # 一共4个数,2行,2列
          scalexy=8, # 让柱子胖一点
          topcolors=mycolors, # 柱子顶部的颜色
          sidecolors=mycolors, # 柱子的填充色
          xlabels = c("pred.No","pred.Yes"), 
          ylabels = c("No","Yes"),
          xsub = "Prediction",
          ysub = "Outcome",
          zsub = "Count"
          )

出图如下:

这个图是3d的,画出来之后会单独弹出一个窗口,你可以随意旋转,找到自己喜欢的角度保存即可!