r - 如何创建混淆矩阵并确定 R 中 50% 截止的效果?
问题描述
我有某个混淆矩阵的值,我想分析并确定截止将产生的影响。可以说我有这些向量:
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
假设我们拟合了一个模型来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%
推荐阅读
- sql-server - 将业务日期拆分为日月和年拆分为单独的列
- javascript - 将数据推送到 javascript 对象中不起作用
- java - 如何捕获 com.microsoft.sqlserver.jdbc.SQLServerException:查询已超时
- javascript - NestJs TypeORM 配置使用 env 文件
- json - Google 图表 - 来自本地 json 文件的数据 - 自定义工具提示
- go - 将方法转换为 func var
- mysql - 如何正确编写此 SQL 语句
- php - 将 signal r 客户端连接到 PHP 服务器以进行实时通信
- reactjs - 每次重访屏幕时都显示插页式广告?
- python - 在 django 模型中实现这些关系的正确做法