【问题标题】:ggplot2 confusion matrix conditional fillggplot2混淆矩阵条件填充
【发布时间】:2018-12-17 10:00:51
【问题描述】:

我希望混淆矩阵有两个不同的尺度。对于真正的正面/负面,我希望绿色代表高,红色代表低。对于错误的结果,我希望颜色反转。这可能需要两个传说?这可能解释起来很麻烦,但我觉得倒过来的颜色更直观。您的真实结果应该很高(绿色代表良好),而您的负面结果应该很低(在这种情况下绿色代表良好)。

如果除了我的建议之外还有其他建议或最佳实践,我愿意接受其他选择。

library(caret)
library(tidyverse)
data("GermanCredit")
cm <- confusionMatrix(GermanCredit$Class, sample(GermanCredit$Class))

cm$table %>%
  data.frame() %>% 
  mutate(Prediction = factor(Prediction, levels = c("Good", "Bad"))) %>%
  group_by(Reference) %>% 
  mutate(total = sum(Freq)) %>% 
  ungroup() %>% 
  ggplot(aes(Reference, Prediction, fill = Freq)) +
  geom_tile() +
  geom_text(aes(label = Freq), size = 8) +
  scale_fill_gradient(low = "#ea4434", high = "#badb33") +
  scale_x_discrete(position = "top") +
  geom_tile(color = "black", fill = "black", alpha = 0)

我根据一些 cmets 添加了我的问题:我希望不相关的对角线为白色,红色(低)和绿色(高)比例仅适用于真正的正/负结果。例如,下面的图部分实现了这一点,除了我将低点设置为白色......我希望低点为红色,而白色方块保持白色。

library(reprex)
library(caret)
#> Loading required package: lattice
#> Loading required package: ggplot2
library(tidyverse)
data("GermanCredit")
cm <- confusionMatrix(GermanCredit$Class, sample(GermanCredit$Class))

cm$table %>%
  data.frame() %>% 
  mutate(Prediction = factor(Prediction, levels = c("Good", "Bad"))) %>%
  group_by(Reference) %>% 
  mutate(
    total = sum(Freq),
    frac_fill = if_else(Prediction == Reference, Freq / total, 0),
    frac = Freq / total * frac_fill
  ) %>%
  ggplot(aes(Prediction, Reference, fill = frac_fill)) +
  geom_tile() +
  geom_text(aes(label = str_c(Freq, ", ", round(frac * 100), "%")), size = 8) +
  scale_fill_gradient(low = "white", high = "#badb33") +
  scale_x_discrete(position = "top") +
  geom_tile(color = "black", fill = "black", alpha = 0)

【问题讨论】:

  • 您可能会使用负值来反转结果的好坏方向。请发布使此问题可重现的数据示例
  • @camille OP 正在使用内置数据。
  • @Gregor 知道了,不熟悉插入符号的数据集。澄清一下,当参考 == 预测时我们想要绿色?
  • 不是答案,但通常我会看到只有一个比例的混淆矩阵,就像你有的那样。一般来说,唯一正确的预测是在主对角线上,所以在像this example 这样的任何常用矩阵上,您都不太会寻找特定的颜色,而只是寻找对角线以外的任何质量。
  • 因此,我只会选择一个将白色设置为low 的比例,我认为这可以清楚地传达存在混淆的地方。这里我只是将low 更改为ffffffI think it is clearer(并且不需要两个图例)

标签: r ggplot2 r-caret confusion-matrix


【解决方案1】:

好的,这是一个尝试,它基本上对非对角线图块使用反向填充值。我将轴倒置为我认为通常描绘混淆矩阵的方式。我想这表明该模型在预测Good 方面比Bad 更好,但我认为它在混淆时掩盖了实际混淆的内容。像这样呈现时,传说也不是最有用的,我什至可能会忽略它。

library(caret)
#> Loading required package: lattice
#> Loading required package: ggplot2
library(tidyverse)
data("GermanCredit")
cm <- confusionMatrix(GermanCredit$Class, sample(GermanCredit$Class))

cm$table %>%
  data.frame() %>% 
  mutate(Prediction = factor(Prediction, levels = c("Good", "Bad"))) %>%
  group_by(Reference) %>% 
  mutate(
    total = sum(Freq),
    frac = Freq / total,
    frac_fill = if_else(Prediction == Reference, Freq / total, 1 - (Freq / total))
    ) %>%
  ggplot(aes(Prediction, Reference, fill = frac_fill)) +
  geom_tile() +
  geom_text(aes(label = str_c(Freq, ", ", round(frac * 100), "%")), size = 8) +
  scale_fill_gradient(low = "#ea4434", high = "#badb33") +
  scale_x_discrete(position = "top") +
  geom_tile(color = "black", fill = "black", alpha = 0)

reprex package (v0.2.0) 于 2018 年 7 月 9 日创建。

【讨论】:

  • 谢谢!我看到这看起来很混乱。我修改了我的问题。往上看。也许它可以让我们更接近您在 cmets 中发布的对角线解决方案,其中不相关的正方形为白色,而真正的正/负则为色标。
【解决方案2】:

如果我的理解正确,您需要一个发散的比例,这需要将比例设为负数和正数。我创建了一个变量frac_directed,如果预测为“坏”,它就是frac_fill 的负数,尽管这可能与您正在寻找的相反。然后用scale_fill_gradient2代替scale_fill_gradient,可以设置一个中点(默认0,这里合适)和一个中间填充值。

library(caret)
library(tidyverse)
data("GermanCredit")
cm <- confusionMatrix(GermanCredit$Class, sample(GermanCredit$Class))

cm$table %>%
  data.frame() %>% 
  mutate(Prediction = factor(Prediction, levels = c("Good", "Bad"))) %>%
  group_by(Reference) %>% 
  mutate(
    total = sum(Freq),
    frac_fill = if_else(Prediction == Reference, Freq / total, 0),
    frac = Freq / total * frac_fill
  ) %>%
  mutate(frac_directed = if_else(Prediction == "Bad", frac_fill * -1, frac_fill)) %>%
  ggplot(aes(Prediction, Reference, fill = frac_directed)) +
  geom_tile(color = "black") +
  geom_text(aes(label = str_c(Freq, ", ", round(frac * 100), "%")), size = 8) +
  scale_fill_gradient2(low = "red", mid = "white", high = "#badb33") +
  scale_x_discrete(position = "top")

reprex package (v0.2.0) 于 2018 年 7 月 9 日创建。

【讨论】:

  • 谢谢。这看起来不错。我要做的唯一改变是百分比不反映白色方块的零。它看起来违反直觉。
  • 你想怎么做?计算全部来自问题中的代码
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 2015-12-17
  • 2020-10-01
  • 2012-01-20
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
相关资源
最近更新 更多