如何创建混淆矩阵并确定 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
假设我们根据 y
和 z
.
拟合一个模型来预测 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
至于不同截断的影响,其他答案提供了更多信息。
我有某个混淆矩阵的值,我想分析并确定截断的影响。假设我有这些向量:
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
假设我们根据 y
和 z
.
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
至于不同截断的影响,其他答案提供了更多信息。