从 R 中的矩阵计算 True/False 正值和 True/False 负值

Calculating True/False Positive and True/False Negative Values from Matrix in R

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

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

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

为此 ct 给出以下混淆矩阵:

           classes
test.target   0   1   2
          0 805 192   0
          1  74 862   0
          2   2   0 477

如何计算真阳性 (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])
}

编辑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")

这个问题实际上已经在 Stack Overflow 上处理过好几次(例如 here and and ),但从来没有像我在 R 的上下文中发现的那样,所以我认为不要算作重复是安全的。

正如您所说,真正的积极因素是对角线元素。您遇到的误报如下:class i 的误报是 i 列中单元格的总和,而不是行 i.[=21= 中的单元格总和]

假阴性的定义类似:class i 的假阴性是行 i 而非列 i 中单元格的总和。

那么 class i 的真正否定是所有不在行 i.[=21 中的元素=]

我们可以这样计算:

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 

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

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

(您可能希望将 class 设为变量而不是行名称)