机器学习技术:如何使用交叉验证和ROC曲线提高疾病预测的准确性和效率?

news2024/12/29 9:35:18

一、引言

随着机器学习的普及,评估模型的性能越来越重要。交叉验证和ROC曲线是两种常见的评估模型性能的方法。本文将介绍这两种方法的基本原理和应用场景,并结合实际案例和技术实践,讲解如何使用交叉验证和ROC曲线来提高机器学习模型的性能。此外,文章也将提供一些最佳实践建议,以帮助读者在实际工作中应用这些方法。

交叉验证是一种常用于评估机器学习模型性能的方法。它将数据集分成k个子集,每次取其中的k-1个子集作为训练集,剩下的一个作为测试集,重复k次后得到k个模型和性能指标,并对这些结果进行平均。这种方法能够充分利用数据集,并且评估结果更加稳定可靠。

ROC曲线则是一种可视化评估分类算法表现的图形呈现方法,用于绘制二分类模型的真阳性率和假阳性率之间的关系曲线。这种方法常用于比较不同分类器和优化分类器的性能。

接下来的部分将详细介绍如何使用这两种方法,并提供实际案例和技术实践以及最佳实践建议。

二、交叉验证

交叉验证是一种常用于评估机器学习模型性能的方法,其基本原理如下:

  • 将数据集分成k个子集。
  • 使用其中k-1个子集作为训练集,剩下的一个子集作为验证集。
  • 用训练集训练模型,并使用验证集验证模型性能。
  • 重复上述步骤k次,每次使用不同的子集作为验证集。
  • 计算k次结果的平均值作为最终结果。

如何使用交叉验证评估模型的性能:

  • 训练模型
  • 使用交叉验证方法评估模型性能
  • 分析模型性能结果

交叉验证的常用算法包括:随机划分、分层采样、分组采样等,不同算法在不同数据集和问题上表现不同,需要选择合适的算法。

常见的交叉验证评估指标包括:准确率、F1值、召回率和精度等。在选择交叉验证比较算法时,需要根据不同的评估指标和问题类型选择最合适的算法。通过交叉验证,我们能够更加准确地评估机器学习模型的性能,从而选择最优的模型或算法。从k折到自助法:常用交叉验证方法的优缺点

三、ROC曲线

ROC曲线是一种可视化评估分类算法表现的图形呈现方法,用于绘制不同阈值下真阳性率和假阳性率之间的关系曲线。

3.1 ROC曲线的原理和定义

  • 真阳性率(True Positive Rate, TPR):真实类别为正例的样本中,被分类器成功分类为正例的比例。
  • 假阳性率(False Positive Rate, FPR):真实类别为负例的样本中,被错误分类为正例的比例。
  • ROC曲线:在真阳性率与假阳性率之间进行折中,故可以通过绘制真阳性率/假阳性率相对于不同阈值的关系曲线来评估分类器的性能。

3.2 如何使用ROC曲线评估模型的性能

绘制ROC曲线,根据曲线下的面积(AUC),来评估分类器的性能。

常见问题:

  • 分类不平衡导致的ROC曲线“偏移”:当负例远多于正例时,模型偏向于将样本全部预测为负例,此时TPR和FPR的比值较小,ROC曲线出现偏移或在图像左下角,此时AUC不能准确的评估模型性能,需要结合其他指标如准确率、召回率等进行综合分析。
  • 分类器性能对阈值的依赖:通常,分类器的性能与判定的阈值有直接关系,因此相同的分类器在不同阈值下,性能可能存在差异。在绘制ROC曲线的时候,需要绘制不同阈值下的曲线,以评估在不同阈值下模型的性能。

四、如何结合交叉验证和ROC曲线评估模型性能?

如何比较不同机器学习模型的性能?

  • 对于多个分类器,可以使用交叉验证和ROC曲线分别评估每个分类器的性能。
  • 比较不同分类器在不同阈值下的ROC曲线,选择AUC值最大的分类器。
  • 比较不同分类器在交叉验证后得到的平均性能指标,选择表现最好的分类器。

如何对机器学习模型进行参数调优和最优选择?

  • 使用网格搜索法或随机搜索法,寻找最优参数组合。
  • 比较不同参数组合下的分类器性能,选择表现最好的分类器。
  • 对比不同分类器的性能后,使用最优参数组合重新训练模型,得到分类器的最终版本。

接下来的部分将结合案例和实践,介绍如何使用交叉验证和ROC曲线综合评估分类器的性能,以及如何对机器学习模型进行参数调优和最优选择。

五、实际案例和技术实践

我们以鸢尾花数据集为例,介绍如何使用交叉验证和ROC曲线评估分类器的性能,并对分类器进行参数调优和最优选择。

5.1 gbsg数据集介绍

gbsg 是 survival 包中的一个数据集,它包含了与乳腺癌患者相关的一些特征和生存信息。该数据集由德国乳腺癌研究组(German Breast Cancer Study Group)收集。

install.packages("randomizr")
library(survival)
library(randomizr)
library(glmnet)
library(pROC)

head(gbsg)

结果展示:

> head(gbsg)
   pid age meno size grade nodes pgr er hormon rfstime status
1  132  49    0   18     2     2   0  0      0    1838      0
2 1575  55    1   20     3    16   0  0      0     403      1
3 1140  56    1   40     3     3   0  0      0    1603      0
4  769  45    0   25     3     1   0  4      0     177      0
5  130  65    1   30     2     5   0 36      1    1855      0
6 1642  48    0   52     2    11   0  0      0     842      1

5.2 实践步骤

  • 步骤1:加载数据集并拆分为训练集和测试集。
  • 步骤2:使用逻辑回归模型
  • 步骤3:使用决策树模型
  • 步骤4:在测试集上进行预测
  • 步骤5:计算auc
  • 步骤6:绘制ROC曲线
  • 步骤7:交叉验证

5.3 代码实现

  • 步骤1:加载数据集并拆分为训练集和测试集
set.seed(1234)
# 删除pid列
data <- subset(gbsg, select = -c(pid))
trainIndex <- sample(1:nrow(gbsg), 0.8 * nrow(gbsg))
train <- gbsg[trainIndex,]
test <- gbsg[-trainIndex,]
nrow(train)
nrow(test)

结果展示:

[1] 548
[1] 138
  • 步骤2:使用逻辑回归模型
# 创建并训练逻辑回归模型
lr_model <- glm(status ~ ., data = train, family = binomial(link = "logit"))
summary(lr_model)

结果展示:

Call:
glm(formula = status ~ ., family = binomial(link = "logit"), 
    data = train)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4692  -0.9033  -0.4523   0.9058   2.2232  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)  1.1771566  0.8549956   1.377   0.1686    
age         -0.0067695  0.0157300  -0.430   0.6669    
meno         0.4075039  0.3139902   1.298   0.1943    
size         0.0077945  0.0074443   1.047   0.2951    
grade        0.0271568  0.1772156   0.153   0.8782    
nodes        0.0482255  0.0209566   2.301   0.0214 *  
pgr         -0.0018286  0.0006756  -2.707   0.0068 ** 
er           0.0007048  0.0007740   0.911   0.3625    
hormon      -0.2889779  0.2220921  -1.301   0.1932    
rfstime     -0.0014294  0.0001740  -8.214   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 755.12  on 547  degrees of freedom
Residual deviance: 618.96  on 538  degrees of freedom
AIC: 638.96

Number of Fisher Scoring iterations: 4

  • 步骤3:使用决策树模型
library(rpart)
dt_model <- rpart(status ~ ., data = train, method = "class")
summary(dt_model)

结果展示:

Call:
rpart(formula = status ~ ., data = train, method = "class")
  n= 548 

          CP nsplit rel error    xerror       xstd
1 0.36546185      0 1.0000000 1.0000000 0.04681075
2 0.04417671      1 0.6345382 0.6947791 0.04369674
3 0.02208835      2 0.5903614 0.6385542 0.04266618
4 0.02008032      4 0.5461847 0.6586345 0.04305245
5 0.01070950      6 0.5060241 0.6746988 0.04334678
6 0.01004016     10 0.4618474 0.6867470 0.04355912
7 0.01000000     12 0.4417671 0.6867470 0.04355912

Variable importance
rfstime   nodes     pgr   grade     age      er    size 
     53      14       9       7       6       6       4 

Node number 1: 548 observations,    complexity param=0.3654618
  predicted class=0  expected loss=0.4543796  P(node) =1
    class counts:   299   249
   probabilities: 0.546 0.454 
  left son=2 (295 obs) right son=3 (253 obs)
  Primary splits:
      rfstime < 966.5  to the right, improve=47.781200, (0 missing)
      nodes   < 3.5    to the left,  improve=19.571190, (0 missing)
      pgr     < 103.5  to the right, improve=12.617530, (0 missing)
      er      < 14.5   to the right, improve= 4.926028, (0 missing)
      grade   < 1.5    to the left,  improve= 4.652411, (0 missing)
  Surrogate splits:
      nodes < 5.5    to the left,  agree=0.637, adj=0.213, (0 split)
      pgr   < 25.5   to the right, agree=0.626, adj=0.190, (0 split)
      er    < 8.5    to the right, agree=0.588, adj=0.107, (0 split)
      grade < 2.5    to the left,  agree=0.569, adj=0.067, (0 split)
      age   < 44.5   to the right, agree=0.555, adj=0.036, (0 split)

Node number 2: 295 observations,    complexity param=0.0107095
  predicted class=0  expected loss=0.2610169  P(node) =0.5383212
    class counts:   218    77
   probabilities: 0.739 0.261 
  left son=4 (155 obs) right son=5 (140 obs)
  Primary splits:
      rfstime < 1593.5 to the right, improve=7.364219, (0 missing)
      pgr     < 123    to the right, improve=2.775756, (0 missing)
      nodes   < 3.5    to the left,  improve=2.634844, (0 missing)
      age     < 68.5   to the left,  improve=2.093624, (0 missing)
      size    < 14     to the left,  improve=1.649638, (0 missing)
  Surrogate splits:
      size  < 24.5   to the left,  agree=0.593, adj=0.143, (0 split)
      pgr   < 26.5   to the right, agree=0.553, adj=0.057, (0 split)
      age   < 37.5   to the right, agree=0.549, adj=0.050, (0 split)
      grade < 2.5    to the left,  agree=0.549, adj=0.050, (0 split)
      nodes < 4.5    to the left,  agree=0.549, adj=0.050, (0 split)

...
  • 步骤4:在测试集上进行预测
lr_pred <- predict(lr_model, newdata = test, type = "response")
dt_pred <- predict(dt_model, newdata = test, type = "class")
dt_pred <- as.numeric(as.character(dt_pred))
  • 步骤5:计算auc
# 计算逻辑回归模型的ROC曲线
lr_roc <- roc(test$status, lr_pred)
lr_auc <- auc(lr_roc)
lr_auc

# 计算决策树模型的ROC曲线
dt_roc <- roc(test$status, dt_pred_class)
dt_auc <- auc(dt_roc)
dt_auc

结果展示:

# > lr_roc

Call:
roc.default(response = test$status, predictor = lr_pred)

Data: lr_pred in 88 controls (test$status 0) < 50 cases (test$status 1).
Area under the curve: 0.8352

# > dt_roc

Call:
roc.default(response = test$status, predictor = dt_pred_class)

Data: dt_pred_class in 88 controls (test$status 0) < 50 cases (test$status 1).
Area under the curve: 0.715

  • 步骤6:绘制ROC曲线
plot(lr_roc, col = "blue", main = "ROC Curve", xlab = "False Positive Rate", ylab = "True Positive Rate", print.thres = TRUE, print.auc = TRUE, legacy.axes = TRUE)
lines(dt_roc, col = "red")
legend("bottomright", legend = c(paste("Logistic Regression (AUC =", round(lr_auc, 2), ")"), paste("Decision Tree (AUC =", round(dt_auc, 2), ")")), col = c("blue", "red"), lty = 1)

在这里插入图片描述

从ROC曲线和auc值看,逻辑回归预测的准确率是要高于决策树的,相对更适合该数据集。

  • 步骤7:交叉验证
library(caret)

# 交叉验证
k = 5
control <- trainControl(method = "cv", number = k)

# 使用train函数逻辑回归模型进行交叉验证
result_lr <- train(status ~ ., data = train, method = "glm",trControl = control) 

# 查看逻辑回归交叉验证的结果
result_lr



# 使用train函数决策树模型进行交叉验证
result_repart <- train(status ~ ., data = train, method = "rpart",trControl = control) 

# 查看决策树交叉验证的结果
result_repart

结果展示:

# > result_lr
Generalized Linear Model 

548 samples
  9 predictor

No pre-processing
Resampling: Cross-Validated (5 fold) 
Summary of sample sizes: 439, 438, 439, 438, 438 
Resampling results:

  RMSE       Rsquared   MAE     
  0.4486714  0.2001741  0.396397

# > result_repart
CART 

548 samples
  9 predictor

No pre-processing
Resampling: Cross-Validated (5 fold) 
Summary of sample sizes: 438, 439, 439, 438, 438 
Resampling results across tuning parameters:

  cp          RMSE       Rsquared   MAE      
  0.03500388  0.4539174  0.1900666  0.3885073
  0.03912224  0.4539174  0.1900666  0.3885073
  0.17584786  0.4855547  0.1045128  0.4554335

RMSE was used to select the optimal model using the smallest value.
The final value used for the model was cp = 0.03912224.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mongodb原理

一&#xff1a;MongoDB的优点和缺点 优点 面向文档存储(类JSON数据模式简单而强大)动态查询全索引支持,扩展到内部对象和内嵌数组查询记录分析快速,就地更新高效存储二进制大对象 (比如照片和视频)复制和故障切换支持Auto- Sharding自动分片支持云级扩展性MapReduce 支持复杂…

chatgpt赋能python:Python选择对话框:简化用户操作的实用工具

Python选择对话框&#xff1a;简化用户操作的实用工具 在Python编程领域中&#xff0c;常常需要与用户进行交互&#xff0c;以便更好地控制程序运行结果。而选择对话框则是一种简化用户操作的实用工具&#xff0c;可避免用户输入错误或步骤繁琐的问题。在本篇文章中&#xff0…

【UE】一个需求案例掌握Timeline和插值Lerp

文章目录 问题背景结论先行timeline和lerp原理使用timelinelerp实现相机平滑跟随BUG猜想验证和解决 问题背景 今天用timelinelerp插值做了一个相机平滑跟随的需求 如果只是要求跟随&#xff0c;直接在tick中把相机位置设置成角色位置就可以 但希望有一个相机滞后角色一点点的…

如何避免ChatGPT,ChatGLM这类大语言模型胡说八道

“ ChatGPT&#xff0c;ChatGLM这类大语言模型一本正经的胡说八道&#xff0c;可能也是它创造性回答的部分。那么谁来判断它在编造无中生有的内容&#xff1f;恐怕只有人才能判断。模型怎么会产生幻觉&#xff0c;我们又怎么避免它产生幻觉&#xff1f;” 01 — 昨天体验了国产…

快上车,搭乘HUAWEI HiCar驶向未来

HUAWEI HiCar&#xff08;以下简称HiCar&#xff09;是华为提供的人-车-家全场景智慧互联解决方案&#xff0c;连接手机与车辆&#xff0c;充分发挥各自的优势属性&#xff0c;将手机的应用/服务生态延伸进车辆&#xff0c;实现以手机为核心的全场景体验。消费者通过HiCar可以感…

HTML 超链接标签、图片标签

超链接标签 超链接描述 HTML使用标签<a>来设置超文本链接 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分。 <a href"url">链接文…

【运维】Linux升级Python2

【运维】Linux升级Python2 操作系统&#xff1a;centos7python版本&#xff1a;升级前版本2.7.5&#xff0c;升级后2.7.18python3版本&#xff1a;升级前3.6.8&#xff0c;升级后版本3.8.8 1、查看当前python版本 [root1 ~]# python -V Python 2.7.5 2、yum安装python [roots14…

Apikit 自学日记:发起文档测试-Websocket

Websocket 进入某个WS协议的API文档详情页&#xff0c;点击文档上方 测试 标签&#xff0c;即可进入 API 测试页&#xff0c;系统会根据API文档的定义的求头部、Query参数、请求体自动生成测试界面并且填充测试数据。 填写/修改请求参数 1.1设置请求头部&#xff08;Header&…

Rovio智能车改锂电经验分享

目录 小车简介 改造思路 改造目的 步骤一、改锂电 电压检测 充电检测 结束语 本文介绍如何给wowwee Rovio智能车改电源过程。 首先介绍硬件情况 小车简介 小车功能强大&#xff0c;带红外定位&#xff0c;带缺电自动归位&#xff0c;带轨迹录制回放&#xff0c;带扬声器…

【PostgreSQL 数据库线下沙龙(武汉站)】PieCloudDB:云原生分布式虚拟数仓的诞生之旅...

2023年6月3日&#xff0c;开源软件联盟 PostgreSQL 中文社区在武汉举办了技术沙龙活动。本次活动主题围绕未来数据库展开讨论和分享。通过探讨未来数据库的概念和特点&#xff0c;为智能化时代的发展提供更多的支持和服务。同时&#xff0c;通过探讨数据库和AI技术的共生共荣&a…

基于SpringBoot的美食点评系统

1.引言 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 美食点评管理系统&#xff0c;主要的模块包括首页、个人中心、用户管理、餐厅管理、美食餐厅管理、地区管理、菜系管理、餐厅点评管理、系统…

短视频矩阵抖音账号矩阵系统源码开发者自研(一)

一、短视频矩阵系统源码框架建模搭建 目录 一、短视频矩阵系统源码框架建模搭建 1.抖音账号矩阵系统功能模型建模 2.短视频账号矩阵系统接口开发规则 二、短视频矩阵系统源码视频剪辑转码处理 短视频矩阵系统是一个多功能的视频内容管理系统&#xff0c;用于创建、剪辑发布…

vue3-多人聊天室角色识别(全栈)

文章目录 主要技术栈目的实现步骤1. 前端发送信息2. 后端处理数据3. 前端渲染数据4. store 主要技术栈 主要技术栈是vue3&#xff0c;springboot&#xff0c;websocket&#xff0c;element-plus 目的 主要目的是复习和梳理 实现步骤 1. 前端发送信息 发送信息&#xff0c…

【Spring Cloud系列】-负载均衡(Load Balancer,LB)

【Spring Cloud系列】-负载均衡&#xff08;Load Balancer&#xff0c;LB&#xff09; 文章目录 【Spring Cloud系列】-负载均衡&#xff08;Load Balancer&#xff0c;LB&#xff09;一、什么是负载均衡&#xff08;Load Balancer&#xff0c;LB&#xff09;二、负载均衡的主要…

【MySQL】MySQL中SQL执行流程

文章目录 一、MySQL语句执行流程1.1、主要的原因有以下几点1.2、具体执行流程图如下 二、存储引擎三、MySQL的架构与内部模块四、崩溃恢复时如何判断事务是否需要提交 一、MySQL语句执行流程 连接器&#xff08;Connector&#xff09;&#xff1a; 当客户端发送一个连接请求时…

设计模式学习之观察者模式

设计模式系列往期文章 设计模式学习之策略模式设计模式学习之策略模式在前端的应用设计模式学习之简单工厂模式设计模式学习之工厂方法模式设计模式学习之抽象工厂模式设计模式学习之策略模式和简单工厂模式的对比 这是设计模式系列的第7篇文章&#xff0c;在这之前我们已经介…

React函数式组件

1. 创建函数式组件 我们可以通过所定义的函数来进行react中组件的定义。首先我们可以定义一个函数&#xff0c;然后通过函数的返回值来进行相关组件的定义。例如下面这张写法&#xff0c;我们可以通过调用一个函数&#xff0c;通过其返回值来进行相关的操作。 function Test()…

chatgpt赋能python:Python遍历A到Z:SEO优化的关键

Python遍历A到Z&#xff1a;SEO优化的关键 对于任何一家网站来说&#xff0c;SEO (Search Engine Optimization, 搜索引擎优化)都是至关重要的&#xff0c;特别是在当今数字时代&#xff0c;人们常常会在搜索引擎中查找信息并浏览不同网站。其中一个重要的SEO策略是为每个网站…

笔记本安装双系统ubuntu时踩的坑——戴尔

如果你遇到以下的这些问题&#xff0c;不要直接装了&#xff0c;无解&#xff01;&#xff01;&#xff01; 建议看我另一篇教程&#xff0c;把硬盘取出来在另外的电脑上装好系统再放回去&#xff0c;这样嘎嘎快。 移动硬盘中安装Ubuntu 20.04系统——立省99%的问题_放风筝的…

水质监测的重要性及应用

水质监测是保障水环境安全和人民健康的重要手段。随着城市化进程的加速和工业化程度的提高&#xff0c;水污染问题日益严重&#xff0c;水质监测的重要性也越来越凸显。水质监测是指对水体中的各种物理、化学和生物参数进行监测和分析&#xff0c;以评估水体的质量和污染程度。…