matlab实现ROC曲线

您所在的位置:网站首页 roc定义 matlab实现ROC曲线

matlab实现ROC曲线

2023-12-01 07:57| 来源: 网络整理| 查看: 265

概述

ROC曲线是机器学习中的一种评价方式,是receiver operating characteristic curve的缩写,作用是验证训练效果的好坏。本文主要目录为下述:

1. 混淆矩阵

2. FPR和TPR

3. ROC曲线

4. AUC指标

5. matlab代码

 1. 混淆矩阵

混淆矩阵的起源,源于医学上对肿瘤是否发生的预测,对于预测肿瘤是否发生的结果有四种情况。

如上表, 当预测为良性,真实也为良性时,我们认为预测正确,为TP(真正例);同理,当预测为良性实际为恶性时,认为是预测失败,为FP(假正例);当预测为恶性实际为良性,也是预测失败,为FN(假反例);当预测和真实都为恶性时,预测成功,为TN(真反例)。

可见,上述四种情况有两种预测成功的(TP,TN),两种预测失败的(FT,FN)。上面这个表格就组成了混淆矩阵

2. FPR和TPR

在此定义两个公式,

FPR = \frac{FP}{FP+TN}

FPR表示,在所有的恶性肿瘤中,被预测成良性的比例。称为伪阳性率。其表示随机拿一个恶性的肿瘤样本,有多大概率会将其预测成良性肿瘤。由于是错误预测的概率,所以FPR越小越好。

TPR = \frac{TP}{TP+FN}

TPR表示,在所有良性肿瘤中,被预测为良性的比例。称为真阳性率。其表示随机拿一个良性的肿瘤样本时,有多大的概率会将其预测为良性肿瘤。是正确预测的概率,所以TPR越大越好。

3. ROC曲线

以FPR为横坐标,TPR为纵坐标,就可以得到下面的坐标系:

考察几个特殊的点。

点(0,1),即FPR=0,TPR=1。FPR=0说明FP=0,没有假正例。TPR=1说明,FN=0,也就是说没有假反例。所有的预测都正确了。良性的肿瘤都预测为良性,恶性肿瘤都预测为恶性,分类百分之百正确。这也体现了FPR 与TPR的意义。我们本来就希望FPR越小越好,TPR越大越好。点(1,0),即FPR=1,TPR=0。这个点与上面那个点形成对比,刚好相反。所以这是最糟糕的情况。所有的预测都预测错了。点(0,0),即FPR=0,TPR=0。也就是FP=0,TP=0。所以这个点的意义是所有的样本都预测为恶性肿瘤。也就是说,无论给什么样本给我,我都无脑预测成恶性肿瘤就是了。点(1,1),即FPR=1,TPR=1。显然,这个点跟点(0,0)是相反的,这个点的意义是将所有的样本都预测为良性肿瘤。

考察完这四个点,我们可以知道,如果一个点越接近左上角,那么说明模型的预测效果越好。如果能达到左上角(点(0,1)),那就是最完美的结果了。

4. AUC指标

AUC指模型评估指标,其是基于上面提到的ROC图像,将该图像量化为一个数值,更加简介的表示了模型训练的能力。

其具体表述是指,ROC曲线下的面积。

  

5. matlab代码 clear all %%输入预测值和真实值 label = [1,1,0,0,1,0,1,1,0,0,0,0,1,1,0]; %真实值 p = [0.8,0.6,0.55,0.4,0.7,0.19,0.7,0.8,0.65,0.02,0.25,0.42,0.78,0.69,0.32]; %预测值 %%初始定义 confu = zeros(2,2); %定义混淆矩阵 x_label=[]; y_label=[]; yy=[]; %定义画图变量 xx=1; %%ROC运算 for value=0:0.01:1 box = zeros(1,size(p,2)); %定义缓存向量 for i=1:size(p,2) if p(i)>=value %判断阈值 box(i) = 1; else box(i) = 0; end if box(i)==0 && label(i)==0 %导入混淆矩阵 confu(2,2) = confu(2,2) + 1; %TN elseif box(i)==0 && label(i)==1 confu(1,2) = confu(1,2) + 1; %FN elseif box(i)==1 && label(i)==0 confu(2,1) = confu(2,1) + 1; %FP elseif box(i)==1 && label(i)==1 confu(1,1) = confu(1,1) + 1; %TP end end TN=confu(2,2); FN=confu(1,2); FP=confu(2,1); TP=confu(1,1); FPR = FP/(FP+TN); %定义式 TPR = TP/(TP+FN); x_label(xx) = FPR; %画图坐标赋值 y_label(xx) = TPR; yy(xx) = FPR; xx=xx+1; end AUC = -1*trapz(x_label,y_label); %求AUC值(曲线的面积) %%画ROC图 figure(1) plot(x_label,y_label); title({'ROC曲线', ['AUC = ', num2str(AUC)]}); xlabel("FPR"); ylabel("TPR"); hold on plot(x_label, yy,'g');



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3