首页 > 其他分享 >视频|分类模型评估:精确率、召回率、ROC曲线、AUC与R语言生存分析时间依赖性ROC实现|附代码数据

视频|分类模型评估:精确率、召回率、ROC曲线、AUC与R语言生存分析时间依赖性ROC实现|附代码数据

时间:2023-09-18 22:12:49浏览次数:49  
标签:AUC ROC 预测 依赖性 ## 模型 曲线

全文链接:http://tecdat.cn/?p=20650 

原文出处:拓端数据部落公众号

 

视频|分类模型评估:精确率、召回率、ROC曲线、AUC与R语言生存分析时间依赖性ROC实现

分类模型评估精确率、召回率、ROC曲线、AUC与R语言生存分析时间依赖性ROC实现

 

本文将帮助您回答以下问题:

  1. ROC曲线是什么?
  2. 曲线下的面积是多少?
  3. 二元分类的决策阈值是多少?
  4. 分类模型可接受的 AUC值是多少?
  5. 什么是精确召回曲线?
  6. 什么时候应该使用精确召回和 ROC 曲线?

什么是ROC曲线?

如果你用搜索 ROC 曲线,你会得到以下答案:

* *接受者操作特征曲线或 ROC 曲线是一个图形,它说明了二元分类器系统在其区分阈值变化时的诊断能力。”

这个定义不容易理解,对初学者来说可能听起来很吓人。

本文旨在帮助您以一种简单的语言理解 ROC 曲线,以便您可以在 ROC 曲线背后建立一些基本思想。

在我们进入 ROC 曲线之前,我们需要记住混淆矩阵是什么。

混淆矩阵

混淆矩阵帮助我们可视化模型在区分两个类别时是否“错误”。它是一个 2x2 矩阵。行名是测试集中的实际值,列名是模型预测的。

PositiveNegative是 ML 模型预测标签的名称。每当预测错误时,第一个词是False,当预测正确时,第一个词是True

ROC曲线基于从混淆矩阵得出的两个指标:真正例率 ( TPR ) 和假正例率 ( FPR )。TPR与召回率相同。它是正确预测的正样本除以数据集中可用的所有实际正样本的比率。

TPR 侧重于实际的正类:

真正例率公式

反过来,FPR 是假正例预测与真负样本总数的比率。

FPR公式

ROC 曲线是基于 TPR 和 FPR 绘制的。

ROC曲线示例

通过使用 TPR 和 FPR,ROC 曲线显示了您的分类模型在所有分类阈值下的性能。

但是分类决策阈值是多少?

首先,你的分类 ML 模型输出是一个概率。例如,您构建一个分类器来根据给定人的体重预测性别(女性或男性)。假设正类是女性(1),负类是男性(0)。然后,您将 150 公斤的重量样本传递给您的 ML 模型,该模型预测的概率为 0.23。

默认情况下,您的分类阈值为 0.5。任何高于 0.5 的概率将被归类为 1 类(正),低于 0.5 的概率将被归为 0 类(负)。给定 0.23 的概率,体重 150 公斤的人将被归类为负类(男性)。

简而言之,您使用此阈值作为截止值,将预测结果分类为正类或负类。这是一个后处理步骤,将预测概率作为二进制类别返回。通过更改阈值,您的 TP、TN、FP 和 FN 将发生变化,因此您可以根据要改进的指标对其进行优化。

因此,ROC 反过来会告诉您您的 ML 模型能够在多大程度上区分不同阈值的两个类别。

您使用称为AUC曲线下面积来测量 ROC。您使用 AUC 来评估算法的质量,以便在两个类别之间进行检测。

A rea U under the Curve: AUC 

让我们通过图形示例来回顾 ROC。

假设我们正在建立一个模型来预测:申请人是偿还贷款还是坏帐。

在下图中,蓝线是正类预测概率的分布,表示申请者拒付(未能偿还),红线是负类预测概率分布,表示申请者将偿还。

在以下情况下,AUC 为 0.70。这意味着该模型能够正确区分正类和负类之间的 70%。

AUC=0.7

显然,我们离理想的情况还很远。曲线将重叠,这意味着我们的 ML 模型会犯错误,我们将其视为误报。

理想分类器示例

上述案例说明了当我们的 ML 模型正确预测两个类时的理想情况。分布之间没有重叠。该模型可以完美区分正类和负类,是一个理想的分类器。

可能存在 AUC 为 0.5 的情况。这意味着我们的 ML 模型无法区分正类和负类。它实际上是一个随机分类器。

AUC = 0.5

有时 AUC 为 0。这意味着模型反向预测类别。该模型认为负类是正类,反之亦然。

AUC = 0

总而言之,合理的 AUC 超过 0.5(随机分类器),而好的分类模型的 AUC > 0.9。然而,这个值高度依赖于它的应用。

R语言中生存分析模型与时间依赖性ROC曲线可视化

视频:R语言生存分析原理与晚期肺癌患者分析案例

R语言生存分析Survival analysis原理与晚期肺癌患者分析案例

人们通常使用接收者操作特征曲线(ROC)进行二元结果逻辑回归。但是,流行病学研究中感兴趣的结果通常是事件发生时间。使用随时间变化的时间依赖性ROC可以更全面地描述这种情况下的预测模型。

时间依赖性ROC定义

令 Mi为用于死亡率预测的基线(时间0)标量标记。 当随时间推移观察到结果时,其预测性能取决于评估时间 t。直观地说,在零时间测量的标记值应该变得不那么相关。因此,ROC测得的预测性能(区分)是时间t的函数 。 

累积病例

累积病例/动态ROC定义了在时间t 处的阈值c处的 灵敏度和特异性,  如下所示。

累积灵敏度将在时间t之前死亡的视为分母(疾病),而将标记值高于 c 的作为真实阳性(疾病阳性)。动态特异性将在时间t仍然活着作为分母(健康),并将标记值小于或等于 c 的那些作为真实阴性(健康中的阴性)。将阈值 c 从最小值更改为最大值会在时间t处显示整个ROC曲线 。

新发病例

新发病例ROC1在时间t 处以阈值 c定义灵敏度和特异性,  如下所示。

累积灵敏度将在时间t处死亡的人  视为分母(疾病),而将标记值高于 Ç 的人视为真实阳性(疾病阳性)。

数据准备

我们以数据 包中的dataset3survival为例。事件发生的时间就是死亡的时间。Kaplan-Meier图如下。

   


## 变成data_frame
data <- as_data_frame(data)
## 绘图
plot(survfit(Surv(futime, fustat) ~ 1,
                   data = data)

可视化结果:

在数据集中超过720天没有发生任何事件。

   

## 拟合cox模型
coxph(formula = Surv(futime, fustat) ~ pspline(age, df = 4) + 
##获得线性预测值
 predict(coxph1, type = "lp")

累积病例

实现了累积病例

   

## 定义一个辅助函数,以在不同的时间进行评估
ROC_hlp <- function(t) {
    survivalROC(Stime        
                status        
                marker        
                predict.time = t,
                method       = "NNE",
                span = 0.25 * nrow(ovarian)^(-0.20))
}
## 每180天评估一次
ROC_data <- data_frame(t = 180 * c(1,2,3,4,5,6)) %>%
    mutate(survivalROC = map(t, survivalROC_helper),
           ## 提取AUC
           auc = map_dbl(survivalROC, magrittr::extract2, "AUC"),
           ## 在data_frame中放相关的值
           df_survivalROC = map(survivalROC, function(obj) {
           
## 绘图
 ggplot(mapping = aes(x = FP, y = TP)) +
    geom_point() +
    geom_line() +
      facet_wrap( ~ t) +
 

可视化结果:

180天的ROC看起来是最好的。因为到此刻为止几乎没有事件。在最后观察到的事件(t≥720)之后,AUC稳定在0.856。这种表现并没有衰退,因为高风险分数的人死了。

新发病例

实现新发病例

   

## 定义一个辅助函数,以在不同的时间进行评估
 
## 每180天评估一次
 
            ## 提取AUC
           auc = map_dbl(risksetROC, magrittr::extract2, "AUC"),
           ## 在data_frame中放相关的值
           df_risksetROC = map(risksetROC, function(obj) {
               ## 标记栏
               marker <- c(-Inf, obj[["marker"]], Inf)
 
## 绘图
 
    ggplot(mapping = aes(x = FP, y = TP)) +
    geom_point() +
    geom_line() +
    geom_label(data = risksetROC_data %>% dplyr::select(t,auc) %>% unique,
    facet_wrap( ~ t) +
 

可视化结果:

这种差异在后期更为明显。最值得注意的是,只有在每个时间点处于风险集中的个体才能提供数据。所以数据点少了。表现的衰退更为明显,也许是因为在那些存活时间足够长的人中,时间零点的风险分没有那么重要。一旦没有事件,ROC基本上就会趋于平缓。

结论

总之,我们研究了时间依赖的ROC及其R实现。累积病例ROC可能与风险 (累积发生率)预测模型的概念更兼容 。新发病例ROC可用于检查时间零标记在预测后续事件时的相关性。

参考

  1. Heagerty,Patrick J. and Zheng,Yingye,  Survival Model Predictive Accuracy and ROC Curves,Biometrics,61(1),92-105(2005). doi:10.1111 / j.0006-341X.2005.030814.x.

最受欢迎的见解

1.R语言绘制生存曲线估计|生存分析|如何R作生存曲线图

2.R语言生存分析可视化分析

3.R语言如何在生存分析与Cox回归中计算IDI,NRI指标

4.r语言中使用Bioconductor 分析芯片数据

5.R语言生存分析数据分析可视化案例

6.r语言ggplot2误差棒图快速指南

7.R 语言绘制功能富集泡泡图

8.R语言如何找到患者数据中具有差异的指标?(PLS—DA分析)

9.R语言中的生存分析Survival analysis晚期肺癌患者4例

标签:AUC,ROC,预测,依赖性,##,模型,曲线
From: https://www.cnblogs.com/tecdat/p/17713218.html

相关文章

  • RocksDB存储简单使用
    简介rocksDB是一个可嵌入的,持久性的key-value存储。基于Google的LevelDB,但提高了扩展性可以运行在多核处理器上,可以有效使用快速存储,支持IO绑定、内存和一次写负荷。高性能:RocksDB使用一套日志结构的数据库引擎,为了更好的性能,这套引擎是用C++编写的。Key和value是任意大小的......
  • KingbaseES数据库适配Activiti7 didn't put process definition问题处理过程
    一、Activiti介绍Activiti是一个轻量级的java开源BPMN2工作流引擎.目前以升级至7.x,支持与springboot2.x集成.二、项目环境SpringBoot版本2.2.5Activiti版本7.1.x源数据库:MySQL5.7目标数据库:KinbgaseESV008R006C007B0024JDBC驱动:Postgre形态的JDBC驱动,postgresql-42.......
  • Rockchip RK3399 - USB触摸屏接口驱动
    ----------------------------------------------------------------------------------------------------------------------------开发板:NanoPC-T4开发板eMMC:16GBLPDDR3:4GB显示屏:15.6英寸HDMI接口显示屏u-boot:2023.04linux:6.3----------------------------------......
  • mysql连接不上Job for mysqld.service failed because the control process exited wi
    问题:mysql服务器链接不上我们是自己买的服务器搭建的,查看mysql的服务器能不能连的上,看服务是否正常查看进程:top-c;查看磁盘:df-h;linux环境有很多大小,只需要看最大的一个存储就行了,发现可使用的没了,我这图片是清理过后的问题解决先要排查是哪些文件堆满了磁盘,极大的......
  • Rockchip RK3399 - USB OTG和extcon驱动
    一、USBOTGUSB是主从模式的总线,主机称为Host,丛机称为Device(设备)。从机与从机之间、主机与主机之间(不包括USB4.0),不能互联。每次通信都是由主机发起,从机不能主动发起通信,只能被动的应答主机的请求。USBOTG(On-The-Go)是一个扩展的USB标准,允许USB设备之间直接进行通信,而无需通......
  • RocketMQ 入门实战(4)--Java 操作 RocketMQ
    本文主要介绍使用 Java 来操作RocketMQ,文中所使用到的软件版本:Java1.8.0_341、RocketMQ5.1.3、rocketmq-client-java5.0.5。1、引入依赖<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client-java</artifactId><versio......
  • subprocess模块
    subprocess模块是python自带的,安主要用来取代一些旧的模块或方法,如os.system、os.spawn*、os.popen*、commands.*,因此如果需要用python调用外问命令或任务时,则优先使用subprocess模块。使用subprocess模块可以方便地执行操作系统支持的命令。一、subprocess.run()方法:subprocess.......
  • Rockchip RK3399 - USB触摸屏接口驱动
    一、触摸屏接口分类触摸屏主要包括电阻触摸屏和电容触摸屏,这个我们在《linux驱动移植-LCD触摸屏设备驱动》中已经详细介绍了,这里不再重复介绍。在《linux驱动移植-LCD触摸屏设备驱动》这篇文章中我们介绍了SoCS3C2440触摸屏驱动的实现,对于S3C2440来说,其只支持四线电阻触摸屏。......
  • 【RocketMQ】【源码】延迟消息实现原理
    RocketMQ设定了延迟级别可以让消息延迟消费,延迟消息会使用SCHEDULE_TOPIC_XXXX这个主题,每个延迟等级对应一个消息队列,并且与普通消息一样,会保存每个消息队列的消费进度(delayOffset.json中的offsetTable):publicclassMessageStoreConfig{privateStringmessageDelayLevel=......
  • springboot整合rocketMQ——消费者
    依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/......