問題はあなたの例にあり、とがゼロになる可能性があるため、ゼロで除算するため、精度が未定義になります。このため、PRカーブには1つの値のポイントしか含まれていないため、例では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曲線の違いをさらに理解するには、これら2つの予測リストを比較します。すべてゼロを予測し、1を1と予測する場合を考えますが、ゼロ(score1)でなければなりません。これはうまく機能せず、ゼロになるはずの1を予測する1つのオブジェクトを除いて、どこでも0を予測します。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
AUCがスコア1とスコア2の間でほとんど変化しないことを確認します。ただし、PR曲線の下の領域は大きく異なります。それはscore1よりscore2にはるかに多く報酬を与えます。これは、異常値の検出により適していることを示しています。異常値の検出は、AUCよりもはるかに効果的です。外れ値の検出の場合、score2はより正確に検出したい1を予測するので、score1は0の1を予測し、外れ値をキャッチしないため、はるかに優先します。
一般に、AUCは、さまざまな事前分布に対して予測がどの程度うまく機能するかについてのアイデアを提供するためにより有益です。したがって、AUCは、さまざまな数の1と0に対して分類子がどの程度うまく機能するかを特徴付けます。
PR曲線は、考慮されている現在のクラスの不均衡に対してそれがどのように機能するかをよりよく示しています。したがって、PR曲線の方が興味深いです。データセットには0よりも1が少ないことが考慮されます。外れ値の検出に関心がある場合にのみこのケースに関心があるので、PRカーブはより有益です。
AUCは、1がさらに多い場合に予測がどのように行われるかを特徴付けます。
詳細については、次も参照してください。
https://www.quora.com/What-is-Precision-Recall-PR-curve
ROC対精度および再現率曲線
最後に、ROC / PR曲線を計算する方法に興味があるかもしれません。ROC曲線の詳細な説明は次のとおりです。
http://blogs.sas.com/content/iml/2011/07/29/computing-an-roc-curve-from-basic-principles.html