考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被 预测成正类,即为真正类(True positive),如果实例是负类被预测成正类,称之为假正类(False positive)。相应地,如果实例是负类被预测成负类,称之为真负类(True negative),正类被预测成负类则为假负类(false negative)。
列联表如下表所示,1代表正类,0代表负类。
|
预测
|
||||
|
1
|
0
|
合计
|
||
|
实际
|
1
|
True Positive(TP)
|
False Negative(FN)
|
Actual Positive(TP+FN)
|
|
0
|
False Positive(FP)
|
True Negative(TN)
|
Actual Negative(FP+TN)
|
|
|
合计
|
Predicted Positive(TP+FP)
|
Predicted Negative(FN+TN)
|
TP+FP+FN+TN
|
从列联表引入两个新名词。其一是真正类率(true positive rate ,TPR), 计算公式为TPR=TP/ (TP+ FN),刻画的是分类器所识别出的 正实例占所有正实例的比例。另外一个是假正类率(false positive rate, FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。还有一个真负类率(True Negative Rate,TNR),也称为specificity,计算公式为TNR=TN/ (FP+ TN) = 1 - FPR。
在一个二分类模型中,对于所得到的连续结果,假设已确定一个阀值,比如说 0.6,大于这个值的实例划归为正类,小于这个值则划到负类中。如果减小阀值,减到0.5,固然能识别出更多的正类,也就是提高了识别出的正例占所有正例的比例,即TPR,但同时也将更多的负实例当作了正实例,即提高了FPR。为了形象化这一变化,在此引入ROC。
Receiver Operating Characteristic,翻译为"接受者操作特性曲线",够拗口的。曲线由两个变量1-specificity 和 Sensitivity绘制. 1-specificity=FPR,即假正类率。Sensitivity即是真正类率,TPR(True positive rate),反映了正类覆盖程度。这个组合以1-specificity对sensitivity,即是以代价(costs)对收益(benefits)。
下表是一个逻辑回归得到的结果。将得到的实数值按大到小划分成10个个数 相同的部分。
|
Percentile
|
实例数
|
正例数
|
1-特异度(%)
|
敏感度(%)
|
|
10
|
6180
|
4879
|
2.73
|
34.64
|
|
20
|
6180
|
2804
|
9.80
|
54.55
|
|
30
|
6180
|
2165
|
18.22
|
69.92
|
|
40
|
6180
|
1506
|
28.01
|
80.62
|
|
50
|
6180
|
987
|
38.90
|
87.62
|
|
60
|
6180
|
529
|
50.74
|
91.38
|
|
70
|
6180
|
365
|
62.93
|
93.97
|
|
80
|
6180
|
294
|
75.26
|
96.06
|
|
90
|
6180
|
297
|
87.59
|
98.17
|
|
100
|
6177
|
258
|
100.00
|
100.00
|
其正例数为此部分里实际的正类数。也就是说,将逻辑回归得到的结 果按从大到小排列,倘若以前10%的数值作为阀值,即将前10%的实例都划归为正类,6180个。其中,正确的个数为4879个,占所有正类的 4879/14084*100%=34.64%,即敏感度;另外,有6180-4879=1301个负实例被错划为正类,占所有负类的1301 /47713*100%=2.73%,即1-特异度。以这两组值分别作为x值和y值,在excel中作散点图。得到ROC曲线如下

roc曲线
上面的部分均来自百度百科。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面是自己的理解,如果不正确,欢迎指正(虽说基本上没啥人看。。。)
前几天画了ROC曲线,其实按照自己的理解,就是错误接受率(FAR,false acceptance rate)和错误拒绝率(FRR,false rejection rate)的关系曲线。FAR对应FP,FRR对应FN。这两个通过阈值T来计算。因为对于分类问题,都需要一个阈值,来判断某样本是属于positive还是negative。对应于每个阈值,都可以得到一个FAR和一个FRR。按照不同的stepsize,得到不同的阈值,便可以得到对应的一组FAR和FRR。之后画FAR和FRR的关系,便是ROC曲线。
matlab代码如下(由于FAR和FRR的数据变化范围比较大,因而使用了对数坐标log):
1 load('result.mat');
2 Pnum=length(resultP);
3 Nnum=length(resultN);
4
5 minN=min(resultN);
6 maxN=max(resultN);
7
8 index=0;
9 for threshold=minN:0.002:maxN
10 index=index+1;
11 FRR(index)=length(find(resultP>threshold))/Pnum;
12 FAR(index)=length(find(resultN<threshold))/Nnum;
13 thresholdT(index)=threshold;
14 end
15 plot(FAR,FRR);
16 title('ROC曲线');
17 set(gca,'yscale','log')
18 set(gca,'xscale','log')
19 axis([min(FAR) max(FAR)+0.01 min(FRR) max(FRR)])
20 grid on
21 grid minor
22
23 set(gca,'YTickMode','manual');
24 set(gca,'YMinorTick','on');
25 ylabelval=[1e-4 1e-3 1e-2 1e-1 0.2]';
26 set(gca,'ytick',ylabelval') ;
27 for kk=1:1:length(ylabelval)
28 b(kk)='%';
29 end
30 ylabeltick=[num2str(ylabelval*100),b'];
31 set(gca,'yticklabel',ylabeltick) ;
32
33 set(gca,'XTickMode','manual');
34 xlabelval=[1e-6 1e-5 1e-4 1e-3 1e-2 1e-1 1]';
35 set(gca,'xtick',xlabelval) ;
36 for kk=1:1:length(xlabelval)
37 a(kk)='%';
38 end
39 xlabeltick=[num2str(xlabelval*100),a'];
40 set(gca,'xticklabel',xlabeltick);
41 xlabel('FAR');
42 ylabel('FRR');
画出来的结果如下:

来源:https://www.cnblogs.com/darkknightzh/p/4196160.html