如何创建混淆矩阵并确定 R 中 50% 截止值的影响?

How can I create a confusion matrix and determine the effect of a 50% cuttoff in R?

我有某个混淆矩阵的值,我想分析并确定截断的影响。假设我有这些向量:

v1 <- c(200, 25)
v2 <- c(10, 400)

这些是混淆矩阵的值(转置后,第 1 行为 (10, 200),第 2 行为 (400, 25)。我想知道 50% 的截断值将如何影响假阴性.

你不能只用一个混淆矩阵来做到这一点。截止值用于创建混淆矩阵。您需要拥有构成混淆矩阵的数据,以评估不同截止值的影响。这是一个例子。假设我们有如下一些数据:

data <- structure(list(response = c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                                    1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1), 
                       y = c(4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 
                             4, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 4), 
                       z = c(4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 
                             4, 1, 2, 1, 1, 2, 2, 4, 2, 1, 2, 2, 4, 6, 8, 2)), 
                  class = "data.frame", row.names = c(NA, -32L))

head(data)
  response y z
1        1 4 4
2        1 4 4
3        1 4 1
4        0 3 1
5        0 3 2
6        0 3 1

假设我们根据 yz.

拟合一个模型来预测 response
mod <- glm(response ~ y + z, data = data, family = "binomial")

现在我们可以预测 response 的值并将它们添加到数据中。

data$fit <- predict(mod, type = "response")
head(data)
  response y z          fit
1        1 4 4 4.217892e-01
2        1 4 4 4.217892e-01
3        1 4 1 8.435784e-01
4        0 3 1 2.345578e-09
5        0 3 2 1.204047e-09
6        0 3 1 2.345578e-09

我们的fit值没有用,因为它们是连续的,而response是二进制的。因此,我们选择一个截止值,比如 0.5(或 50%)。当我们这样做时,我们会丢失信息。我们知道 predicted 是高于还是低于截止值,但我们丢失了原始值。

data$predicted <- (data$fit >= 0.5) ^ 1 # TRUE ^ 1 = 1, FALSE ^ 1 = 0

  response y z          fit predicted
1        1 4 4 4.217892e-01         0
2        1 4 4 4.217892e-01         0
3        1 4 1 8.435784e-01         1
4        0 3 1 2.345578e-09         0
5        0 3 2 1.204047e-09         0
6        0 3 1 2.345578e-09         0

caret包有生成混淆矩阵的功能。

library(caret)
confusionMatrix(factor(data$predicted), factor(data$response), positive = "1")$table

          Reference
Prediction  0  1
         0 17  2
         1  2 11
# 2 false negatives, false negative rate = 15.3%                                          
        

我们无法从这个混淆矩阵中重新创建原始数据。如果您想选择不同的截止值,您将返回到原始数据。然后你会得到一个新的混淆矩阵。

# cutoff = 0.25
data$predicted2 <- (data$fit >= 0.25) ^ 1 # TRUE ^ 1 = 1, FALSE ^ 1 = 0
confusionMatrix(factor(data$predicted2), factor(data$response), positive = "1")$table

          Reference
Prediction  0  1
         0 15  0
         1  4 13
# 0 false negatives, false negative rate = 0%
     
       

您似乎已经有了混淆矩阵。如果你想要额外的统计信息,你可以使用 caret 包。只需创建一个矩阵并使其成为 class table.

m = cbind(v2, v1)
dimnames(m) = list(G1 = c("A", "B"), G2 = c("A", "B"))
attr(m, "class") = "table"
CM = caret::confusionMatrix(m)
CM

至于不同截断的影响,其他答案提供了更多信息。