【R语言】单个分类模型性能评估、两个分类模型性能对比、统计检验

单个模型评估

R 复制代码
# install.packages("pROC")
library(pROC)

calculate_metrics <- function(label, prediction) {
  # 加载所需的包
  library(pROC)
  
  # 计算ROC曲线和AUC
  roc_obj <- roc(label, prediction)
  auc_value <- auc(roc_obj)
  
  # 寻找最佳cutoff
  cutoff <- coords(roc_obj, "best", ret = "threshold")
  
  # 根据cutoff计算混淆矩阵
  predicted_label <- ifelse(prediction >= cutoff$threshold, 1, 0)
  confusion_matrix <- table(predicted_label, label)
  
  # 提取混淆矩阵中的TP,TN,FP和FN
  TP <- confusion_matrix[2, 2]
  TN <- confusion_matrix[1, 1]
  FP <- confusion_matrix[2, 1]
  FN <- confusion_matrix[1, 2]
  
  # 计算敏感度和特异度
  sensitivity <- TP / (TP + FN)
  specificity <- TN / (TN + FP)
  
  # 返回结果
  result <- list(
    AUC = auc_value,
    Cutoff = cutoff$threshold,
    Confusion_Matrix = confusion_matrix,
    TP = TP,
    TN = TN,
    FP = FP,
    FN = FN,
    Sensitivity = sensitivity,
    Specificity = specificity
  )
  
  return(result)
}

# 使用示例数据调用函数
set.seed(123)
label <- sample(0:1, 100, replace = TRUE)
pred <- runif(100)
metrics <- calculate_metrics(label, pred)
print(metrics)

多个模型对比分析及统计检验

R 复制代码
# install.packages("pROC")
library(pROC)
compare_models <- function(label, pred1, pred2) {
  # 加载所需的包
  library(pROC)
  
  # 计算ROC曲线
  roc1 <- roc(label, pred1)
  roc2 <- roc(label, pred2)
  
  # Delong检验
  delong_test_result <- roc.test(roc1, roc2, method = "delong")
  
  # 寻找最佳阈值
  cutoff1 <- coords(roc1, "best", ret = "threshold")
  cutoff2 <- coords(roc2, "best", ret = "threshold")
  
  # 计算敏感度和特异度
  predicted_label1 <- ifelse(pred1 >= cutoff1$threshold, 1, 0)
  predicted_label2 <- ifelse(pred2 >= cutoff2$threshold, 1, 0)
  
  sensitivity1 <- sum(predicted_label1 == 1 & label == 1) / sum(label == 1)
  sensitivity2 <- sum(predicted_label2 == 1 & label == 1) / sum(label == 1)
  
  specificity1 <- sum(predicted_label1 == 0 & label == 0) / sum(label == 0)
  specificity2 <- sum(predicted_label2 == 0 & label == 0) / sum(label == 0)
  
  # 比例检验
  sensitivity_test <- prop.test(
    x = c(sum(predicted_label1 == 1 & label == 1), sum(predicted_label2 == 1 & label == 1)),
    n = c(sum(label == 1), sum(label == 1)),
    correct = FALSE
  )
  
  specificity_test <- prop.test(
    x = c(sum(predicted_label1 == 0 & label == 0), sum(predicted_label2 == 0 & label == 0)),
    n = c(sum(label == 0), sum(label == 0)),
    correct = FALSE
  )
  
  # 返回结果
  result <- list(
    Delong_Test_Result = delong_test_result,
    Sensitivity_Test_Result = sensitivity_test,
    Specificity_Test_Result = specificity_test,
    Sensitivity1 = sensitivity1,
    Sensitivity2 = sensitivity2,
    Specificity1 = specificity1,
    Specificity2 = specificity2,
    Cutoff1 = cutoff1$threshold,
    Cutoff2 = cutoff2$threshold
  )
  
  return(result)
}

# 使用示例数据调用函数
set.seed(123)
label <- sample(0:1, 100, replace = TRUE)
pred1 <- runif(100)
pred2 <- runif(100)

comparison_result <- compare_models(label, pred1, pred2)
print(comparison_result)
相关推荐
AI小云2 天前
【机器学习与实战】回归分析与预测:线性回归-03-损失函数与梯度下降
机器学习
L.fountain2 天前
机器学习shap分析案例
人工智能·机器学习
weixin_429630262 天前
机器学习-第一章
人工智能·机器学习
Cedric11132 天前
机器学习中的距离总结
人工智能·机器学习
IT毕设梦工厂2 天前
大数据毕业设计选题推荐-基于大数据的客户购物订单数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
大数据·hadoop·数据分析·spark·毕业设计·源码·bigdata
寒月霜华3 天前
机器学习-数据标注
人工智能·机器学习
大数据CLUB3 天前
基于spark的澳洲光伏发电站选址预测
大数据·hadoop·分布式·数据分析·spark·数据开发
Godspeed Zhao3 天前
自动驾驶中的传感器技术46——Radar(7)
人工智能·机器学习·自动驾驶
limengshi1383923 天前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
智数研析社3 天前
9120 部 TMDb 高分电影数据集 | 7 列全维度指标 (评分 / 热度 / 剧情)+API 权威源 | 电影趋势分析 / 推荐系统 / NLP 建模用
大数据·人工智能·python·深度学习·数据分析·数据集·数据清洗