如何使用 PRROC 画 ROC 曲线

本文介绍了ROC曲线的基本概念,包括TPR和FPR的计算,以及如何通过AUC值评估分类器性能。重点讲解了PRROC软件在绘制彩虹色ROC曲线的应用,展示了如何利用颜色标记阈值并优化模型决策。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是ROC 曲线?

1.1 曲线的横纵轴

sensitivityrecallhit rate, or true positive rate (TPR)

TPR = TP/P = TP/(TP + FN) 

fall-out or false positive rate (FPR)

FPR = FP/N = FP/(FP + TN)

1.2 ROC曲线:wiki

信号检测理论中,接收者操作特征曲线receiver operating characteristic curve,或者叫ROC曲线)是一种坐标图式的分析工具,用于 (1) 选择最佳的信号侦测模型、舍弃次佳的模型。 (2) 在同一模型中设定最佳阈值

设置不同的阈值,可以得到不同的TPR和FPR

  • 当阈值设定为最高时,亦即所有样本都被预测为阴性,没有样本被预测为阳性,此时在伪阳性率 FPR = FP / ( FP + TN ) 算式中的 FP = 0,所以 FPR = 0%。同时在真阳性率(TPR)算式中, TPR = TP / ( TP + FN ) 算式中的 TP = 0,所以 TPR = 0%

→ 当阈值设定为最高时,必得出ROC座标系左下角的点 (0, 0)。

  • 当阈值设定为最低时,亦即所有样本都被预测为阳性,没有样本被预测为阴性,此时在伪阳性率FPR = FP / ( FP + TN ) 算式中的 TN = 0,所以 FPR = 100%。同时在真阳性率 TPR = TP / ( TP + FN ) 算式中的 FN = 0,所以 TPR=100%

→ 当阈值设定为最低时,必得出ROC座标系右上角的点 (1, 1)。

  • 因为TP、FP、TN、FN都是累积次数,TN和FN随着阈值调低而减少(或持平),TP和FP随着阈值调低而增加(或持平),所以FPR和TPR皆必随着阈值调低而增加(或持平)。

→ 随着阈值调低,ROC点 往右上(或右/或上)移动,或不动;但绝不会往左下(或左/或下)移动

1.3 AUC值是什么?它的意义是什么?

AUC值就是正样本排在负样本前面的几率(When using normalized units, the area under the curve (often referred to as simply the AUC) is equal to the probability that a classifier will rank a randomly chosen positive instance higher than a randomly chosen negative one (assuming 'positive' ranks higher than 'negative').[17])不是特别懂里面提到的公式,可以去wiki里看。

理论上来说当两条ROC曲线重合的时候,我们可以通过他们的AUC大小来判定哪个分类器更好。

所以AUC越大,代表分类器越好。(wiki)

从AUC判断分类器(预测模型)优劣的标准:

  • AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  • AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

 

2. 如何使用PRROC画彩虹ROC曲线?

了解完基础知识后,我们在呈现ROC曲线有多种方式,其中一种就是使用彩虹色来标记阈值,

这样做的好处是:我们可以知道什么养的阈值表现出的sensitivity是什么FPR是什么。

又或者我希望我的真阳率优于假阳率,我们可以通过观察阈值决定,哪个阈值更好。我们的阈值是不是接近0.5。

总结一下:

ROCR和pROC是引用比较多的,紧随其后的是14年新发表的。ROCR 04年就出现了一直都是主力马,尽管没有vignette文档,但是documentation说明文档也很好。

pROC是10年发表的,可以在图里面画出来置信曲线。

PRROC是14年新发表的,有超过前两个老牌软件的趋势,特点是它也可以计算precision-recall曲线

ROCR和PRROC都可以画彩色的ROC图片,这里使用PRROC举例子:

input file

Disease

Disease

0.032

0.968

2

4

Fold4

1

2

Disease

Disease

0.096

0.904

6

4

Fold4

1

3

Control

Control

0.850

0.150

18

4

Fold4

0

4

Disease

Control

0.138

0.862

21

4

Fold4

0

5

Disease

Disease

0.088

0.912

28

4

Fold4

1

6

Disease

Disease

0.030

0.970

30

4

Fold4

1

7

Disease

Disease

0.518

0.482

31

4

Fold4

1

8

Control

Control

0.922

0.078

41

4

Fold4

0

9

Disease

Disease

0.356

0.644

42

4

Fold4

1

10

Disease

Disease

0.048

0.952

43

4

Fold4

1

11

Disease

Disease

0.342

0.658

49

4

Fold4

1

12

Disease

Disease

0.030

0.970

51

4

Fold4

1

 

code

library(PRROC)
library(tidyverse)
# filter the prediction output of model object (rf_forest) from R package caret by using the best tunning 

prediction_df <- filter(rf_forest$pred, mtry == 4)


# change the positive group to 1
(prediction_df 就是我们前面粘贴的表格了)

prediction_df$test <- ifelse(prediction_df$obs == "Disease",1,0 )
roc_curve_prediction_df <- PRROC::roc.curve(scores.class0 = prediction_df$Disease, weights.class0=prediction_df$test,
                       curve=TRUE,rand.compute = TRUE) # rand.compute 是0.5的随机分类器,为了画对角线的


#画图
par(cex.axis=2, cex.lab =1.6,font.axis =1.6)
plot(roc_curve_prediction_df,rand.plot = TRUE,auc.main=FALSE,legend =4,lwd=5)
text(1, 0.5, paste('AUC =', ' ',round(roc_curve_prediction_df$auc, digits = 3), sep =""), cex=1.4, font=2, col='black')


# 如果想用ggplot2自己画图,可以把这个矩阵提取出来

roc_curve_prediction_df$auc 

# 三列 分别对应 x轴坐标 y轴坐标 阈值颜色

图片示例:

  

可以看到阈值越大,那么sensitivity越小,FPR也越小;阈值越小,sensitivity越大,FPR也越大。

 

Ref: (感谢下面的帖子!)

https://rviews.rstudio.com/2019/03/01/some-r-packages-for-roc-curves/ 

https://www.jianshu.com/p/c61ae11cc5f6 

https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve

https://zh.wikipedia.org/wiki/ROC%E6%9B%B2%E7%BA%BF

 

 

<think>好的,我现在需要帮用户解决在PyCharm中使用Python绘制ROC曲线的问题。首先,用户提到了要使用matplotlib和sklearn,所以我得先确认这两个库的安装情况。用户可能已经安装了这些库,但可能需要检查版本是否兼容。不过,通常来说,使用最新版本应该没问题。 接下来,我需要回忆绘制ROC曲线的基本步骤。根据之前的经验,步骤大致是:准备数据、训练模型、预测概率、计算ROC指标、绘制曲线。用户可能是在分类问题中使用,比如二分类或多分类。这里可能需要区分两种情况,但用户提供的引用里提到了鸢尾花数据,这是多分类的,不过通常ROC曲线更常用于二分类,所以可能需要将多类数据二值化处理。 然后,用户给的引用中提到了使用sklearn的roc_curve和auc函数,所以需要导入这些模块。另外,参考引用[3]中的示例,可能需要使用label_binarize来处理多类标签。因此,代码的大致流程应该是: 1. 导入必要的库:numpy、matplotlib、sklearn中的数据集、模型、roc_curve、auc、label_binarize。 2. 加载数据,比如鸢尾花数据集。 3. 将多类标签二值化,以便处理多分类情况。 4. 分割数据集为训练集和测试集。 5. 训练分类器,比如逻辑回归。 6. 预测测试集的概率。 7. 计算每个类别的ROC曲线和AUC值。 8. 绘制所有类别的ROC曲线,并添加对角线作为参考。 需要注意的点是,多分类情况下,可能需要为每个类别单独计算ROC曲线,或者使用一对多的策略。例如,引用[3]中提到的做法,这需要正确使用label_binarize函数。另外,颜色和线条的循环设置可以让不同类别的曲线更易区分。 此外,用户可能在使用PyCharm时遇到环境配置的问题,比如库的安装。需要提醒用户确保已安装scikit-learn、matplotlib、numpy等库,可以通过pip安装。如果用户遇到导入错误,可能需要检查这些库是否正确安装。 代码示例需要简洁明了,确保每一步都有注释说明。同时,要确保数据分割和模型训练部分不会出错,比如使用train_test_split来分割数据,逻辑回归模型在训练时的参数设置是否合理,比如max_iter可能需要调大以防止不收敛的情况。 最后,绘制图形时要添加标签、标题、图例等,使图表清晰易懂。可能还需要处理多类别情况下的AUC显示,如引用[3]中的例子,每个类别的AUC值需要分别计算并显示在图例中。 总结下来,步骤明确,代码结构清晰,同时要注意处理多分类的情况,确保用户能够顺利复制代码并运行得到结果。如果用户遇到问题,可能需要进一步检查环境配置或数据预处理步骤是否正确。</think>在PyCharm中绘制ROC曲线可通过`matplotlib`和`scikit-learn`实现。以下是完整代码示例及分步说明: --- ### 1. 环境准备 **确保已安装库**: ```bash pip install scikit-learn matplotlib numpy ``` --- ### 2. 代码实现 ```python # 导入库 import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_curve, auc from sklearn.preprocessing import label_binarize from itertools import cycle # 加载鸢尾花数据集(多分类示例) data = load_iris() X = data.data y = data.target # 将标签二值化(多分类转二进制格式) y_bin = label_binarize(y, classes=[0, 1, 2]) n_classes = y_bin.shape[1] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y_bin, test_size=0.3, random_state=42) # 训练分类器(逻辑回归) classifier = LogisticRegression(max_iter=200) y_score = classifier.fit(X_train, y_train).predict_proba(X_test) # 计算每个类别的ROC曲线和AUC值 fpr = dict() tpr = dict() roc_auc = dict() for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # 绘制ROC曲线 plt.figure(figsize=(8, 6)) colors = cycle(['#FF0000', '#00FF00', '#0000FF']) # 红、绿、蓝 for i, color in zip(range(n_classes), colors): plt.plot(fpr[i], tpr[i], color=color, lw=2, label=f'Class {i} (AUC = {roc_auc[i]:.2f})') # 添加参考线(随机猜测) plt.plot([0, 1], [0, 1], 'k--', lw=2) # 设置图表属性 plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Multi-class ROC Curve') plt.legend(loc="lower right") plt.show() ``` --- ### 3. 关键步骤说明 1. **数据预处理**: - 使用`label_binarize`将多分类标签转换为二进制格式[^3]。 - 通过`train_test_split`划分数据集(70%训练,30%测试)。 2. **模型训练**: - 选择逻辑回归模型,因其概率输出可直接用于ROC计算[^1]。 3. **ROC计算**: - `roc_curve`计算假正率(FPR)和真正率(TPR)。 - `auc`函数计算曲线下面积。 4. **可视化优化**: - 使用不同颜色区分不同类别。 - 添加对角线作为随机猜测基线。 --- ### 4. 常见问题 1. **二分类场景**: 若处理二分类问题,可跳过`label_binarize`步骤,直接使用原始标签。 2. **概率输出问题**: 确保分类器支持`predict_proba`方法(如SVM需设置`probability=True`)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值