La "curva di base" in un diagramma della curva PR è una linea orizzontale con altezza pari al numero di esempi positivi rispetto al numero totale di dati di allenamento N , vale a dire. la proporzione di esempi positivi nei nostri dati ( PPNPN ).
OK, perché è così? Supponiamo che abbiamo un "spazzatura classificatore" . C J restituisce un casuale probabilità p i al i -esimo campione esempio y i per essere in classe A . Per comodità, dire p i ∼ U [ 0 , 1 ] . L'implicazione diretta di questa assegnazione di classe casuale è che C J avrà una precisione (prevista) pari alla proporzione di esempi positivi nei nostri dati. È solo naturale; qualsiasi sottocampione totalmente casuale dei nostri dati avrà {CJCJpiiyiApi∼U[0,1]CJesempi correttamente classificati. Questo sarà vero per qualsiasi soglia di probabilitàqpotremmo usare come un confine di decisione per le probabilità di appartenenza alla classe restituiti daCJ. (qindica un valore in[0,1] incui i valori di probabilità maggiori o uguali aqsono classificati in classeA.) D'altra parte, la prestazione di richiamo diCJè (in attesa) uguale aqsepi∼U[0,1]qE{PN}qCJq[0,1]qACJqpi∼U[0,1] . A qualsiasi data sogliaq sceglieremo (circa) dei nostri dati totali che successivamente conterranno (approssimativamente) ( 100 ( 1 - q ) ) % del numero totale di istanze di classe A nel campione. Da qui la linea orizzontale che abbiamo menzionato all'inizio! Per ogni valore di richiamo (valori x nel grafico PR) il valore di precisione corrispondente (valori y nel grafico PR) è uguale a P(100(1−q))%(100(1−q))%AxyPN .
Una breve nota a margine: la soglia non è generalmente uguale a 1 meno il richiamo previsto. Ciò accade nel caso di un C J sopra menzionato solo a causa della distribuzione uniforme casuale dei risultati di C J ; per una diversa distribuzione (es. p i ∼ B ( 2 , 5 ) ) questa relazione di identità approssimativa tra q e richiamo non regge; U [ 0 , 1 ] è stato usato perché è il più facile da capire e visualizzare mentalmente. Per una diversa distribuzione casuale in [ 0qCJCJpi∼B(2,5)qU[0,1] il profilo PR di C J non cambierà comunque. Solo il posizionamento dei valori PR per determinativalori q cambierà.[0,1]CJq
Ora per quanto riguarda un classificatore perfetto , si vorrebbe dire un classificatore che restituisce probabilità 1 all'istanza del campione y io sono di classe A se y i è effettivamente in classe A e inoltre C P restituisce probabilità 0 se y i non è un membro di classe A . Ciò implica che per qualsiasi soglia q avremo una 100 %CP1yiAyiACP0yiAq100% precisione del (cioè in termini di grafico otteniamo una linea che inizia con una precisione del ). L'unico punto non ne otteniamo 100100%100%la precisione è . Per q = 0 , la precisione scende alla proporzione di esempi positivi nei nostri dati ( Pq=0q=0 ) come (follemente?) Si classificano punti anche con0probabilità di essere di classeAcome essere in classeA. Il grafico PR diCPha solo due possibili valori per la sua precisione,1ePPN0AACP1PN .
OK e un po 'di codice R per vederlo in prima persona con un esempio in cui i valori positivi corrispondono al del nostro campione. Si noti che eseguiamo un "soft-assegnato" della categoria di classe, nel senso che il valore di probabilità associato a ciascun punto quantifica alla nostra fiducia che questo punto è di classe A40%A .
rm(list= ls())
library(PRROC)
N = 40000
set.seed(444)
propOfPos = 0.40
trueLabels = rbinom(N,1,propOfPos)
randomProbsB = rbeta(n = N, 2, 5)
randomProbsU = runif(n = N)
# Junk classifier with beta distribution random results
pr1B <- pr.curve(scores.class0 = randomProbsB[trueLabels == 1],
scores.class1 = randomProbsB[trueLabels == 0], curve = TRUE)
# Junk classifier with uniformly distribution random results
pr1U <- pr.curve(scores.class0 = randomProbsU[trueLabels == 1],
scores.class1 = randomProbsU[trueLabels == 0], curve = TRUE)
# Perfect classifier with prob. 1 for positives and prob. 0 for negatives.
pr2 <- pr.curve(scores.class0 = rep(1, times= N*propOfPos),
scores.class1 = rep(0, times = N*(1-propOfPos)), curve = TRUE)
par(mfrow=c(1,3))
plot(pr1U, main ='"Junk" classifier (Unif(0,1))', auc.main= FALSE,
legend=FALSE, col='red', panel.first= grid(), cex.main = 1.5);
pcord = pr1U$curve[ which.min( abs(pr1U$curve[,3]- 0.50)),c(1,2)];
points( pcord[1], pcord[2], col='black', cex= 2, pch = 1)
pcord = pr1U$curve[ which.min( abs(pr1U$curve[,3]- 0.20)),c(1,2)];
points( pcord[1], pcord[2], col='black', cex= 2, pch = 17)
plot(pr1B, main ='"Junk" classifier (Beta(2,5))', auc.main= FALSE,
legend=FALSE, col='red', panel.first= grid(), cex.main = 1.5);
pcord = pr1B$curve[ which.min( abs(pr1B$curve[,3]- 0.50)),c(1,2)];
points( pcord[1], pcord[2], col='black', cex= 2, pch = 1)
pcord = pr1B$curve[ which.min( abs(pr1B$curve[,3]- 0.20)),c(1,2)];
points( pcord[1], pcord[2], col='black', cex= 2, pch = 17)
plot(pr2, main = '"Perfect" classifier', auc.main= FALSE,
legend=FALSE, col='red', panel.first= grid(), cex.main = 1.5);
dove i cerchi neri e i triangoli indicano rispettivamente e q = 0,20 nei primi due grafici. Vediamo immediatamente che i classificatori "junk" vanno rapidamente a una precisione pari a Pq=0.50q=0.20PN1≈0.401
Realisticamente il grafico PR di un classificatore perfetto è un po 'inutile perché non si può avere 0
Per la cronaca, ci sono già state delle ottime risposte in CV riguardo all'utilità delle curve PR: qui , qui e qui . Basta leggerli attentamente per offrire una buona comprensione generale delle curve PR.