MATLAB对神经网络预测结果计算其各类评价指标及PR曲线和ROC曲线等的绘制

MATLAB对神经网络预测结果计算其各类评价指标及PR曲线和ROC曲线等的绘制、阈值自动选取问题的解决

基于深度学习的图像处理预测结果,我们需要通过对预测结果计算各类评价指标以来评价模型好坏,通常的评价指标有precision(精确率)、accuracy(准确率)、recall(召回率)、F1指数,PR曲线、ROC曲线、AUC值,本文将给出matlab对预测结果的上面这些指标计算的实现,同时运用不同的阈值选取方法来对其结果进行对比,选取最适合的阈值选取方法。
首先是数据读取及各类指标的计算代码:

%unet预测结果的读取
list=dir(['C:\Users\26594\Desktop\桌面乱七八糟东西\大创申请\test\unet_valipredictout(3000)\valipredict3000\','*.png']);
k=length(list);
pre=zeros(400,400,k);
for i=1:1:k
    pre(:,:,i)=imread(['C:\Users\26594\Desktop\桌面乱七八糟东西\大创申请\test\unet_valipredictout(3000)\valipredict3000\',list(i).name]);
end
precision=zeros(1,256);
recall=zeros(1,256);
FPR=zeros(1,256);
pre1=zeros(400,400,k);
%lebals
list=dir(['C:\Users\26594\Desktop\桌面乱七八糟东西\大创申请\test\0729test\labels\','*.png']);
k=length(list);
lab=zeros(400,400,k);
for i=1:1:k
    lab(:,:,i)=imread(['C:\Users\26594\Desktop\桌面乱七八糟东西\大创申请\test\0729test\labels\',list(i).name]);
end
for j=0:1:255

%mid=zeros(400,400);
for i=1:1:k
    pre1(:,:,i)=(pre(:,:,i)>=j);
    pre1(:,:,i)=uint8(pre1(:,:,i));
end
% pre(:,:,1)=imread('predict\predict_cdeep\Segmented_0003.png');
% lab(:,:,1)=imread('predict\labels\cell_5_mask.tif');
% pre(:,:,2)=imread('predict\predict_cdeep\Segmented_0001.png');
% lab(:,:,2)=imread('predict\labels\cell_15_mask.tif');
% pre(:,:,3)=imread('predict\predict_cdeep\Segmented_0002.png');
% lab(:,:,3)=imread('predict\labels\cell_26_mask.tif');
% pre(:,:,1)=im2bw(pre(:,:,1),0.196);
% pre(:,:,1)=uint8(pre(:,:,1));
% pre(:,:,2)=im2bw(pre(:,:,2),0.196);
% pre(:,:,2)=uint8(pre(:,:,2));
% pre(:,:,3)=im2bw(pre(:,:,3),0.196);
% pre(:,:,3)=uint8(pre(:,:,3));
lab_1=0;
lab_0=0;
pre_1=0;
pre_0=0;
lab_1pre_1=0;%lab和pre都为1;
lab_1pre_0=0;%lab为1,pre为0;
lab_0pre_1=0;%lab为0,pre为1;
lab_0pre_0=0;%lab为0,pre为0;
[m,n]=size(lab(:,:,1));
q=k;
for k=1:1:q
for i=1:1:m
    for f=1:1:n
        if lab(i,f,k)==1&&pre1(i,f,k)==1
            lab_1=lab_1+1;
            pre_1=pre_1+1;
            lab_1pre_1=lab_1pre_1+1;
        end
        if lab(i,f,k)==1&&pre1(i,f,k)==0
            lab_1=lab_1+1;
            pre_0=pre_0+1;
            lab_1pre_0=lab_1pre_0+1;
            end
        if lab(i,f,k)==0&&pre1(i,f,k)==1
            lab_0=lab_0+1;
            pre_1=pre_1+1;
            lab_0pre_1=lab_0pre_1+1;
        end
        if lab(i,f,k)==0&&pre1(i,f,k)==0
            lab_0=lab_0+1;
            pre_0=pre_0+1;
            lab_0pre_0=lab_0pre_0+1;
        end
    end
end
end
% zhen_yang=lab_1pre_1/lab_1*100;
 jia_yang=lab_0pre_1/lab_0*100;
% zhen_yin=lab_0pre_0/lab_0*100;
jia_yin=lab_1pre_0/lab_1*100;
%zhunquedu=lab_1pre_1/pre_1*100;
accuracy=(lab_1pre_1+lab_0pre_0)/(lab_0+lab_1)*100;
FPR(j+1)=jia_yang;
precision(j+1)=lab_1pre_1/pre_1*100;
recall(j+1)=lab_1pre_1/lab_1*100;
F1value=2*precision(j+1)*recall(j+1)/(precision(j+1)+recall(j+1));
ji=recall(j+1)/(recall(j+1)+jia_yang+jia_yin)*100;
end
%计算PR曲线面积(AUC值)
AUC_PR=-trapz(recall,precision)/10000;%因为这里recall和FPR值是从大到小变化,
AUC_ROC=-trapz(FPR,recall)/10000;%所以积分出来结果是负值

% disp(['recall:',num2str(recall),'%']);
% disp(['precision:',num2str(precision),'%']);
% disp(['accuracy:',num2str(accuracy),'%']);
% %disp(['召回率为:',num2str(recall),'%']);
% disp(['F1值为:',num2str(F1value)]);
% disp(['雅克卡指数为:',num2str(ji),'%']);
% disp(['AUC_PR:',num2str(AUC_PR)]);
% disp(['AUC_ROC:',num2str(AUC_ROC)]);

通过上面这段程序后,会得到从0到255阈值下计算出来的precision和recall等值。根据这些值,再运行下面这段程序即可作出其各类图,并且可以查看具体阈值下各评价指标的大小:

%此程序需要先通过前面程序运行后,再运行此程序,其中本程序前面部分是作图代码,后面是
%计算取不同阈值所得到的各类评价指标只大小。
%作图程序代码
figure(4)
 plot(FPR/100,recall/100);
 title('ROC曲线');

 figure(3)
 plot(recall/100,precision/100);
 title('PR曲线');

% figure(1)
% plot(precision);
% figure(2)
% plot(recall);

figure(1)
plot(precision/100);
hold on
plot(recall/100);
title('精确率,召回率-阈值曲线');
legend('precision','recall');

figure(2)
plot(diff(precision/100),'color','r');
hold on
plot(-diff(recall/100),'color','g');
title('精确率,召回率导数-阈值曲线');
legend('d(precision)','d(recall)');

figure(5)
plot((1-FPR/100));
hold on
plot(recall/100);
title('召回率,假阳率-阈值曲线');
legend('FPR','recall');

figure(6)
plot(-diff(FPR/100),'color','r');
hold on
plot(-diff(recall/100),'color','g');
title('召回率,假阳率导数-阈值曲线');
legend('d(FPR)','d(recall)');

% %unet
% list=dir(['C:\Users\26594\Desktop\桌面乱七八糟东西\大创申请\test\unet_valipredictout(3000)\valipredict3000\','*.png']);
% k=length(list);
% pre=zeros(400,400,k);
% for i=1:1:k
%     pre(:,:,i)=imread(['C:\Users\26594\Desktop\桌面乱七八糟东西\大创申请\test\unet_valipredictout(3000)\valipredict3000\',list(i).name]);
% end
% 
% pre1=zeros(400,400,k);
% list=dir(['C:\Users\26594\Desktop\桌面乱七八糟东西\大创申请\test\0729test\labels\','*.png']);
% k=length(list);
% lab=zeros(400,400,k);
% for i=1:1:k
%     lab(:,:,i)=imread(['C:\Users\26594\Desktop\桌面乱七八糟东西\大创申请\test\0729test\labels\',list(i).name]);
% end
% j=150;%通过此项来设定阈值大小
% for i=1:1:k
%     pre1(:,:,i)=(pre(:,:,i)>=j);
%     pre1(:,:,i)=uint8(pre1(:,:,i));
% end
% % pre(:,:,1)=imread('predict\predict_cdeep\Segmented_0003.png');
% % lab(:,:,1)=imread('predict\labels\cell_5_mask.tif');
% % pre(:,:,2)=imread('predict\predict_cdeep\Segmented_0001.png');
% % lab(:,:,2)=imread('predict\labels\cell_15_mask.tif');
% % pre(:,:,3)=imread('predict\predict_cdeep\Segmented_0002.png');
% % lab(:,:,3)=imread('predict\labels\cell_26_mask.tif');
% % pre(:,:,1)=im2bw(pre(:,:,1),0.196);
% % pre(:,:,1)=uint8(pre(:,:,1));
% % pre(:,:,2)=im2bw(pre(:,:,2),0.196);
% % pre(:,:,2)=uint8(pre(:,:,2));
% % pre(:,:,3)=im2bw(pre(:,:,3),0.196);
% % pre(:,:,3)=uint8(pre(:,:,3));
% lab_1=0;
% lab_0=0;
% pre_1=0;
% pre_0=0;
% lab_1pre_1=0;%lab和pre都为1;
% lab_1pre_0=0;%lab为1,pre为0;
% lab_0pre_1=0;%lab为0,pre为1;
% lab_0pre_0=0;%lab为0,pre为0;
% [m,n]=size(lab(:,:,1));
% q=k;
% for k=1:1:q
% for i=1:1:m
%     for f=1:1:n
%         if lab(i,f,k)==1&&pre1(i,f,k)==1
%             lab_1=lab_1+1;
%             pre_1=pre_1+1;
%             lab_1pre_1=lab_1pre_1+1;
%         end
%         if lab(i,f,k)==1&&pre1(i,f,k)==0
%             lab_1=lab_1+1;
%             pre_0=pre_0+1;
%             lab_1pre_0=lab_1pre_0+1;
%             end
%         if lab(i,f,k)==0&&pre1(i,f,k)==1
%             lab_0=lab_0+1;
%             pre_1=pre_1+1;
%             lab_0pre_1=lab_0pre_1+1;
%         end
%         if lab(i,f,k)==0&&pre1(i,f,k)==0
%             lab_0=lab_0+1;
%             pre_0=pre_0+1;
%             lab_0pre_0=lab_0pre_0+1;
%         end
%     end
% end
% end
% jia_yang=lab_0pre_1/lab_0*100;
% jia_yin=lab_1pre_0/lab_1*100;
% accuracy=(lab_1pre_1+lab_0pre_0)/(lab_0+lab_1)*100;
% precision=lab_1pre_1/pre_1*100;
% recall=lab_1pre_1/lab_1*100;
% F1value=2*precision*recall/(precision+recall);
% ji=recall/(recall+jia_yang+jia_yin)*100;
% 
% 
% disp(['recall:',num2str(recall),'%']);
% disp(['precision:',num2str(precision),'%']);
% disp(['accuracy:',num2str(accuracy),'%']);
% disp(['F1值为:',num2str(F1value)]);
% disp(['雅克卡指数为:',num2str(ji),'%']);
% disp(['AUC_PR:',num2str(AUC_PR)]);
% disp(['AUC_ROC:',num2str(AUC_ROC)]);

所以可以得到PR、ROC等曲线如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据上图的结果,对不同情况,比如precision和recall值相等的阈值点,也就是PR曲线与y=x的交点处阈值大小;1-FPR与recall大小相等的点,也就是ROC曲线与y=1-x交点阈值大小。计算出其不同阈值下评价指标大小如下:
在这里插入图片描述
至于到底选哪种方法得到合适阈值,就需要根据具体情况了。

  • 7
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值