问题在于您的示例可能有零和零,因此精度变得未定义,因为我们除以零。因此,PR 曲线仅包含一个值的点,因此对于您的示例,PR 曲线下的面积为零。tpfpprec=tp/(tp+fp)x
您可以通过绘制 PR 曲线看到这一点:
[X,Y,T,PR] = perfcurve(label,score,1, 'xCrit', 'reca', 'yCrit', 'prec') % PR = 0
figure
scatter(X,Y)
xlabel('recall')
ylabel('precision')
因此,当您的所有分数都相同时,绘制 PR 曲线并不能很好地工作。
为了更深入地了解 PR 曲线和 ROC 曲线的差异,请比较这两个预测列表。我们考虑预测全零并预测一个 1 的情况,但它应该为零(score1)。这个效果不太好,它在任何地方都预测为 0,除了一个对象,它预测 1 应该为零。我们考虑另一种情况,我们正确预测一个 1,其余的我们归类为 0。因此,在这里我们正确预测 1 个,其余的我们归类为 0。我们比较 PR 曲线下的面积和 ROC 下的面积.
outlier = 1;
normal = 0;
% 99% normal data 1% outlier
label = normal*ones(1000,1);
label(1:10) = outlier;
%label = real( rand(1000,1) > 0.99 ); % 99% normal data 1% outlier
score1 = [zeros(999,1);1]; % predict everything as zero, and one mistake
score2 = [1;zeros(999,1)]; % predict everything as zero, and one 1 correct
[X,Y,T,AUC1] = perfcurve(label,score1,1)
% AUC1 = 0.5
[X,Y,T,AUC2] = perfcurve(label,score2,1)
% AUC2 = 0.55
[X,Y,T,PR1] = perfcurve(label,score1,1, 'xCrit', 'reca', 'yCrit', 'prec')
% PR1 = 0.005
[X,Y,T,PR2] = perfcurve(label,score2,1, 'xCrit', 'reca', 'yCrit', 'prec')
% PR2 = 0.4545
观察到 score1 和 score2 之间的 AUC 变化很小。但是,PR 曲线下的面积明显不同。它奖励 score2 比 score1 多得多。这表明它更适合异常值检测:它比 AUC 更能奖励检测异常值。在异常值检测的情况下,您更喜欢 score2,因为它预测您想要正确检测的 1,而 score1 预测 1 表示零并且永远不会捕获任何异常值。
一般来说,AUC 提供的信息更丰富,可以让您了解您的预测对不同先验的效果如何。因此,AUC 表征了分类器对不同数量的 1 和 0 的工作情况。
PR 曲线更好地表明了它在考虑当前类别不平衡时的表现。因此,PR 曲线对您来说更有趣:它考虑到数据集中的 1 比 0 少。因为只有在对异常值检测感兴趣时才对这种情况感兴趣,所以 PR 曲线的信息量更大。
虽然 AUC 描述了如果还有更多的 1,您的预测将如何进行。
有关更多信息,另请参阅:
https://www.quora.com/What-is-Precision-Recall-PR-curve
ROC 与 Precision-and-recall 曲线
最后,您可能对如何计算 ROC / PR 曲线感兴趣,这里给出了 ROC 曲线的详细说明:
http://blogs.sas.com/content/iml/2011/07/29/computing-an-roc-curve-from-basic-principles.html