各位亲大家好,前一期我们分享了使用R语言的mlr3verse包对八种机器学习模型进行统一接口批处理以及ROC曲线综合评价方法,今天我们继续进行DCA曲线综合评价方法
【批处理机器学习】
R语言如何将Logistic、决策树、随机森林、SVM、神经网络、XGBoost、lightGBM、朴素贝叶斯、KNN等多种机器学习模型预测效果的DCA曲线、CIC曲线、ROC曲线、校准曲线、混淆矩阵图示,绘制到一张图上综合评价?
我们需要使用R语言机器学习mlr3包、mlr3verse包对八种模型进行统一接口的批处理。
mlr3verse 是 R 语言中一组用于机器学习的包,旨在提供一个灵活、模块化和可扩展的框架,用于构建和评估机器学习模型。它由多个紧密集成的包组成,共同提供了一个全面的机器学习工作流程,从数据预处理到模型训练、调优和评估。
我们今天仍以一个新的“Sonar”数据集为例,演示一下使用R语言的mlr3包与mlr3verse包,对Logistic、决策树、随机森林、SVM、神经网络、XGBoost、lightGBM、朴素贝叶斯、KNN等8种机器学习模型进行批处理并DCA曲线综合评价。
Sonar数据集来源于UCl数据库,UCI是加州大学欧文分校(University of Califomnialnvine)提出的用于机器学习的数据库。
声纳数据集(Sonar Dataset )涉及预测根据给定声纳从不同角度返回的强度预测目标物体是岩石还是矿井。数据集一共有208个观察值,60个特征,2个类别(M为矿井,R为岩石),每个类的观察值数量不均等。在该数据集上所做的预测最普遍类的基准性能是约 53%的分类准确率,最佳结果达到约 88% 的分类准确率。
与我们前期使用的二分类因变量的“示例数据集”结构类似。
我们还是先进行环境整理,安装加载批处理并DCA曲线综合评价所需要的包,然后进行数据准备:
#一、环境配置与数据准备
#安装必要包(首次运行需解除注释)
#install.packages(c("mlr3verse", "dcurves", "ggplot2", "patchwork", "ggsci"))
#加载核心包
library(mlr3verse) # 机器学习框架
library(dcurves) # DCA曲线计算
library(ggplot2) # 可视化
library(patchwork) # 多图排版
library(ggsci) # 科学配色
library(rmda)
#使用Sonar数据集示例(二分类问题)
data("Sonar", package = "mlbench")
set.seed(2025)
task <- as_task_classif(Sonar, target = "Class", positive = "M")
split <- partition(task, ratio = 0.7)
然后定义学习器、进行模型批量训练和预测:
#二、多模型训练与预测
#定义8个学习器(确保概率预测)
learners <- list( "Logistic" = lrn("classif.log_reg", predict_type = "prob"),
"决策树" = lrn("classif.rpart", predict_type = "prob"),
"随机森林" = lrn("classif.ranger", predict_type = "prob"),
"SVM" = lrn("classif.svm", type = "C-classification", predict_type = "prob"),
"神经网络" = lrn("classif.nnet", predict_type = "prob"),
"XGBoost" = lrn("classif.xgboost", predict_type = "prob"),
"朴素贝叶斯" = lrn("classif.naive_bayes", predict_type = "prob"),
"KNN" = lrn("classif.kknn", predict_type = "prob")
)
#批量训练与预测
predictions <- lapply(learners, function(l) { l
train) pred <- l
test) list(response = pred
prob[, "M"])
})
predictions
进行DCA曲线绘制核心数据的运算和获取:获取原始数据中分类结果真实值,然后获取各个模型预测值,组成DCAdata,完成初步绘图。
#三、DCA曲线绘制核心函数
#生成DCA数据框架
truth <- as.numeric(task
test) == "M")
# 转换为0/1
dca_data <- data.frame(truth = truth)
for (model in names(learners)) { dca_data[[model]] <- predictions[[model]]$prob }
truth
dca_data
#计算DCA曲线数据
dca_result <- dca(truth~., data = as.data.frame(dca_data), thresholds = seq(0.01, 0.99, 0.01) )
dca_result
对Logistic、决策树、随机森林、SVM、神经网络、XGBoost、lightGBM、朴素贝叶斯、KNN等多种机器学习模型预测效果的DCA曲线,进行分面绘图:
#四、可视化实现
#1. 单模型DCA曲线(分面布局)
single_dca_plot <- ggplot(dca_result[["dca"]],
aes(x = threshold, y = net_benefit)) +
geom_line(aes(color = label),linewidth = 1) +
scale_linetype_manual(values = c("dashed", "dotted")) +
scale_color_npg() + # 使用Nature配色
facet_wrap(~label, ncol = 4) +
labs(x = "Threshold Probability", y = "Net Benefit",
title = "单模型DCA曲线对比") +
theme_bw(base_size = 12) +
theme(legend.position = "bottom")
single_dca_plot
我们也可以根据需要,选择纳入分面绘图的变量,可以选择不将Treat All和Treat None纳入分面绘图:
#调整需要显示的模型
library(dplyr)
library(tidyr)
dcaresult <- dca_result[["dca"]]%>%
filter(!label %in% c("Treat All", "Treat None")) %>%
droplevels() # 若category是因子类型则用此清理
single_dca_plot <-
ggplot(dcaresult,
aes(x = threshold, y = net_benefit))+
geom_line(aes(color = label),linewidth = 1)+
facet_wrap(~label, ncol = 4)+
scale_linetype_manual(values = c("dashed", "dotted"))+
scale_color_npg() # 使用Nature配色
single_dca_plot
出图看着和初步绘图印象是不一样的,仔细看去,是绘图坐标轴不一样,我们可以通过scale_y_continuous(limits = c(-1, 1))调整坐标轴显示范围:
#调整纵轴数据范围
single_dca_plot <-
ggplot(dcaresult,
aes(x = threshold, y = net_benefit))+
geom_line(aes(color = label),linewidth = 1)+
facet_wrap(~label, ncol = 4)+
scale_linetype_manual(values = c("dashed", "dotted"))+
scale_color_npg()+ # 使用Nature配色
scale_y_continuous(limits = c(-1, 1))
single_dca_plot
同样我们也可以将多模型DCA曲线叠加绘制到一起,而不是分面,这和初步绘图结果类似。
#2. 多模型叠加DCA曲线
overlay_dca_plot <-
ggplot(dca_result[["dca"]], aes(x = threshold, y = net_benefit)) +
geom_line(aes(color = label), linewidth = 1, alpha = 0.8) +
scale_linetype_manual(values = c("dashed", "dotted")) +
scale_color_npg() +
labs(x = "Threshold Probability", y = "Net Benefit",
title = "多模型DCA曲线叠加对比") +
theme_bw(base_size = 14) +
theme(legend.position = "right")
overlay_dca_plot
同样,我们也可以通过scale_y_continuous(limits = c(-1, 1))对叠加出图进行纵坐标显示范围调整,:
#调整纵轴数据范围
overlay_dca_plot <-
ggplot(dca_result[["dca"]], aes(x = threshold, y = net_benefit)) +
geom_line(aes(color = label), linewidth = 1, alpha = 0.8) +
scale_linetype_manual(values = c("dashed", "dotted")) +
scale_color_npg() +
labs(x = "Threshold Probability", y = "Net Benefit",
title = "多模型DCA曲线叠加对比") +
theme_bw(base_size = 14) +
theme(legend.position = "right")+
scale_y_continuous(limits = c(-1, 1))
overlay_dca_plot
我们可以将分面绘图和叠加绘图进行组合,并保存到指定位置。前边单独绘图也可以使用ggsave保存一下备用。
#
#五、图形组合输出
#组合分面图与叠加图
combined_plot <- (single_dca_plot / overlay_dca_plot) +
plot_layout(heights = c(2, 1)) +
plot_annotation(tag_levels = 'A')
combined_plot
#输出高清图
ggsave("C:/Users/L/Desktop/dca_combined.png", combined_plot,
width = 16, height = 12, dpi = 300, bg = "white")
这两期我们分享了R语言如何将Logistic、决策树、随机森林、SVM、神经网络、XGBoost、lightGBM、朴素贝叶斯、KNN等多种机器学习模型预测效果的ROC曲线、DCA曲线综合评价及图示。
后续我们将继续分享CIC曲线、校准曲线、混淆矩阵多模型批量评价的方法,敬请期待!!!
医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,机器学习,生存分析,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!

