如何在MATLAB中绘制CNN的精度和召回率?

如何在MATLAB中绘制CNN的精度和召回率?,matlab,Matlab,如何绘制CNN的精确度和召回曲线? 我已经从CNN获得了分数,想要绘制精确回忆曲线,但我无法得到。 我使用以下公式计算了TP、TN、FP、和FN: idx = (ACTUAL()==1); p = length(ACTUAL(idx)); n = length(ACTUAL(~idx)); N = p+n; tp = sum(ACTUAL(idx)==PREDICTED(idx)); tn = sum(ACTUAL(~idx)==PREDICTED(~idx)); fp =

如何绘制CNN的精确度和召回曲线? 我已经从CNN获得了分数,想要绘制精确回忆曲线,但我无法得到。 我使用以下公式计算了
TP
TN
FP
、和
FN

idx = (ACTUAL()==1);
p = length(ACTUAL(idx));  
n = length(ACTUAL(~idx));   
N = p+n;
tp = sum(ACTUAL(idx)==PREDICTED(idx));   
tn = sum(ACTUAL(~idx)==PREDICTED(~idx));   
fp = n-tn;   
fn = p-tp;
精确性和召回率的计算公式为

precision = tp/(tp+fp)
但是有了这些,我得到了一些不想要的阴谋

我使用以下命令获得了CNN的分数:

[YTest,score]=classify(convnet,TestData)

MATLAB具有在统计和机器学习工具箱中创建ROC曲线和类似性能曲线(例如精度召回曲线)的功能:。 默认情况下,计算ROC曲线。 该函数具有以下语法:

[X, Y] = perfcurve(labels, scores, posclass)
这里,
labels
是每个样本的真实标签,
scores
是CNN(或任何其他分类器)的预测,
posclass
是您假设为“肯定”的类的标签,在您的示例中,它似乎是
1
perfcurve
函数的输出是ROC曲线的
(x,y)
坐标,因此您可以使用

plot(X, Y)
要使
perfcurve
绘制精度调用曲线而不是ROC曲线,必须设置函数的可选参数和参数。如文档中所述,可以使用不同的预定义标准,如误报次数(
'fp'
)、真阳性率(
'tpr'
)、准确性(
'accu'
)等,甚至可以使用自定义函数

通过将
'XCrit'
设置为
'tpr'
(调用)并将
'YCrit'
设置为
'prec'
(精度),创建精度调用曲线:

[X, Y] = perfcurve(labels, scores, posclass, 'XCrit', 'tpr', 'YCrit', 'prec');
plot(X, Y);
xlabel('Recall')
ylabel('Precision')
xlim([0, 1])
ylim([0, 1])
例如(使用随机生成的数据和支持向量机):


hbaderts的答案是正确的,但答案的结尾是错误的

[X,Y] = perfcurve(labels,scores,posclass,'xCrit', 'fpr', 'yCrit', 'tpr');
然后生成的接收机工作特性(ROC)曲线是正确的。

CNN的预测分数为1000*100(100个班,每个班10个样本)。所以,当尝试使用perfcurve时,它给出了一个错误“您必须将分数作为浮点值的向量传递”。我所做的是按列求和来创建分数向量。我做得对还是错?如果错误,请建议我合适的方法。您只能评估二元分类的精度和召回率。我通常会建议为每个类绘制一条曲线。为此,您可以将
分数(:,k)
插入
perfcurve
。如前所述,如果需要将它们聚合到一个绘图中,则有多种方法可以使用。最简单的方法是为如上所示的每个类创建绘图并对其进行平均。perfcurve中没有阈值。[X,Y,Thres,AUC]=perfcurve(标签,分数,true);“Thres”不是阈值吗?