O problema está no seu exemplo: é possível ter zero e zero ; portanto, a precisão fica indefinida porque dividimos por zero. Por esse motivo, a curva PR contém apenas pontos para um valor e, portanto, a área sob a curva PR se torna zero no seu exemplo.tpfpprec=tp/(tp+fp)x
Você pode ver isso plotando a curva PR:
[X,Y,T,PR] = perfcurve(label,score,1, 'xCrit', 'reca', 'yCrit', 'prec') % PR = 0
figure
scatter(X,Y)
xlabel('recall')
ylabel('precision')
Portanto, traçar uma curva de relações públicas não funciona realmente bem quando todas as suas pontuações são iguais.
Para obter mais insights entre a diferença da curva PR e a curva ROC, compare essas duas listas de previsão. Consideramos o caso em que prevemos todos os zeros e prevemos um 1, mas deve ser zero (escore1). Este não funciona muito bem, prevê 0 em todos os lugares, exceto por um objeto em que prevê 1 onde deve ser zero. Consideramos outro caso, onde prevemos um 1 corretamente, e o restante classificamos como 0. Aqui, prevemos 1 um corretamente, e o restante classificamos como 0. Comparamos a área sob a curva PR e a área sob o 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
Observe que a AUC varia pouco entre a pontuação1 e a pontuação2. No entanto, a área sob a curva PR é significativamente diferente. Recompensa score2 muito mais que score1. Isso indica que é mais adequado para a detecção de valores extremos: recompensa a detecção de valores extremos muito mais do que a AUC. No caso de detecção de valores extremos, você prefere a pontuação2 muito mais, pois ela prediz o 1 que você deseja detectar corretamente, enquanto a pontuação1 prediz um 1 para um zero e nunca captura nenhum valor externo.
Em geral, a CUA é mais informativa para dar uma idéia de como suas previsões funcionam para vários antecedentes anteriores. Assim, a AUC caracteriza como o classificador funciona para um número variável de unidades e zeros.
As curvas de RP indicam mais bem o desempenho do desequilíbrio da classe atual considerado. Portanto, a curva PR é mais interessante para você: leva em consideração que existem poucos 1s no seu conjunto de dados que 0s. Como você só está interessado nesse caso quando está interessado em detectar valores extremos, a curva PR é mais informativa.
Embora a AUC caracterize como suas previsões seriam se também houvesse muito mais 1s.
Para mais informações, consulte também:
https://www.quora.com/What-is-Precision-Recall-PR-curve
ROC vs curvas de precisão e recuperação
Finalmente, você pode estar interessado em como calcular uma curva ROC / PR, uma explicação detalhada é dada aqui para curvas ROC:
http://blogs.sas.com/content/iml/2011/07/29/computing-an-roc-curve-from-basic-principles.html