首页 > 解决方案 > 如何创建混淆矩阵并确定 R 中 50% 截止的效果?

问题描述

我有某个混淆矩阵的值,我想分析并确定截止将产生的影响。可以说我有这些向量:

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

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

标签: rconfusion-matrix

解决方案


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

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

假设我们拟合了一个模型来response基于 y和进行预测z

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%
     
       

推荐阅读