从 R 中的矩阵计算真/假阳性和真/假负值

rsh*_*hah 2 r confusion-matrix keras

为了后续讨论,我使用R 中的keras包。

给定创建的混淆矩阵如下:

# Get confusion matrix for predictions
classes <- model %>% predict_classes(test, batch_size=128)
ct <- table(test.target, classes)
cm <- as.matrix(ct)
Run Code Online (Sandbox Code Playgroud)

给出ct以下混淆矩阵:

           classes
test.target   0   1   2
          0 805 192   0
          1  74 862   0
          2   2   0 477
Run Code Online (Sandbox Code Playgroud)

如何计算真阳性 (TP)、假阳性 (FP)、真阴性 (TN) 和假阴性 (FN) 值?

为了澄清起见,我通过获取矩阵的对角线来计算真阳性 (TP) 值:

tp <- diag(cm)

然而,我计算 FP 值的尝试给出了负数(我猜这不可能是正确的,对吗?):

# Get false positive rates (FP)
fp <- c()
for(i in seq_len(ncol(ct))) {
  fp <- append(fp, sum(cm[,i])-cm[i,i])
}
Run Code Online (Sandbox Code Playgroud)

编辑dput(cm)如下:

structure(c(805L, 74L, 2L, 192L, 862L, 0L, 0L, 0L, 477L), .Dim = c(3L, 
3L), .Dimnames = list(test.target = c("0", "1", "2"), classes = c("0", 
"1", "2")), class = "table")
Run Code Online (Sandbox Code Playgroud)

duc*_*ayr 5

实际上,这个问题已经在 Stack Overflow 上处理过好几次了(例如,这里这里这里),但据我在 R 的上下文中发现的情况来看,从来没有处理过这个问题,所以我认为不将其视为重复是安全的。

正如您所说,真正的积极因素是对角线元素。您遇到的误报如下: class 的误报i是 column 中单元格的总和i,而不是 row i

假阴性的定义类似:类的假阴性i是 row 中单元格的总和i,而不是 column 中的单元格总和i

那么 class 的真正否定i就是不在 rowcolumn中的所有元素i

我们可以计算如下:

true_positives  <- diag(cm)
  0   1   2 
805 862 477 
false_positives <- colSums(cm) - true_positives
  0   1   2 
 76 192   0 
false_negatives <- rowSums(cm) - true_positives
  0   1   2 
192  74   2 
true_negatives  <- sum(cm) - true_positives - false_positives - false_negatives
   0    1    2 
1339 1284 1933 
Run Code Online (Sandbox Code Playgroud)

您甚至可以创建一个供以后重用的函数:

multi_class_rates <- function(confusion_matrix) {
    true_positives  <- diag(confusion_matrix)
    false_positives <- colSums(confusion_matrix) - true_positives
    false_negatives <- rowSums(confusion_matrix) - true_positives
    true_negatives  <- sum(confusion_matrix) - true_positives -
        false_positives - false_negatives
    return(data.frame(true_positives, false_positives, true_negatives,
                      false_negatives, row.names = names(true_positives)))
}

multi_class_rates(cm)
  true_positives false_positives true_negatives false_negatives
0            805              76           1339             192
1            862             192           1284              74
2            477               0           1933               2
Run Code Online (Sandbox Code Playgroud)

(您可能想让类成为变量而不是行名称)

  • 不用担心@rshah,很高兴它有用!根据我的经验,几乎总是如果值得为某件事编写代码,那么就值得将其放入一个函数中以供以后重用(也许除了特殊的数据清理任务) (3认同)
  • 这非常有效!也感谢您提供可重用的功能!我希望这对其他在 R 中使用 keras 进行深度学习的人有用 (2认同)