【问题标题】:How to plot precision and recall of a CNN in MATLAB?如何在 MATLAB 中绘制 CNN 的精度和召回率?
【发布时间】:2018-09-14 23:17:11
【问题描述】:

如何绘制 CNN 的准确率和召回率曲线? 我已经从 CNN 生成了分数,并想绘制精确召回曲线,但我无法得到。 我计算了TPTNFPFN 使用:

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


    【解决方案1】:

    MATLAB 具有在 Statistics and Machine Learning Toolbox 中创建 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 时,它​​会给出错误“您必须将分数作为浮点值的向量传递。”我所做的是按列求和以创建分数向量。我这样做是对还是错?如果错了,请建议我合适的方式。
    • 您只能评估二元分类的精度和召回率。我通常建议为每个班级绘制一条曲线。为此,您可以将score(:,k) 插入perfcurve。如果您需要将它们聚合到一个图中,有多种方法可以,如in this answer 所述。最简单的方法是为每个类创建如上所示的图并对其进行平均。
    【解决方案2】:

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

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

    那么生成的接收器操作特征(ROC)曲线是正确的。

    【讨论】:

    • 性能曲线中没有阈值。
    • [X,Y,Thres,AUC] = perfcurve(labels,scores,true); “Thres”不是阈值吗?
    猜你喜欢
    • 2015-07-22
    • 2021-05-05
    • 2019-09-29
    • 2023-04-07
    • 2019-11-20
    • 2018-02-18
    • 2018-08-16
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多