ROC曲线MATLAB实现以及AUC

来源:互联网 发布:信鸽软件鑫 编辑:程序博客网 时间:2024/06/05 11:26

首先我们先来对ROC的一些解释以及计算的方法。
ROC曲线(Receiver Operating Characteristic Curve)是利用Classification模型真正率(True Positive Rate)和假正率(False Positive Rate)作为坐标轴,图形化表示分类方法的准确率的高低。
ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣。
ROC图的一些概念定义::
真正(True Positive , TP)被模型预测为正的正样本
假负(False Negative , FN)被模型预测为负的正样本
假正(False Positive , FP)被模型预测为正的负样本
真负(True Negative , TN)被模型预测为负的负样本

真正率(TPR)
TPR = TP /(TP + FN)
正样本预测结果数 / 正样本实际数 。在ROC曲线中,TPR作为Y轴
假正率( FPR)
FPR = FP /(FP + TN)
被预测为正的负样本结果数 /负样本实际数 。在ROC曲线中,FPR作为X轴。
接下来我们考虑ROC曲线图中的四个点和一条线。第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false positive)=0。Wow,这是一个完美的分类器,它将所有的样本都正确分类。第二个点,(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。类似的,第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好。
这里https://www.douban.com/note/284051363/可以看看具体对ROC和AUC计算的解释
工程中的实现:

%  predict       - 分类器对测试集的分类结果%  ground_truth - 测试集的正确标签,这里只考虑二分类,即0和1%  auc            - 返回ROC曲线的曲线下的面积function auc = plot_roc( predict, ground_truth )%初始点为(1.0, 1.0)%计算出ground_truth中正样本的数目pos_num和负样本的数目neg_numpos_num = sum(ground_truth==1);neg_num = sum(ground_truth==0);m=size(ground_truth,1);[pre,Index]=sort(predict);ground_truth=ground_truth(Index);x=zeros(m+1,1);y=zeros(m+1,1);auc=0;x(1)=1;y(1)=1;for i=2:mTP=sum(ground_truth(i:m)==1);FP=sum(ground_truth(i:m)==0);x(i)=FP/neg_num;y(i)=TP/pos_num;auc=auc+(y(i)+y(i-1))*(x(i-1)-x(i))/2;end;x(m+1)=0;y(m+1)=0;auc=auc+y(m)*x(m)/2;plot(x,y,'lineWidth',1.5);xlabel('False Positive Rate');ylabel('True Positive Rate');end

解释:
(1)统计数据标签值ground_truth(及y)中分类为0和分类为1的数据数目:

pos_num=sum(ground_truth==1);neg_num=sum(ground_truth);

(2)对利用模型求出的预测值predict由低到高进行排序;对应数据原来所在位置进行索引记录,用于重新排序ground_truth.利用函数sort实现,sort详情请查看help文档:

[pre,Index]=sort(predict); ground_truth=ground_truth(Index);

(3)对ground_truth和predict遍历i=1:n,n是测试集数目。其目的是随着predict中概率的增加,随着增加判断正负样本的阈值;也就是说取遍历到的predict值为阈值,大于阈值的假设预测为正样本(阈值右边),小于阈值的假设预测为负样本(阈值左边)。
所以同时我们可得到真正TP 和假正FP值:

TP=sum(ground_truth(i:n)==1);FP=sum(ground_truth(i:n)==0);

这时我们就可以求取TPR 和FPR了:TPR=TP/pos_num; FPR=FP/neg_num; 把求取到的值保存起来(x(i),y(i)),因为这就是我们要在图上画的点。
(4)返回曲线与坐标轴间的面积auc。我们的目的是测量数据的准确率,这个面积就是一个量度,auc越大,准确率越高。

auc=auc+(y(i)+y(i-1))*(x(i-1)-x(i))/2

函数的使用示例:

clc;clear all;clear;ground_truth=load('ground_truth_label.mat');classification_mrmr_svm_predict_value=load('classification_mrmr_svm_predict_value.mat');auc_mrmr=plot_roc(classification_mrmr_svm_predict_value.decision_values,ground_truth.test_label);hold on;%color rclassification_svm_PCAVIP_predict_value=load('classification_svm_PCAVIP_predict_value.mat');auc_PCAVIP=plot_roc(classification_svm_PCAVIP_predict_value.decision_values,ground_truth.test_label);hold on;classification_svm_predict_value=load('classification_svm_predict_value.mat');auc_pca=plot_roc(classification_svm_predict_value.decision_values,ground_truth.test_label);hold on;hLe = legend({'mRMR (AUC=0.70)', 'PCA-VIP (AUC=0.69)', 'PCA (AUC=0.78)'},...    'location', 'southeast');hLe.FontSize = 14;
原创粉丝点击