ROC曲线是机器学习中的一种评价方式,是receiver operating characteristic curve的缩写,作用是验证训练效果的好坏。本文主要目录为下述:
1. 混淆矩阵
2. FPR和TPR
3. ROC曲线
4. AUC指标
5. matlab代码
混淆矩阵的起源,源于医学上对肿瘤是否发生的预测,对于预测肿瘤是否发生的结果有四种情况。
如上表, 当预测为良性,真实也为良性时,我们认为预测正确,为TP(真正例);同理,当预测为良性实际为恶性时,认为是预测失败,为FP(假正例);当预测为恶性实际为良性,也是预测失败,为FN(假反例);当预测和真实都为恶性时,预测成功,为TN(真反例)。
可见,上述四种情况有两种预测成功的(TP,TN),两种预测失败的(FT,FN)。上面这个表格就组成了混淆矩阵
在此定义两个公式,
FPR表示,在所有的恶性肿瘤中,被预测成良性的比例。称为伪阳性率。其表示随机拿一个恶性的肿瘤样本,有多大概率会将其预测成良性肿瘤。由于是错误预测的概率,所以FPR越小越好。
TPR表示,在所有良性肿瘤中,被预测为良性的比例。称为真阳性率。其表示随机拿一个良性的肿瘤样本时,有多大的概率会将其预测为良性肿瘤。是正确预测的概率,所以TPR越大越好。
以FPR为横坐标,TPR为纵坐标,就可以得到下面的坐标系:
考察几个特殊的点。
考察完这四个点,我们可以知道,如果一个点越接近左上角,那么说明模型的预测效果越好。如果能达到左上角(点(0,1)),那就是最完美的结果了。
AUC指模型评估指标,其是基于上面提到的ROC图像,将该图像量化为一个数值,更加简介的表示了模型训练的能力。
其具体表述是指,ROC曲线下的面积。
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');