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

3

如何绘制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)
2个回答

3

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

[X, Y] = perfcurve(labels, scores, posclass)

在这里,labels代表每个样本的真实标签,scores是CNN(或任何其他分类器)的预测结果,而posclass则是您认为是“正类”的类的标签 - 在您的示例中似乎是1perfcurve函数的输出是ROC曲线的(x, y)坐标,因此您可以轻松地绘制它。

plot(X, Y)

要让perfcurve绘制精度-召回曲线而不是ROC曲线,您需要设置函数的可选参数'XCrit''YCrit'。如文档所述,可以使用不同的预定义标准,例如假阳性数('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])

例如(使用随机生成的数据和SVM):

示例精度召回曲线


CNN的预测分数是1000*100大小(100个类别,每个类别10个样本)。因此,在尝试使用perfcurve时,会出现错误“您必须将分数作为浮点值向量传递。”我所做的是对列进行求和以创建分数向量。我这样做是对还是错?如果是错的,请建议我适当的方法。 - user123456789
你只能评估二元分类的精确度和召回率。我通常建议为每个类别绘制一条曲线。为此,您需要将score(:,k)插入到perfcurve中。如果您需要将它们聚合到一个图中,有多种方法可以实现,如此答案所述。最简单的方法是按上面显示的方式为每个类别创建图形并对它们进行平均。 - hbaderts

0

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

[X,Y] = perfcurve(labels,scores,posclass,'xCrit', 'fpr', 'yCrit', 'tpr');

然后生成的接收器操作特性(ROC)曲线是正确的。 {{link1:输入图像描述}}


perfcurve 中没有阈值。 - PyMatFlow
[X,Y,Thres,AUC] = perfcurve(labels,scores,true); “Thres”不是阈值吗? - TariqS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接