概述

ROC曲线是机器学习中的一种评价方式,是receiver operating characteristic curve的缩写,作用是验证训练效果的好坏。本文主要目录为下述:

1. 混淆矩阵

2. FPR和TPR

3. ROC曲线

4. AUC指标

5. matlab代码


 1. 混淆矩阵

混淆矩阵的起源,源于医学上对肿瘤是否发生的预测,对于预测肿瘤是否发生的结果有四种情况。

多分类 PR 曲线 python 多分类roc曲线matlab_多分类 PR 曲线 python

如上表, 当预测为良性,真实也为良性时,我们认为预测正确,为TP(真正例);同理,当预测为良性实际为恶性时,认为是预测失败,为FP(假正例);当预测为恶性实际为良性,也是预测失败,为FN(假反例);当预测和真实都为恶性时,预测成功,为TN(真反例)。

可见,上述四种情况有两种预测成功的(TP,TN),两种预测失败的(FT,FN)。上面这个表格就组成了混淆矩阵

2. FPR和TPR

在此定义两个公式,

多分类 PR 曲线 python 多分类roc曲线matlab_matlab_02

FPR表示,在所有的恶性肿瘤中,被预测成良性的比例。称为伪阳性率。其表示随机拿一个恶性的肿瘤样本,有多大概率会将其预测成良性肿瘤。由于是错误预测的概率,所以FPR越小越好。

多分类 PR 曲线 python 多分类roc曲线matlab_机器学习_03

TPR表示,在所有良性肿瘤中,被预测为良性的比例。称为真阳性率。其表示随机拿一个良性的肿瘤样本时,有多大的概率会将其预测为良性肿瘤。是正确预测的概率,所以TPR越大越好。

3. ROC曲线

以FPR为横坐标,TPR为纵坐标,就可以得到下面的坐标系:

多分类 PR 曲线 python 多分类roc曲线matlab_开发语言_04

考察几个特殊的点。

  • 点(0,1),即FPR=0,TPR=1。FPR=0说明FP=0,没有假正例。TPR=1说明,FN=0,也就是说没有假反例。所有的预测都正确了。良性的肿瘤都预测为良性,恶性肿瘤都预测为恶性,分类百分之百正确。这也体现了FPR 与TPR的意义。我们本来就希望FPR越小越好,TPR越大越好。
  • 点(1,0),即FPR=1,TPR=0。这个点与上面那个点形成对比,刚好相反。所以这是最糟糕的情况。所有的预测都预测错了。
  • 点(0,0),即FPR=0,TPR=0。也就是FP=0,TP=0。所以这个点的意义是所有的样本都预测为恶性肿瘤。也就是说,无论给什么样本给我,我都无脑预测成恶性肿瘤就是了。
  • 点(1,1),即FPR=1,TPR=1。显然,这个点跟点(0,0)是相反的,这个点的意义是将所有的样本都预测为良性肿瘤。

考察完这四个点,我们可以知道,如果一个点越接近左上角,那么说明模型的预测效果越好。如果能达到左上角(点(0,1)),那就是最完美的结果了。

4. AUC指标

AUC指模型评估指标,其是基于上面提到的ROC图像,将该图像量化为一个数值,更加简介的表示了模型训练的能力。

其具体表述是指,ROC曲线下的面积。

多分类 PR 曲线 python 多分类roc曲线matlab_机器学习_05

  

5. matlab代码

clear all
%%输入预测值和真实值
label = [1,1,0,0,1,0,1,1,0,0,0,0,1,1,0];        %真实值
p = [0.8,0.6,0.55,0.4,0.7,0.19,0.7,0.8,0.65,0.02,0.25,0.42,0.78,0.69,0.32];     %预测值

%%初始定义
confu = zeros(2,2);     %定义混淆矩阵
x_label=[]; y_label=[]; yy=[];    %定义画图变量
xx=1;

%%ROC运算
for value=0:0.01:1
    box = zeros(1,size(p,2));   %定义缓存向量
    for i=1:size(p,2)  
        if p(i)>=value    %判断阈值
            box(i) = 1;
        else
            box(i) = 0;
        end
        
        if box(i)==0 && label(i)==0     %导入混淆矩阵
            confu(2,2) = confu(2,2) + 1;     %TN
        elseif box(i)==0 && label(i)==1
            confu(1,2) = confu(1,2) + 1;     %FN
        elseif box(i)==1 && label(i)==0
            confu(2,1) = confu(2,1) + 1;     %FP
        elseif box(i)==1 && label(i)==1
            confu(1,1) = confu(1,1) + 1;     %TP
        end
    end
    
    TN=confu(2,2); FN=confu(1,2); FP=confu(2,1); TP=confu(1,1);
    FPR = FP/(FP+TN);   %定义式
    TPR = TP/(TP+FN);
    x_label(xx) = FPR;  %画图坐标赋值
    y_label(xx) =  TPR;
    yy(xx) = FPR;
    xx=xx+1;
end
AUC = -1*trapz(x_label,y_label);    %求AUC值(曲线的面积)


%%画ROC图
figure(1)
plot(x_label,y_label);
title({'ROC曲线', ['AUC = ', num2str(AUC)]});
xlabel("FPR");
ylabel("TPR");
hold on
plot(x_label, yy,'g');