• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

matlab 绘制 ROC曲线

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

编程题目

        接收操作特征(Receiver Operating CharacteristicROC)曲线,即通常所讲的ROC Curve,是机器学习领域中常用的分类性能评估曲线,横轴是False Positive Rate,纵轴是True Positive Rate。请用Matlab编写一个自动画出ROC曲线的函数,并给出测试例子。

实验过程和解答

[1]原理分析

    对于经典的二分类(0、1)问题来说,分类器分类之后,往往会得到对每个样本是哪一类的一个估计predict,像是LR模型就会将这个估计规范化到【0、1】。根据这个估计,你选择一个阈值p_i,就可以将分类结果映射到0、1了;分类效果好不好跟真实的对应的ground_truth中的标签比比就行了。所以你手里有predict和ground_truth两个向量,用来做分类结果的评估,这两个向量便是函数的两个输入参数。

        为了更好的衡量ROC所表达结果的好坏,Area Under CurveAUC)被提了出来,简单来说就是曲线右下角部分占正方形格子的面积比例。那么计算这个东西其实就很简单了,在这里我用到了matlab中自带的一个函数trapz,它可以计算出这个面积。通常来说,曲线越靠近图像的左上角,也就是曲线的下方面积越大,表示模型的性能越好。

[2]程序代码

        其实画ROC曲线函数的代码编写方法不止一种。老师注释里提供的方法是一种很简洁高效的方法。只需要不断遍历排序后的predict向量,引入x_stepy_step,循环判断排序后predict[i]对应的ground_truth[i]的值,然后让x轴或者y轴减小x_stepy_step。这样,便不必每次去统计TPFP的值然后再计算每个点的坐标了。最后代码如下:

[plain] view plain copy
  1. function  auc = plot_roc( predict, ground_truth )  
  2. % INPUTS  
  3. %  predict       - 分类器对测试集的分类结果  
  4. %  ground_truth - 测试集的正确标签,这里只考虑二分类,即0和1  
  5. % OUTPUTS  
  6. %  auc            - 返回ROC曲线的曲线下的面积  
  7.   
  8. %初始点为(1.0, 1.0)  
  9. x = 1.0;  
  10. y = 1.0;  
  11. %计算出ground_truth中正样本的数目pos_num和负样本的数目neg_num  
  12. pos_num = sum(ground_truth==1);  
  13. neg_num = sum(ground_truth==0);  
  14. %根据该数目可以计算出沿x轴或者y轴的步长  
  15. x_step = 1.0/neg_num;  
  16. y_step = 1.0/pos_num;  
  17. %首先对predict中的分类器输出值按照从小到大排列  
  18. [predict,index] = sort(predict);  
  19. ground_truth = ground_truth(index);  
  20. %对predict中的每个样本分别判断他们是FP或者是TP  
  21. %遍历ground_truth的元素,  
  22. %若ground_truth[i]=1,则TP减少了1,往y轴方向下降y_step  
  23. %若ground_truth[i]=0,则FP减少了1,往x轴方向下降x_step  
  24. for i=1:length(ground_truth)  
  25.     if ground_truth(i) == 1  
  26.         y = y - y_step;  
  27.     else  
  28.         x = x - x_step;  
  29.     end  
  30.     X(i)=x;  
  31.     Y(i)=y;  
  32. end  
  33. %画出图像       
  34. plot(X,Y,'-ro','LineWidth',2,'MarkerSize',3);  
  35. xlabel('虚报概率');  
  36. ylabel('击中概率');  
  37. title('ROC曲线图');  
  38. %计算小矩形的面积,返回auc  
  39. auc = -trapz(X,Y);            
  40. end  


由于缺少具体测试数据,在这里我们简单用【0,1】之间的101个点作为predict向量值,用101维随机0-1值向量作为ground_truth。测试代码如下:

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

[3]实验效果

由最后的ROC曲线图效果如下。

 



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
一个用于专利下载的Delphi源代码程序发布时间:2022-07-18
下一篇:
Delphi在系统菜单中添加菜单项发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap