从 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 设为变量而不是行名称)
为了后续讨论,我在 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
正如您所说,真正的积极因素是对角线元素。您遇到的误报如下: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 设为变量而不是行名称)