机器学习|第8期. 机器学习预测模型入门与R实战(二)

文摘   教育   2024-10-30 23:45   北京  
BE声明学写文章②



往期回顾

  REVIEWS  


1)机器学习|第1期. 一图get机器学习基本流程

2)机器学习|第2期. 你该知道的数据预处理实战①

3)机器学习|第3期. 你该知道的数据预处理实战②

4)机器学习|第4期. 特征工程干货及R实战(一)
5)机器学习|第5期. 特征工程干货及R实战(二)

6)机器学习|第6期. 特征工程干货及R实战(三)

7)诊断试验专栏|第7期. 诊断试验的报告规范


上一期我们带大家学习了机器学习预测模型入门与R实战(一),分享了机器学习建模与可视化的重要内容,现继续分享机器学习预测模型入门与R实战(二)。


MASCU

机器学习




01

机器学习预测模型R实战(二)


基于机器学习常见步骤,如何利用自己的数据进行实操,复现可行的结果,我们为大家提供以下代码,本次数据为虚拟生成数据(公众号发送“241009”,获得数据),结局指标为大于胎龄儿,收集了孕妇孕期生活方式、血液检测指标,现利用机器学习算法建立基于孕期因素的大于胎龄儿预测模型,图为变量手册



在上期R代码的基础上继续演示:

####加载必要的包
library(dplyr) #未安装的话,记得install.packages("R包名")
library(caret)
library(pROC)
library(rms)
library(ROCR)
library(stats)
library(xgboost)
library(Boruta)
if(!require("compareGroups"))install.packages("compareGroups");library("compareGroups")
if (!require("openxlsx")) {
  install.packages("openxlsx")}
library(openxlsx)
####读取数据
data <- read.xlsx("machine learning.xlsx")  ###如果使用自身数据,需注意变量名更换
####其他代码见上期
####模型构建与评估(大于胎龄儿为分类任务,使用上述7种机器学习分类算法)
models <- c("glm""rf""xgbTree","rpart""svmLinear""knn""nb")
results <- lapply(models, function(modelName) {
  # 设置控制参数
    control <- trainControl(method = "cv", number = 5)
  # 构建模型
   model <- train(LGA~ .,
                data = train,
                method = modelName,
                trControl = control,
                preProcess = c("center""scale"))
    # 使用测试集评估模型
    pred <- predict(model, newdata = test)
    confusionMatrix(pred, test$LGA)
})

# 输出每个模型的结果
names(results) <- models
lapply(names(results), function(name) {
    print(paste(name, "Confusion Matrix and Statistics:"))
    print(results[[name]])
})
results
####输出的结果如下图所示



#(注意:上述结果图展示了每个算法获得的准确率accuracy及其95%CI,Kappa值,灵敏度Sensitivity,特异度Specificity,Pos Pred Value阳性预测值,Neg Pred Value阴性预测值等。)
####ROC曲线下面积
test$LGA <- as.numeric(factor(test$LGA)) - 1  # 转换为0和1
models <- c("glm""rf""xgbTree","rpart""svmLinear""knn""nb")
# 存储模型
trained_models <- list()
# 训练模型并存储
for (modelName in models) {
   # 设置控制参数
  control <- trainControl(method = "cv", number = 5)
   # 构建模型
   model <- train(LGA ~ .,
            data = train,
             method = modelName,
             trControl = control,
            preProcess = c("center""scale"))
   trained_models[[modelName]] <- model
}
# 定义用于绘制的函数
draw_roc_curves <- function(dataSet, title) {
   plot_colors <- c("black""red""blue""green""orange","yellow""purple")
   pdf(paste0(title, ".pdf"))  # 保存为PDF文件
   # 初始化第一个模型的ROC曲线
   first_model <- trained_models[[models[1]]]
   pred_probs <- tryCatch({
   predict(first_model, newdata = testtype = "prob")[,2]
    }, warning = function(w) NULL)
   if (!is.null(pred_probs)) {
    roc_obj <- tryCatch({
     roc(test$LGA, pred_probs)
     }, error = function(e) NULL)
    if (!is.null(roc_obj)) {
    # 绘制第一个模型的ROC曲线
     plot(roc_obj, col = plot_colors[1], main = title, 
       print.auc = TRUE, print.auc.x = 0.8, print.auc.y = 0.2,
        print.auc.cex = 0.8, print.auc.col = plot_colors[1])
    }
   } 
   for (i in 2:length(models)) {
    modelName <- models[i]
    model <- trained_models[[modelName]]
    # 使用模型进行预测
      pred_probs <- tryCatch({
       predict(model, newdata = testtype = "prob")[,2]
       }, warning = function(w) NULL)
      if (!is.null(pred_probs)) {
      # 计算ROC曲线
       roc_obj <- tryCatch({
        roc(test$LGA, pred_probs)
        }, error = function(e) NULL)
      if (!is.null(roc_obj)) {
   # 绘制ROC曲线
        # 使用lines添加剩余模型的ROC曲线
      lines(roc_obj, col = plot_colors[i], print.auc = FALSE)
   }
  }
 }
# 添加图例
   legend("bottomright", legend = models, col = plot_colors, lty = 1)

dev.off()  # 关闭PDF设备
}
# 在训练集上绘制ROC曲线
draw_roc_curves(train, "Train2Set ROC Curves")
# 在测试集上绘制ROC曲线
draw_roc_curves(test"Test2Set ROC Curves")
####输出结果如下图




观科研公众号后台回复“241009”,即可获取原始数据进行练习哦~


以上代码为关键部分,实际应用需根据自身数据和代码运行结果做适当调整。机器学习预测模型重点在特征选择,选择合适的特征进行机器学习建模与模型评估。下一期我们将继续分享机器学习常见建模,希望大家快乐科研,每日进步一点点。



今天的分享到这里就结束啦,你学会了吗?
大家对于推送内容有任何问题或建议可以在公众号菜单栏“更多--读者的话” 栏目中提出,我们会尽快回复!


期待已久~临床科研交流群来啦!


(欢迎大家入群交流~
若群满,请添加下方微信,备注:“进临床科研与统计_互助交流群” )





写在最后


“观科研”(点击进一步了解我们吧)是由一群北京协和医学院(清华大学医学部)的博士开创的公众号,初心是让医学科研有迹可循,帮助一线的医学科研人员更快地成长,希望大家支持与关注!

如果大家对分享医学科研知识感兴趣,特别欢迎加入我们,期待与您的相遇相识相知,也非常欢迎大家自主投稿,如果您有需要分享的内容或对我们有任何建议,可通过后台留言、
公众号菜单栏
“更多—读者的话”栏目进一步了解)或发送邮件至mascu_forever@163.com与我们交流并留下个人联系方式,我们会及时与您联系。

如果您觉得我们长期的干货推送对您的科研工作有所帮助,可以在合适的机会致谢(包括但不限于SCI论文、毕业论文等),格式如下:
 The authors thank the support of Skill Learning from Kaixin Doctor and MASCU (Medical Association with Science, Creativity, and Unity), Inc, Shenzhen, China (mascu_forever@163.com).

【大家的支持,是我们持续更新的动力!】


Pay attention!
微信公众号的推送规则发生改变(不再按照时间顺序来显示),如果没有将“观科研”设置为星标,你就可能错失里面的精彩推送。


点击“在看”,可参与讨论哦!

图文:心观

审核:美观

编辑:云观

编审:直观


观科研
让医学科研有迹可循
 最新文章