ROC曲线原理及其matlab实现源码

来源:互联网 发布:qq mac 摄像头不能用 编辑:程序博客网 时间:2024/06/09 21:49

ROC曲线和AUC经常用来评价二分类器的好坏,ROC简单的说就是在不断地调整阀值(正例置信度)的条件下,求TPR(True Positive Rate)和FPR(False Positive Rate)的值,具体的定义如下图:
这里写图片描述
由于我们实验室做的是气象方面,所以使用的是POD,FAR和CSI
这里写图片描述
四个特殊点和一条直线:
(1)(0,0)全部预测为负类,TPR=FPR=0,即TP=FP=0,
(2)(0,1)全部分类正确,TPR=1,FPR=0,即FN=0(每个正例都预测正确),FP=0(所有的的负类分类正确)
(3)(1,1)全部预测为正类,TPR=FPR=1,FN=0(所有的正类都预测对了),TN=0(所有的负类都预测错了)
(4)(1,0)全部分类错误,TPR=0,FPR=1,即TP=0,TN=0(没有预测对的)
(5)y=x直线:下面考虑ROC曲线图中的虚线y=x上的点,这条对角线上的点其实表示的是一个采用随机猜测策略的分类器的结果,例如(0.5,0.5),表示该分类器随机对于一半的样本猜测其为正样本,另外一半的样本为负样本

matlab源码:

dec = load('dec_values.txt');%所有样本的预测概率,即一个样本对应一个1*2维的向量,分别对应属于负类和正类的概率value = load('test_label_54.txt');%真实标签predict = dec(:,2);%获取属于正类的概率ground_truth = value;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始点为(1.0, 1.0)  x = 1.0;  y = 1.0;  %计算出ground_truth中正样本的数目pos_num和负样本的数目neg_num  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);  ground_truth = ground_truth(index);  %对predict中的每个样本分别判断他们是FP或者是TP  %遍历ground_truth的元素,  %若ground_truth[i]=1,则TP减少了1,往y轴方向下降y_step%实际上就是一当前样本属于正类的概率为阀值,当前样本实际是正类,但是我们预测成了负类,TP就减少了1TP+FN是实际正类的数量,这肯定是不变的,以下同理可得  %若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  %画出图像 XX = X;YY = Y;plot(X,Y,'-kp','LineWidth',1,'MarkerSize',1);  xlabel('False Positive Rate');  ylabel('True Positive Rate');  %计算小矩形的面积,返回auc   auc = -trapz(X,Y);title(['ROC Curve of (AUC = ',num2str(auc),')']);

参考网址:
(1)https://www.douban.com/note/284051363/