Matlab绘制ROC曲线(附详细画法思路及博客参考)
Ro从c曲线的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]绘图结果
参考博客(推荐):
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)