8.临床预测模型验证——交叉验证/Bootstrap法

基本概念

交叉验证:

将一定比例的数据挑选出来作为训练集,将其余未选中的样本作为测试集,先在训练集中构建模型,再在测试集中做预测。

内部验证:手动将样本随机分为训练集和测试集,先在训练集中构建模型,再在测试集中进行测试。

常用三种方法:

  1. Hold-Out Method 简单交叉验证;
  2. K-fold Cross Validation (K-CV),K折交叉验证;
  3.  Leave-One-Out Cross Validation(LOO-CV),留一法交叉验证,N折交叉验证。

简单交叉验证:

将原始的数据随机分成两组,一组作为训练集,一组作为测试集。

K折交叉验证:

将数据随机分为K个子集,对每个子集分别做一次测试集,其余的K-1组子集数据作为训练集,最终得到K个模型,用K个测试集的平均结果作为K-折交叉验证的性能指标。可以有效避免过度拟合及欠拟合状态的发生,最终得到的结果也比较有说服力。

注意:K一般不小于3

N折交叉验证:

假设原始数据有N个样本,每个样本作为测试集,其余的N-1个样本作为训练集,所以得到N个模型,用N个模型的平均结果作为此留一法交叉验证的性能指标。

相较于K折交叉验证,N折交叉验证的优势:

  1. 每次交叉验证,N-1个样本用于训练模型,接近原始数据分布,结果较为可靠;
  2. 在交叉验证过程中,没有随机因素影响最终结果,结果具有重现性。

外部验证:基于内部数据集建模完成之后,其他独立的研究团队开展的相同研究,其数据集作为外部数据的来源,进行模型的验证。

Bootstrap法

Bootstrap法是非参数统计方法,对样本进行重抽样,从而估计总体特征。优点:可以避免交叉验证造成的样本减少问题,也可以用于创造样本随机性。

优点:数据较小,难以有效划分训练集和测试集时效果显著,能从初始数据集中产生多个不同的训练集。

缺点:产生的数据集改变了初始数据集的分布,引入了估计偏差,因此在初始数据集样本量足够时,交叉验证法更常用

具体实操

二分类资料

案例:肺动脉栓塞风险模型

library(readxl)
data <- read_excel("data.xlsx")
data<-na.omit(data)
data<-as.data.frame(data)
data$group<-factor(data$group,levels = c(0,1),labels = c("No","Yes"))

利用最优子集法筛选出来的自变量,age,BMI,Tos,CA153,CDU,Transfusion,stage构建模型

form.bestglm<-as.formula(group~age+BMI+ToS+CA153+CDU+transfusion+stage)

若无具体的公式,也可以进行循环交叉验证及Bootstrap,确定最优的模型公式:

简单交叉验证

设置验证方法

train.control_1 <- trainControl(method="LGOCV",p=0.7,number = 1)

method=“LGOCV”,leave-group out cross-validation,为简单交叉验证。p指定训练集占的比例,这里为70%,number指定简单交叉次数。

set.seed(1)
LogMod1 <- train(form.bestglm, data=data, trControl=train.control_1, method='glm')LogMod1

train()函数中formula输入公式,data为数据集,trControl指定相应的交叉算法(为上一步定义好的交叉方法),method指定进行广义线性分析

可以发现共有515个样本,7个预测变量,因变量两个水平,no和yes。训练集占70%,1次重复。准确率达到0.87,Kappa值为0.41。结果尚可

显示ROC的结果

train.control_2 <- trainControl(method="LGOCV",p=0.7,number = 1,classProbs=TRUE,summaryFunction=twoClassSummary)
set.seed(1)
LogMod2 <- train(form.bestglm, data=data, trControl=train.control_2, method='glm')
LogMod2 

 classProbs设置为TRUE,summaryFunction设置为twoClassSummary,表示显示ROC结果。

ROC曲线下面积为0.812,灵敏度为0.976,特异度为0.346

K折交叉验证

train.control_3 <- trainControl(method = "cv", number = 10)
set.seed(1)
LogMod3 <- train(form.bestglm, data=data, trControl=train.control_3, method='glm')
LogMod3
train.control_4 <- trainControl(method = "cv", number = 10,classProbs=TRUE,summaryFunction=twoClassSummary)
set.seed(1)
LogMod4 <- train(form.bestglm, data=data, trControl=train.control_4, method='glm')
LogMod4

需要将方法设置为cv,number=10,表示10折交叉验证

N折交叉验证

train.control_5 <- trainControl(method = "LOOCV")
LogMod5 <- train(form.bestglm, data=data, trControl=train.control_5, method="glm")
LogMod5
train.control_6 <- trainControl(method = "LOOCV",classProbs=TRUE,summaryFunction=twoClassSummary)
LogMod6 <- train(form.bestglm, data=data, trControl=train.control_6, method="glm")
LogMod6

LOOCV为留一法交叉验证。

Bootstrap交叉验证

train.control_7 <-trainControl(method = "boot",number=1000)set.seed(1)
LogMod7 <- train(form.bestglm, data=data, trControl=train.control_7, method="glm")
LogMod7train.control_8 <-trainControl(method = "boot",number=1000,classProbs=TRUE,summaryFunction=twoClassSummary)set.seed(1)
LogMod8 <- train(form.bestglm, data=data, trControl=train.control_8, method="glm")
LogMod8

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

子类的构造函数和析构函数调用顺序

看代码&#xff1a; class A { public:A() { cout << __FUNCTION__ << endl; }~A() { cout << __FUNCTION__ << endl; } };class B { public:B() { cout << __FUNCTION__ << endl; }~B() { cout << __FUNCTION__ << endl; …

8类CNN-Transformer混合架构魔改方案盘点,附23个配套模型&代码

为进一步提高模型的性能&#xff0c;我们将CNN在局部特征提取方面的优势与Transformer在全局信息建模方面的优势两相结合&#xff0c;提出了CNN-Transformer混合架构。目前&#xff0c;它已经成为我们研究视觉任务、发文章离不开的模型。针对CNNtransformer组合方向的研究也成为…

Clickhouse表引擎之CollapsingMergeTree引擎的原理与使用

前言 继续上次关于clickhouse的一些踩坑点&#xff0c;今天讲讲另外一个表引擎——CollapsingMergeTree。这个对于引擎对于数据量较大的场景是个不错的选择。注意&#xff0c;选择clickhouse的一般原因都是为了高效率查询&#xff0c;提高用户体验感&#xff0c;说白了就是以空…

跨站点请求伪造攻击 - Cross Site Request Forgery (CSRF)

什么是CSRF 最好理解CSRF攻击的方式是看一个具体的例子。 假设你的银行网站提供一个表单,允许当前登录用户将钱转账到另一个银行账户。例如,转账表单可能如下所示: <form method="post"action="/transfer"> <

Invalid bound statement (not found)(xml文件创建问题)

目录 解决方法&#xff1a; 这边大致讲一下我的经历&#xff0c;不想看的直接点目录去解决方法 今天照着老师视频学习&#xff0c;中间老师在使用动态SQL时&#xff0c;直接复制了一份&#xff0c;我想这么简单的一个&#xff0c;我直接从网上找内容创建一个好了&#xff0c;…

前端学习路径

菜鸟感觉很多人不太知道菜鸟写的博客是一个可以跟着学习、一起深入理解的过程&#xff0c;其中包括了菜鸟从刚开始学习到后面重新学习&#xff0c;再到后面进入学框架等一系列学习过程、知识和感悟&#xff0c;所以菜鸟把自己的博客整理成一个目录提取出来&#xff0c;好让读者…

彻底解决charles抓包https乱码的问题

最近做js逆向&#xff0c;听说charles比浏览器抓包更好用&#xff0c;结果发现全是乱码&#xff0c;根本没法用。 然后查询网上水文&#xff1a;全部都是装证书&#xff0c;根本没用&#xff01; 最后终于找到解决办法&#xff0c;在这里记录一下&#xff1a; 乱码的根本原因…

【Maven】002-Maven 安装和配置

【Maven】002-Maven 安装和配置 文章目录 【Maven】002-Maven 安装和配置一、官网1、官网2、历史版本列表3、Maven 仓库地址 二、下载 Maven 3.8.8 版本1、进入 Maven 3.8.8 版本发行说明页2、进入下载页3、下载4、下载得到 apache-maven-3.8.8-bin.zip 三、Maven 安装1、将安装…

C# 图解教程 第5版 —— 第22章 命名空间和程序集

文章目录 22.1 引用其他程序集22.2 命名空间22.2.1 命名空间名称22.2.2 命名空间的补充22.2.3 命名空间跨文件伸展22.2.4 嵌套命名空间 22.3 using 指令22.3.1 using 命名空间指令22.3.2 using 别名指令22.3.3 using static 指令 22.4 程序集的结构22.5 程序集标识符22.6 强命名…

力扣刷MySQL-第二弹(详细解析)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

java SECS管理系统 将逐步推出 SECS 客户端(Passive) 管理系统 SECS快速开发平台 springboot secs开发平台

SECS管理系统 这是一套SECS客户端(Passive)&#xff0c;可以直接连接PLC设备,支持Modbus、三菱MC、欧姆龙Fine、OPC-UA、西门子S7设备等通信。 企业已经有了EAP软件&#xff0c;但是设备没有SECS通信功能&#xff0c;这时候可以使用这套框架&#xff0c;直接连接设备&#xff…

基本BGP配置试验 :配置 IBGP 和 EBGP

一、预习&#xff1a; BGP&#xff1a;Border Gateway Protocol 没有精妙的算法&#xff0c;但能承载大量的路由&#xff0c;它不生产路由&#xff0c;它是路由的搬运工 使用TCP做为传输层协议&#xff0c;端口号179&#xff0c;使用触发式路由更新 1. BGP路由…