最近在画交叉验证的ROC曲线。由于我采用的是留一法来做10折交叉,这就导致我每一折的样本数量是不固定的,但我又想画一个平均的校验验证性能曲线,并且把置信区间也画出来,找了很久资料,我画了一个这样的。先看效果图,如下图:
中间蓝色的是平均的ROC,周围蓝色的带是所有的交叉验证触及的最大范围。因为交叉验证需要多次抽样,但我用的是深度学习,很难做到抽样,所以就用最大范围代替置信区间。具体做法如下:

from my_utils.utils import *
from sklearn.metrics import auc, plot_roc_curve, roc_curve
import my_utils.file_util as fu
import matplotlib.pyplot as plt
class_type = '1p19q'
#图表的保存路径
save_path = ''
#存放所有交叉验证的预测结果和label的文件路径
record_dir  = ''
#find_file是我自己写的寻找路径下所有best-auc.csv文件的函数,用的时候可以替换成自己的
#返回的是所有csv文件的绝对路径。文件格式是第一和第二列是预测值,第三列label。
#因为我用的是one hot做二分类,所以有两个值
flods_dir = find_file(record_dir, 2,1, suffix='best_auc.csv')
pre_record = []
#获取所有交叉验证的预测值和label
for record_file in flods_dir:temp = fu.csv_reader(record_file)temp_fold_record = []#因为是二分类,所有只取第一个预测值,第二个不要temp_fold_record.append([i[0] for i in temp])#取label值temp_fold_record.append([i[2] for i in temp])pre_record.append(temp_fold_record)roc_record, value, fpr, tpr = [], [], [], []for record in pre_record:label = np.array([int(i) for i in record[1]]).squeeze()pred = np.array([float(i) for i in record[0]]).squeeze()#计算roc曲线t_fpr, t_tpr, thre = roc_curve(label, 1-pred)#计算AUCauc_score = auc(t_fpr, t_tpr)fpr.append([float(i) for i in t_fpr])value.extend([float(i) for i in t_fpr])tpr.append([float(i) for i in t_tpr])mean_fpr, min_fpr, max_fpr = [],[],[]
mean_tpr, min_tpr, max_tpr= [],[],[]
#这个是为了对曲线进行插值,因为每个曲线的样本不一样,所以获取到的fpr和tpr也不一样长度,
#所以需要进行插值
#插值的原理是,获取所有fpr的值,然后将每个交叉验证的roc都插值成和fpr的值一样多的长度。
#插值并不会改变每个roc曲线的形状,这个可以放心使用
unique = np.unique(np.array(value).flatten())
#对fpr和tpr进行插值
for l in range(len(fpr)):tpr[l] = np.interp(unique, fpr[l], tpr[l], 0, 1)fpr[l] = np.interp(unique, fpr[l], fpr[l], 0, 1)#将每个交叉验证的ROC都画出来plt.plot(fpr[l], tpr[l])fpr = np.array(fpr)
tpr = np.array(tpr)
#求fpr和tpr的极大极小,获取每个实验所能触及的最大指标范围
min_fpr = np.min(fpr, axis=0)
max_fpr = np.max(fpr, axis=0)
min_tpr = np.min(tpr, axis=0)
max_tpr = np.max(tpr, axis=0)
#获取均值,为了得到交叉验证的平均曲线
mean_tpr = np.mean(tpr, axis=0)
mean_fpr = np.mean(fpr, axis=0)
mean_tpr[0] = 0plt.figure(dpi=300)
plt.title(class_type)
plt.style.use('seaborn')
plt.xlabel('1-Specificity')
plt.ylabel('Sencitivity')
#画平均曲线
p1 = plt.plot(mean_fpr, mean_tpr, marker='.', linestyle='--',c='b', linewidth=1,alpha=0.65, label='20X')#markeredgecolor='b',plt.legend(loc='lower right')
#将极大极小值的范围填充淡蓝色
p2 = plt.fill_between(min_fpr,max_tpr, min_tpr,color='blue', alpha=0.08)
#展示图象
plt.show()

下面附上每个交叉验证的图像来验证范围画的对不对。

再对比我们画的
可以看到啊,我们画的范围与所有ROC的曲线的范围是吻合的,平均曲线也像模像样。

画交叉验证的ROC曲线,多个样本不同的ROC重叠。相关推荐

  1. ROC曲线是什么?ROC曲线是怎么绘制的?ROC曲线的横纵坐标是什么?如何用Python绘制?AUC又是什么?

    ROC曲线是什么?ROC曲线是怎么绘制的?ROC曲线的横纵坐标是什么?AUC又是什么? metrics.roc_auc_score metrics.roc_curve ROC= Receiver Op ...

  2. reportROC 一行代码输出ROC曲线的各项统计数值及ROC曲线

    今天来学习一个新R包--reportROC,这个R包可以一行代码输出ROC曲线的各项统计数值及ROC曲线,比如截断值.AUC及置信区间.灵敏度及置信区间.特异度及置信区间.阳性似然比.阴性似然比.阴性 ...

  3. roc曲线spss怎么做_SPSS单因素ROC曲线及多因素联合诊断ROC曲线绘制(原创手把手) - 医学统计和生物统计讨论版 -丁香园论坛...

    最近被好几个师弟师妹问到ROC曲线的绘制,尤其是多因素联合诊断ROC曲线的绘制(如下图这样的怎么做),所以干脆好好总结一下: 一.单因素ROC曲线 其实这个最简单,估计很多人也会,我知道的有两种办法, ...

  4. python的roc曲线与阈值_浅谈ROC曲线的最佳阈值如何选取

    为了获取ROC曲线的最佳阈值,需要使用一个指标--约登指数,也称正确指数. 借助于matlab的roc函数可以得出计算. % 1-specificity = fpr % Sensitivity = t ...

  5. Lasso交叉验证构建模型并计算各样本评分

    Lasso交叉验证 library(glmnet) library(survival) library(survminer)x = exp[,gene] #gene为纳入的基因集 y = Surv(t ...

  6. 分类算法如何绘制roc曲线,如何绘制knn模型的ROC曲线

    I am using ROCR package and i was wondering how can one plot a ROC curve for knn model in R? Is ther ...

  7. 交叉验证分析每一折(fold of Kfold)验证数据的评估指标并绘制综合ROC曲线

    交叉验证分析每一折(fold of Kfold)验证数据的评估指标并绘制综合ROC曲线 Receiver Operating Characteristic (ROC) with cross valid ...

  8. 通过交叉验证(Cross Validation)KFold绘制ROC曲线并选出最优模型进行模型评估、测试、包含分类指标、校准曲线、混淆矩阵等

    通过交叉验证(Cross Validation,CV)KFold绘制ROC曲线并选出最优模型进行模型评估.测试.包含分类指标.校准曲线.混淆矩阵等 Cross Validation cross val ...

  9. 分类器MNIST交叉验证准确率、混淆矩阵、精度和召回率(PR曲线)、ROC曲线、多类别分类器、多标签分类、多输出分类

    本博客是在Jupyter Notebook下进行的编译. 目录 MNIST 训练一个二分类器 使用交叉验证测量精度 混淆矩阵 精度和召回率 精度/召回率权衡 ROC曲线 多类别分类器 错误分析 多标签 ...

最新文章

  1. quartus II Warning 好的时序是设计出来的,不是约束出来的
  2. 我的Android进阶之旅------gt;Android使用AlarmManager全局定时器实现定时更换壁纸
  3. 谈谈密码学的数学原理
  4. 一起谈.NET技术,.NET异步编程:IO完成端口与BeginRead
  5. stm32串口传输数据第一个数据被吞_STM32串口第一个字节丢失问题的分析过程
  6. mysql uroot p f_Mysql 5.7安装
  7. java 多线程使用线程池_Java多线程:如何开始使用线程
  8. 寻路的几种算法_Godot游戏开发实践之二:AI之寻路新方式
  9. python 任务计划程序_10.Selenium+Python+任务计划程序实现定时发送邮件
  10. maven checkstyle 文件_flink教程-在IntelliJ IDEA 中玩转 checkstyle
  11. 在做模具设计过程中应注意哪些问题
  12. 今日头条张一鸣:做CEO要避免理性的自负
  13. 外星人m15键盘灯光设置_Alienware Command Center灯光软件高级设置
  14. 单层感知器神经网络matlab,MATLAB神经网络——单层感知器
  15. STM32F1读取MLX90614ESF非接触式温度传感器
  16. 10046追踪文件里的tim---clock walk formula(reading Cary Millsap)
  17. 更改Pycharm的配置文件的存放路径
  18. postman脚本批量请求
  19. eclipse 创建java窗体_eclipse新建窗体类
  20. 计算机人要具备的基础知识!

热门文章

  1. 电压电流等效,功率不等效;对外等效,对内不等效的理解
  2. 华数机器人旋转编程_华数工业机器人离线编程示教操作教程
  3. 无线网460王者荣耀服务器,王者荣耀总是460怎么办?
  4. gettimeofday/clock_gettime
  5. 千分位显示方法(每三位数字之间加一个逗号显示)
  6. 《Unity Shader入门精要》笔记:高级篇(3)以及扩展
  7. java-net-php-python-jspm学生评奖评优管理系计算机毕业设计程序
  8. 非接触物体尺寸形态测量_质量工程师必须了解的测量常识,你不知道怎么行
  9. 解决安卓开机卡谷歌联机验证的问题.2022-03-15
  10. 【FRP】群晖docker中部署Frp