ROC曲线绘制及AUC计算

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;
end
plot(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));
end
auc =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 position
s = 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);
    end
end
plot(point(:,1),point(:,2),'r');
hold on;
plot(0:1/len:1,0:1/len:1,'.');
auc = s*step_x;
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值