预测模型的局部评价?

news2024/12/25 10:59:47

预测模型的局部评价

在这里插入图片描述

  • 为什么要进行局部评价?
    首先是临床决策曲线分析通常会给预测模型的使用规定一个阈值范围,相应地预测模型的评价也应该局限在这个范围之内才是合理的;
    其次,全局性地评价往往不够敏感,即好的模型和坏的模型之间分值差别不大。

局部评价的指标:

目前了解到的并可以实现的指标有三种,

  • 局部ROC曲线下面积:又有三种计算方式,pROC的partial.auc、双向AUC和整合pAUC。前两种有专门的R包可以实现,后一种的代码如下(笔者自行撰写,欢迎大家考察)。
    参考文献:Carrington AM, Fieguth PW, Qazi H, Holzinger A, Chen HH, Mayr F, Manuel DG. A new concordant partial AUC and partial c statistic for imbalanced data in the evaluation of machine learning algorithms. BMC Med Inform Decis Mak. 2020 Jan 6;20(1):4. doi: 10.1186/s12911-019-1014-6. PMID: 31906931; PMCID: PMC6945414.
#计算局部AUC的函数,input:概率、真实值、阈值范围
pAUCc=function(pred_prob,true_val,thres_range){
    #pROC,获取threhold,specificity和sensitivity的数据,并取两位小数,便于与输入的数据匹配。
    roc_obj=roc(true_val,pred_prob)
    df=coords(roc_obj)
    df<- df%>%lapply(function(x) round(x,2))%>%as.data.frame()%>%unique()
    # print(df%>%filter(threshold>=0.1 & threshold<=0.11))#threhold小 spec小
    #将输入的threshold匹配成specificity(x)或者sensitivity(y)
    spec_ls_thres_1=df%>%filter(threshold==thres_range[1])%>%select(specificity)#取小的,序号1
    # print(spec_ls_thres_1)
    spec_ls_thres_2=df%>%filter(threshold==thres_range[2])%>%select(specificity)#取大的序号length()
    # print(spec_ls_thres_2)
    #由于precrec这个R包识别的X是1-specificity,所以要转成1-
    spec_end=1-min(spec_ls_thres_1)#
    spec_start=1-max(spec_ls_thres_2)#
    
    sen_end=df%>%filter(specificity==min(spec_ls_thres_1))%>%select(sensitivity)#sen取大的,取1
    sen_start=df%>%filter(specificity==max(spec_ls_thres_2))%>%select(sensitivity)#sen

    # print(spec_start)
    # print(spec_end)
    sen_start=min(sen_start)#pass
    sen_end=max(sen_end)#pass
    # print(sen_start)
    # print(sen_end)
    #计算pAUCc
    curve=precrec::evalmod(scores=pred_prob,labels=true_val)  #计算
    curve_part_x=precrec::part(curve,xlim=c(spec_start,spec_end),curvetype='ROC')#计算纵向的AUC,传统的,限制specficity
    curve_part_y=precrec::part(curve,ylim=c(sen_start,sen_end),curvetype='ROC')#计算横向的AUC,文献知道的,限制sensitivity
    pAUCy=precrec::pauc(curve_part_x)%>% select(paucs)%>%na.omit()
    plot(curve_part_x)
    pAUCx=precrec::pauc(curve_part_y)%>% select(paucs)%>%na.omit()
    plot(curve_part_y)
    pAUCc=(pAUCy[1]+pAUCx[1])/2 
    return (pAUCc[1])
}
  • 局部校准曲线,这个的实现是val.prob函数中限定lim即可实现。
  • 局部决策曲线下面积:代码如下(笔者根据文献自行撰写,欢迎大家反馈)
    参考文献:Talluri R, Shete S. Using the weighted area under the net benefit curve for decision curve analysis. BMC Med Inform Decis Mak. 2016 Jul 18;16:94. doi: 10.1186/s12911-016-0336-x. PMID: 27431531; PMCID: PMC4949771.
##第三个评价指标,净阈值下面积
library(tidymodels)
tidymodels_prefer()
#使用以下函数,需要先将dataframe转成tibble,以tibble名称,预测概率列(需要加引号),实际分类列(0,1,不能加引号)
NBC<-function(pt,df=result_df,pred_prob='predict_logi_prob',real=status){
	result_df=as_tibble(result_df)#data.frame 转tibble
	y_pred_label=df[[pred_prob]]>pt
	df$y_pred_label<-ifelse(y_pred_label=='FALSE',0,1)%>%factor(levels=c(0,1))
	cm<-conf_mat(df,{{real}},y_pred_label)%>%tidy()
	tp=cm$value[4]
	fp=cm$value[3]
	n = length(df[[pred_prob]])
	# prevalence=1011/(90025+1011)
#这里计算的是演示的NB值,如果想计算标准化的NB值,需要除以发病率(prevalence)
	net_benefit = (tp / n) - (fp / n) * (pt / (1 - pt))
	# net_benefit_std=net_benefit/prevalence
	return (net_benefit)
}
#WA-NBC,使用的积分函数,
stats::integrate(function(x){NBC(x,df=result_df)},interest_range[1],interest_range[2])

代码一键运行和更详细信息参考

https://www.heywhale.com/mw/project/643ceb7c446c45f4595416f1

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

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

相关文章

本地搭建属于自己的ChatGPT:基于Python+ChatGLM-6b+Streamlit+QDrant+DuckDuckGo

本地部署chatglm及缓解时效性问题的思路&#xff1a; 模型使用chatglm-6b 4bit&#xff0c;推理使用hugging face&#xff0c;前端应用使用streamlit或者gradio。 微调对显存要求较高&#xff0c;还没试验。可以结合LoRA进行微调。 缓解时效性问题&#xff1a;通过本地数据库…

C语言实现银行家算法

一.银行家算法 1.由来 银行家算法最初是由荷兰计算机科学家艾兹赫尔迪杰斯特拉&#xff08;Edsger W. Dijkstra&#xff09;于1965年提出的。当时他正致力于解决多道程序设计中产生的死锁问题。在多道程序设计中&#xff0c;由于不同进程之间共享有限的系统资源&#xff0c;如…

【JavaEE初阶】多线程(一)认识线程 线程的创建 Thread的用法

摄影分享&#xff01; 文章目录 认识线程&#xff08;Thread&#xff09;概念执行多线程编程创建线程的写法1.继承Thread&#xff0c;重写run2.实现Runnable接口3.使用匿名内部类&#xff0c;继承Thread4.使用匿名内部类&#xff0c;实现Runable5.使用Lambda表达式 Thread用法…

C语言模拟银行排队叫号(链队)

一.队列 队列是一种具有先进先出&#xff08;FIFO&#xff09;特性的线性数据结构&#xff0c;它只允许在队列的两端进行插入和删除操作。队列的一端称为队尾&#xff08;rear&#xff09;&#xff0c;另一端称为队头&#xff08;front&#xff09;。新元素总是插入在队列的队…

怎么把m4a转换成mp3,分享几个方法给大家!

录音文件中经常出现m4a后缀的音频格式&#xff0c;但通常只能在特定的音频播放器中播放。如果你想把m4a转换成mp3&#xff0c;下面是四种简单易行的方法&#xff0c;适用于Windows 10操作系统。 方法一&#xff1a;使用记灵在线工具转换m4a成mp3 工具地址&#xff1a;记灵在线…

elsticsearch入门

查看所有索引&#xff08;表&#xff09; 向索引&#xff08;表&#xff09;中添加数据&#xff1a; 自定义id添加数据&#xff1a; 自定义id添加数据&#xff1a;方式二 查询数据&#xff1a; 查询索引&#xff08;表&#xff09;中全部数据&#xff1a; 全量修改单条数据&…

File类与IO流

1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…

【Leetcode -剑指Offer 22.链表中倒数第k个结点 -203.移除链表元素】

Leetcode Leetcode -剑指Offer 22.链表中倒数第k个结点Leetcode -203.移除链表元素 Leetcode -剑指Offer 22.链表中倒数第k个结点 题目&#xff1a;输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表…

数据结构(三)—— 哈希表

文章目录 一、哈希表积累1.1 哈希map1.2 哈希set 二、哈希表基础三、题3.1 242 有效的字母异位词3.2 349 两个数组的交集3.3 202 快乐数3.4 1 两数之和3.5 54 四数相加II 一、哈希表积累 什么时候想到用哈希法&#xff1a;当要需要查询一个元素是否出现过、判断一个元素是否出…

awvs安装批量扫描

文章目录 安装批量扫描 安装 1.2.AWVS下载   该工具可在官方网站下载&#xff0c;但免费下载的是14天试用版本。   官网下载&#xff1a;AWVS   百度云下载&#xff1a;百度云下载https://pan.baidu.com/s/1UO7GzL0CMemJ_TMQnHNOuA?pwdg1bm 提取码&#xff1a;g1bm 批…

浏览器状态同步和路由-前端路由和服务端路由原理

目录 前端路由和History API 浏览文境&#xff08;Browser Context&#xff09; 会话历史&#xff08;Session History&#xff09; History API history.go()切换当前会话&#xff0c;并不改变会话栈 history.back() history.go(-1) & history.forward() history.…

5.4、服务器编程基本框架和两种高效的事件处理模式

5.4、服务器编程基本框架和两种高效的事件处理模式 1.服务器编程基本框架2.两种高效的事件处理模式①Reactor模式②Proactor模式③模拟Proactor模式 1.服务器编程基本框架 模块功能I/O 处理单元处理客户连接&#xff0c;读写网络数据逻辑单元业务进程或线程网络存储单元数据库、…

18.网络爬虫—Scrapy实战演示

网络爬虫—Scrapy实战演示 Scrapy Shell简介进入shell调试网站启动Scrapy Shell 查看目标网站获取网站源代码常用方法调试xpath提取数据Scrapy请求子页面请求及返回处理创建项目创建爬虫 数据解析写入csv文件后记 前言&#xff1a; &#x1f3d8;️&#x1f3d8;️个人简介&…

Java,jdbc,jvm

1、数据删除 物理删除 直接发送delete语句 就是物理删除 这种删除 删除之后不可恢复逻辑删除 本质是更新 0 表示不可用 1 可用状态 update emp set is_active where id ?2、数据更新 1 显示所有数据 2. 点击修改按钮 此时 应该执行的动作-查询该用户信息 目的是将当前用户…

并发编程的那些事

目录 一、并发编程的目的 二、线程和进程2.1 什么是线程2.2 进程2.3 一个普通Java 程序包含哪些线程 三、并发、并行四、线程的六个状态五、wait 和sleep的区别5.1 位于不同的类5.2 关于锁的释放 一、并发编程的目的 并发编程的目的是为了让程序运行得更快&#xff0c;但是&…

类ChatGPT逐行代码解读(1/2):从零起步实现Transformer、ChatGLM-6B

前言 最近一直在做类ChatGPT项目的部署 微调&#xff0c;关注比较多的是两个&#xff1a;一个LLaMA&#xff0c;一个ChatGLM&#xff0c;会发现有不少模型是基于这两个模型去做微调的&#xff0c;说到微调&#xff0c;那具体怎么微调呢&#xff0c;因此又详细了解了一下微调代…

ggplot中坐标轴和图例的相关处理

文章目录 改变坐标轴和图例的名称方法1, labs()方法2&#xff0c;scale_xxx_discrete/continuous() 删除坐标轴和图例的名称方法1&#xff0c; labs()方法2&#xff0c;scale_xxx_discrete/continuous()方法3&#xff0c;theme()方法4&#xff0c;guides()可以去图例名称 改变图…

osgwidget 使用 方法以及案例分享

osgwidget 使用 方法以及案例分享 按钮 一个常见的 osg::Widget 就是按钮。下面的代码展示了如何使用 osg::Switch 和 osgText 创建一个简单的按钮&#xff1a; osg::ref_ptr<osg::Switch> buttonSwitch new osg::Switch(); osg::ref_ptr<osgText::Text> buttonTe…

[论文阅读] (29)李沐老师视频学习——2.研究的艺术·找问题和明白问题的重要性

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

写在28岁,回看3年前的自己,庆幸当时入了软件测试这行

为什么会学习软件测试&#xff1f; 已经28岁了&#xff0c;算一下快过去3年了&#xff0c;刚毕业那会工作了一年&#xff0c;因为自己当时很迷茫&#xff08;觉得自己挺废的&#xff09;&#xff0c;所以就没去工作就一直在家&#xff0c;家里固定每个月给点生活费&#xff0c…