【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)
相关推荐
我要学习别拦我~1 小时前
读《精益数据分析》:黏性(Stickiness)—— 验证解决方案是否留住用户
经验分享·数据分析
davawang2 小时前
程序自动化vs人工手动处理
数据库·数据分析·企业文化
思通数据8 小时前
AI视频监控:重构安防行业智能化新生态
人工智能·安全·目标检测·机器学习·计算机视觉·重构·数据挖掘
XIAO·宝9 小时前
机器学习----绪论
人工智能·机器学习
41号学员9 小时前
机器学习绪论
人工智能·机器学习
蜀中廖化10 小时前
机器学习:基于OpenCV和Python的智能图像处理 实战
python·opencv·机器学习
一车小面包11 小时前
机器学习中数据集的划分难点及实现
人工智能·深度学习·机器学习
计算机源码社12 小时前
分享一个基于Hadoop+spark的超市销售数据分析与可视化系统,超市顾客消费行为分析系统的设计与实现
大数据·hadoop·数据分析·spark·计算机毕业设计源码·计算机毕设选题·大数据选题推荐
ABCDnnie12 小时前
机器学习03-sklearn模型评估指标与knn算法
人工智能·机器学习·sklearn
码界筑梦坊13 小时前
135-基于Spark的抖音数据分析热度预测系统
大数据·python·数据分析·spark·毕业设计·echarts