ROC曲线绘制及AUC计算

来源:互联网 发布:初学数控车床编程教程 编辑:程序博客网 时间:2024/05/17 21:43

ROC曲线绘制及AUC计算


思想改变世界,技术连接你我。果果,今天过得好吗?—Joly Zhang

ROC曲线可以直观的反映分类性能,而AUC则可定量的对分类器进行测评。今天我们以简洁的方式说明ROC曲线的绘制及AUC的计算方法。

方法一 按定义进行计算

步骤:
1.1给定一个常量N,把区间[0,1]均等地分成N分,依次取k=0,1/N,2/N,…N-1/N,1作为阈值,对测试数据进行分类。
1.2 对于每一个给定的阈值,计算:
a. TP 、FP、TN、FN实例的个数。
b.

TPR = nTP/(nTP + nFN);
FPR = nFP/(nFP + nTN);

c.由(FPR,TPR)构成ROC曲线上的点。
1.3 通过一系列坐标点会制ROC曲线。
1.4 计算AUC:
a.将坐标点按照横着FPR排序
b.计算第i个坐标点和第i+1个坐标点的间距 dx;
c.获取第i(或者i+1)个坐标点的纵坐标y;
d.计算面积微元ds = ydx;
e.对面积微元进行累加,得到AUC。

Matlab实现

function [ auc ] = ROCDrawing( predict_label ) %% ploting ROC and computing AUC.  Version(1)%  input param:   predict_label n-by-2 matrices.%                 column 1: probabilities for positive instances.%                 column 2: labels of instances.%  output param:  auc.%                          --by.Joly Zhang   10-22-2016%%%L= 1000;p = zeros(L,2);ix = 1;for k = 0:1/L:1    preT = predict_label(:,1) > k;    preF = predict_label(:,1) <= k;    TP = predict_label(preT,2) == 1;    FP = predict_label(preT,2) == 0;    FN = predict_label(preF,2) == 1;    TN = predict_label(preF,2) == 0;    TPR = sum(TP)/(sum(TP)+sum(FN));    FPR = sum(FP)/(sum(FP)+sum(TN));    p(ix,:) = [FPR, TPR];    ix = ix+1;endplot(p(1:L-3,1),p(1:L-3,2),'-');hold on;plot(0:1/L:1,0:1/L:1,'.-g');%% 计算AUC[vl,id] = sort(p(:,1));s = 0;for i_blob = 1:L-1;    s = s+ p(id(i_blob+1),2)*(vl(i_blob+1)-vl(i_blob));endauc =s;end

方法二 基于对ROC曲线的理解

我们来简单的分析一下:
1.横轴FPR表示所有的负实例中,错误地分类为正实例的比例。那么就可以认为,横轴[0,1]区间被划分为无数个小区间,每个区间长度为dx=1/(nFP+nTN)。并且,每出现一个负实例,ROC曲线局部沿横轴方向往右移动一个单位距离。
2.纵轴PTR表示所有的正实例中,准确地预测为正实例的比例。那么就可以认为,纵轴[0,1]区间被划分为无数个小区间,每个区间长度为dy=1/(nTP+nFN)。并且,每出现一个正实例,ROC曲线局部沿横轴方向往上移动一个单位距离。
3.由此,我们可以从坐标原点(0,0)向右上方运动至(1,1)每次移动方向由预测实例的实际分类标签所决定。(当然,在此之前要对预测概率进行排序。移动方向也可以从右上角至坐标原点)。
4.每当在水平方向上移动时,不要忘了计算面积微元ds =ydx,并进行累加哦。

Matlab实现

function [ auc ] = ROCDrawing( predict_label )%% ploting ROC and computing AUC. Version(2)%  input param:   predict_label n-by-2 matrices.%                 column 1: probabilities for positive instances.%                 column 2: labels of instances.%  output param:  auc.%                          --by.Joly Zhang   10-22-2016%%%NP = sum(predict_label(:,2)==1);NN = sum(predict_label(:,2)==0);step_x = 1/NN;step_y = 1/NP;[~,id] = sort(predict_label(:,1));len =size(predict_label,1);point = zeros(len,2);point(len,:) = [1,1];%start from right-top positions = 0;for k = len:-1:2    if predict_label(id(k),2) ==1%从右上至左下,向下        point(k-1,:) =[point(k,1),point(k,2) - step_y];    else        point(k-1,:) =[point(k,1)-step_x,point(k,2)];        s = s + point(k,2);    endendplot(point(:,1),point(:,2),'r');hold on;plot(0:1/len:1,0:1/len:1,'.');auc = s*step_x;end
0 0
原创粉丝点击