Matlab绘制ROC曲线(附详细画法思路及博客参考)


学习机器学习时的一次作业:

[1]绘图说明

对于经典的二分类(0、1)问题来说,分类器分类之后,往往会得到对每个样本是哪一类的一个估计predict。根据这个估计,选择一个阈值p_i,就可以将分类结果映射到0、1了;分类效果好不好跟真实的对应的ground_truth中的标签对比。所以predict和ground_truth两个向量便是函数的两个输入参数。因为没有找到合适的数据直接使用了随机值代替,用[0,1]之间的101个点作为predict向量值,用101维随机0-1值向量作为ground_truth。
因为Matlab自带的一个函数trapz可以计算出ROC曲线围成的面积,即AUC值,我选用Matlab绘制曲线。通常来说,曲线越靠近图像的左上角,AUC值越大,表示模型的性能越好。

[2]程序代码(带注释)

首先在plot_roc.m文件中写函数:

function auc=plot_roc(predict,ground_truth)
%初始点为(0.0,0.0)
x = 0.0;
y = 0.0;
pos_num=sum(ground_truth==1);
neg_num=sum(ground_truth==0);
%根据该数目可以计算出沿x轴或者y轴的步长
x_step = 1.0/neg_num;
y_step = 1.0/pos_num;
%首先对predict中的分类器输出值按照从大到小排列
[predict,index] = sort(predict,'descend');
ground_truth = ground_truth(index);
%对predict中的每个样本分别判断他们是FP或者是TP
%遍历ground_truth的元素,
%若ground_truth[i]=1,则TP增加了1,往y轴方向上升y_step
%若ground_truth[i]=0,则FP增加了1,往x轴方向上升x_step
for i=1:length(ground_truth)
    if ground_truth(i) == 1
        y = y + y_step;
    else
        x = x + x_step;
    end
    X(i)=x;
    Y(i)=y;
end
%画出图像     
plot(X,Y,'-ro','LineWidth',2,'MarkerSize',3);
xlabel('假正例率');
ylabel('真正例率');
title('ROC曲线图');
%trapz,matlab自带函数,计算小矩形的面积,返回auc
auc = trapz(X,Y);          
end

说明:首先计算出ground_touth中正样本的数目pos_num和neg_num,引入x_step和y_step,就相当于书上的可以计算出沿x轴或者y轴的步长。再对predict中的分类器输出值按照从大到小排列,即可首先将分类阈值设为最大,循环判断排序后predict[i]对应的ground_truth[i]的值,然后让x轴或者y轴减小x_step或y_step将predict[i]对应的ground_truth[i]的值,。这样,便不必每次去统计TP和FP的值然后再计算每个点的坐标了。

命令行程序:

clear all;
predict=(0:1/100:1);            %生成间隔为0.01的预测阈值
ground_truth=randi([0,1],1,101);%生成0-1随机向量
result=plot_roc(predict,ground_truth);
disp(result);

[3]绘图结果

在这里插入图片描述

参考博客(推荐):

Ro从c曲线的Matlab实现
Roc曲线的通俗理解

发布了54 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43629813/article/details/100939862