基于阈值1.5创建分类列并计算准确率及混淆矩阵(R语言)
R语言分类任务实现:结果标记、准确率计算与混淆矩阵
测试数据
首先加载你提供的测试数据:
data <- structure(list(Spike_Numeric = c(2, 2, 2, 2, 2, 2), pred = c(1.98074853133856, 2.02043203671689, 1.77571051892715, 1.71595663747364, 1.5370482202268, 2.05764433439194)), row.names = c("1", "2", "3", "4", "5", "6"), class = "data.frame")
步骤1:创建result列
根据pred列的值生成result列:pred < 1.5标记为1,否则标记为2。用基础R的ifelse()就能快速实现:
data$result <- ifelse(data$pred < 1.5, 1, 2)
生成后的数据集如下:
Spike_Numeric pred result 1 2 1.980749 2 2 2 2.020432 2 3 2 1.775711 2 4 2 1.715957 2 5 2 1.537048 2 6 2 2.057644 2
步骤2:计算分类准确率
通过对比result和Spike_Numeric列的匹配比例,得到准确率:
accuracy <- mean(data$result == data$Spike_Numeric) * 100 cat(paste0(accuracy, "%\n"))
输出结果:
100%
步骤3:混淆矩阵与特异性、敏感性计算
当存在分类错误时,用table()生成混淆矩阵,再手动计算敏感性(针对类别1)和特异性(针对类别2)。同时兼容只有单一类别的情况:
# 生成混淆矩阵 conf_mat <- table(Actual = data$Spike_Numeric, Predicted = data$result) # 计算指标 if (all(dim(conf_mat) == c(2,2))) { # 两类都存在的情况 sensitivity <- conf_mat[1,1] / sum(conf_mat[1,]) # TP/(TP+FN) specificity <- conf_mat[2,2] / sum(conf_mat[2,]) # TN/(TN+FP) } else { # 仅单一类别的情况 if (all(data$Spike_Numeric == 2)) { sensitivity <- NA # 无类别1样本,无法计算敏感性 specificity <- 1 # 所有类别2预测正确,特异性100% } else if (all(data$Spike_Numeric == 1)) { sensitivity <- 1 # 所有类别1预测正确,敏感性100% specificity <- NA # 无类别2样本,无法计算特异性 } } # 输出结果 print("混淆矩阵:") print(conf_mat) cat("\n敏感性:", ifelse(is.na(sensitivity), "无法计算(无类别1样本)", paste0(sensitivity*100, "%")), "\n") cat("特异性:", ifelse(is.na(specificity), "无法计算(无类别2样本)", paste0(specificity*100, "%")), "\n")
针对示例数据的输出:
[1] "混淆矩阵:" Predicted Actual 2 2 6 敏感性: 无法计算(无类别1样本) 特异性: 100%
内容的提问来源于stack exchange,提问作者confusedindividual
相关产品推荐
相关产品推荐

