matlab roc曲线怎么画

matlab roc曲线怎么画,第1张

ROC曲线(Receiver Operating Characteristic Curve)是利用Classification模型真正率(True Positive Rate)和假正率(False Positive Rate)作为坐标轴,图形化表示分类方法的准确率的高低。

ROC图的一些概念定义::

真正(True Positive , TP)被模型预测为正的正样本

假负(False Negative , FN)被模型预测为负的正样本

假正(False Positive , FP)被模型预测为正的负样本

真负(True Negative , TN)被模型预测为负的负样本

真正率(TPR)

TPR = TP /(TP + FN)

正样本预测结果数 / 正样本实际数 。在ROC曲线中,TPR作为Y轴

假正率( FPR)

FPR = FP /(FP + TN)

被预测为正的负样本结果数 /负样本实际数 。在ROC曲线中,FPR作为X轴

关于ROC曲线的相关概念的解释,请参阅cowboy_wz的博客ROC曲线:http://blog.csdn.net/chl033/article/details/4507544

我在此主要做的事情是画出ROC曲线工程实现方面的一些解释。我们设计一个函数,此函数需要有一个模型预测值predict和数据标签值ground_truth作为输入参数。分为几步进行实现。

(1)统计数据标签值ground_truth(及y)中分类为0和分类为1的数据数目:

pos_num=sum(ground_truth==1)neg_num=sum(ground_truth)

(2)对利用模型求出的预测值predict由低到高进行排序对应数据原来所在位置进行索引记录,用于重新排序ground_truth.利用函数sort实现,sort详情请查看help文档:

[pre,Index]=sort(predict)ground_truth=ground_truth(Index)

(3)对ground_truth和predict遍历i=1:n,n是测试集数目。其目的是随着predict中概率的增加,随着增加判断正负样本的阈值;也就是说取遍历到的predict值为阈值,大于阈值的假设预测为正样本(阈值右边),小于阈值的假设预测为负样本(阈值左边)。

所以同时我们可得到真正TP 和假正FP值:TP=sum(ground_truth(i:n)==1)FP=sum(ground_truth(i:n)==0)

这时我们就可以求取TPR 和FPR了:TPR=TP/pos_num FPR=FP/neg_num 把求取到的值保存起来(x(i),y(i)),因为这就是我们要在图上画的点。

(4)返回曲线与坐标轴间的面积auc。我们的目的是测量数据的准确率,这个面积就是一个量度,auc越大,准确率越高。

auc=auc+(y(i)+y(i-1))*(x(i-1)-x(i))/2;

实现ROC曲线的代码如下:

% predict - 分类器对测试集的分类结果

% ground_truth - 测试集的正确标签,这里只考虑二分类,即0和1

% auc- 返回ROC曲线的曲线下的面积

function auc = plot_roc( predict, ground_truth )

%初始点为(1.0, 1.0)

%计算出ground_truth中正样本的数目pos_num和负样本的数目neg_num

pos_num = sum(ground_truth==1)

neg_num = sum(ground_truth==0)

m=size(ground_truth,1)

[pre,Index]=sort(predict)

ground_truth=ground_truth(Index)

x=zeros(m+1,1)

y=zeros(m+1,1)

auc=0

x(1)=1y(1)=1

for i=2:m

TP=sum(ground_truth(i:m)==1)FP=sum(ground_truth(i:m)==0)

x(i)=FP/neg_num

y(i)=TP/pos_num

auc=auc+(y(i)+y(i-1))*(x(i-1)-x(i))/2

end

x(m+1)=0y(m+1)=0

auc=auc+y(m)*x(m)/2

plot(x,y)

end

ROC曲线是通用的分类器评价工具,matlab函数中自带了绘制该曲线的函数plotroc。

plotroc函数的原型为:plotroc(targets, outputs)

其中参数targets是一个矩阵,代表测试集,每一列表示一个测试样本的标签

如果有两类样本,比如第1,2,5个样本属于第1类,第3,4,6个样本属于第2类....则targets应为:

1 1 0 0 1 0 ...

0 0 1 1 0 1 ...

如果只有一类样本,包含了负样本,则只要一行,用1表示正样本,0表示负样本即可,比如targets为:

1 0 1 1 0 0 0 0 1 ...

参数outputs也是一个矩阵,代表分类结果,同样每一列表示一个测试样本的分类结果

同样如果有两类样本,则应有两个分类器,每一列记录了每个测试样本在两个分类器上的得分,此时outputs为:

0.8 0.85 0.2 0.75 0.21 ...

0.8 0.01 0.9 0.23 0.67 ...

如果只有一类,则outputs只有一行,如:

0.8 0.6 0.8 0.7 0.05 0.3 0.03 ...

注意,得分必须在[0, 1]的区间内,可以自己规约一下。

我们将相应的测试标签targets和对应的分类得分outputs输入plotroc中就可以绘制出相应的ROC曲线了。

(a) 要修改预训练模型的最后三层,可以在代码中指定要保留的层数,并使用新的全连接层、softmax层和分类层来替换原来的层。

在这个代码中,可以使用以下代码来修改最后三层:

layersTransfer = net.Layers(1:end-3)

numClasses = numel(categories(pictures.Labels))

layers = [

layersTransfer

fullyConnectedLayer(numClasses,'WeightLearnRateFactor', 20, ...

'BiasLearnRateFactor', 20)

softmaxLayer

classificationLayer]

这段代码首先使用 net.Layers(1:end-3) 语句将 VGG-19 网络的所有层中的最后三层保留在 layersTransfer 中。然后,它使用 numel 函数计算类别数,并使用 fullyConnectedLayer 函数创建一个新的全连接层。最后,它使用 softmaxLayer 和 classificationLayer 函数创建新的 softmax 层和分类层。

修改预训练模型的最后三层的原因是,这些层是专门用于 ImageNet 数据集的分类任务的,可能不适用于其他数据集或任务。因此,使用新的层可以使模型更适用于新的数据集和任务。

(b) 要解释运行结果,可以使用函数 like confusionmat、plotconfusion、accuracy 和 plotroc 等函数来分析模型的性能。

confusionmat 函数可以用来计算混淆矩阵,即每种类别的预测结果。plotconfusion 函数可以绘制混淆矩阵,以帮助您直观地观察模型的表现。accuracy 函数可以用来计算模型的准确率,即模型正确预测的样本数与总样本数的比例。plotroc 函数可以绘制受试者工作特征 (ROC) 曲线,以帮助您评估模型的分类能力。

(c) 对模型的行为做出进一步的假设,可以尝试确定模型在哪些方面表现较好,哪些方面表现较差,以及可能的原因。

例如,如果模型在识别某些类别的图像时表现较差,可以假设这可能是因为这些类别的图像与其他类别的图像很相似,或者因为这些类别的图像数量较少,导致模型在训练过程中没有得到足够的数据。

如果模型的总体表现较差,可以假设这可能是因为数据集中存在许多噪声或杂质,导致模型无法有效地学习特征。或者,模型可能需要更多的训练数据来学习特征。

为了改进模型的表现,可能需要清洗数据、增加训练数据的数量、调整超参数或尝试使用不同的预训练模型或模型结构。

例如,可以使用以下代码来解释运行结果:

% 计算混淆矩阵

confusionchart(Testimgs.Labels,Ypred)

% 绘制混淆矩阵

plotconfusion(Testimgs.Labels,Ypred)

% 计算准确率

acc = accuracy(Testimgs.Labels,Ypred)

% 绘制 ROC 曲线

plotroc(Testimgs.Labels,Ypred)

这些函数可以帮助您更好地了解模型的表现,并确定可能需要什么来改进结果。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8113431.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存