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)
实际上,这个问题已经在 Stack Overflow 上处理过好几次了(例如,这里、这里和这里),但据我在 R 的上下文中发现的情况来看,从来没有处理过这个问题,所以我认为不将其视为重复是安全的。
正如您所说,真正的积极因素是对角线元素。您遇到的误报如下: class 的误报i是 column 中单元格的总和i,而不是 row i。
假阴性的定义类似:类的假阴性i是 row 中单元格的总和i,而不是 column 中的单元格总和i。
那么 class 的真正否定i就是不在 row或column中的所有元素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)
(您可能想让类成为变量而不是行名称)