Una volta che hai le probabilità previste, spetta a te quale soglia desideri utilizzare. Puoi scegliere la soglia per ottimizzare la sensibilità, la specificità o qualsiasi altra misura la più importante nel contesto dell'applicazione (alcune informazioni aggiuntive sarebbero utili qui per una risposta più specifica). Potresti voler esaminare le curve ROC e altre misure relative alla classificazione ottimale.
Modifica: per chiarire un po 'questa risposta, ho intenzione di fare un esempio. La vera risposta è che il taglio ottimale dipende da quali proprietà del classificatore sono importanti nel contesto dell'applicazione. Sia il vero valore per l'osservazione e sia la classe prevista. Alcune misure comuni di prestazione sonoYiiY^i
(1) Sensibilità: - la proporzione di '1 che sono correttamente identificati come tali.P(Y^i=1|Yi=1)
(2) Specificità: - la proporzione di '0 che sono correttamente identificati come taliP(Y^i=0|Yi=0)
(3) Tasso di classificazione (corretto): - la proporzione di previsioni corrette.P(Yi=Y^i)
(1) è anche chiamato True Positive Rate, (2) è anche chiamato True Negative Rate.
Ad esempio, se il tuo classificatore mirava a valutare un test diagnostico per una malattia grave che ha una cura relativamente sicura, la sensibilità è molto più importante della specificità. In un altro caso, se la malattia fosse relativamente minore e il trattamento fosse rischioso, la specificità sarebbe più importante da controllare. Per problemi di classificazione generale, è considerato "buono" ottimizzare congiuntamente la sensibilità e le specifiche - ad esempio, è possibile utilizzare il classificatore che minimizza la loro distanza euclidea dal punto :(1,1)
δ=[P(Yi=1|Y^i=1)−1]2+[P(Yi=0|Y^i=0)−1]2−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√
δ potrebbe essere ponderato o modificato in un altro modo per riflettere una misura più ragionevole di distanza da nel contesto dell'applicazione - la distanza euclidea da (1,1) è stata scelta qui arbitrariamente a scopo illustrativo. In ogni caso, tutte e quattro queste misure potrebbero essere più appropriate, a seconda dell'applicazione.(1,1)
Di seguito è riportato un esempio simulato che utilizza la previsione da un modello di regressione logistica per classificare. Il cutoff è vario per vedere quale cutoff fornisce il classificatore "migliore" in ciascuna di queste tre misure. In questo esempio i dati provengono da un modello di regressione logistica con tre predittori (vedere il codice R sotto il diagramma). Come puoi vedere da questo esempio, il taglio "ottimale" dipende da quale di queste misure è più importante - dipende interamente dall'applicazione.
Modifica 2: e , il valore predittivo positivo e il valore predittivo negativo (notare che NON sono gli stessi come sensibilità e specificità) possono anche essere utili misure di prestazione.P(Yi=1|Y^i=1)P(Yi=0|Y^i=0)
# data y simulated from a logistic regression model
# with with three predictors, n=10000
x = matrix(rnorm(30000),10000,3)
lp = 0 + x[,1] - 1.42*x[2] + .67*x[,3] + 1.1*x[,1]*x[,2] - 1.5*x[,1]*x[,3] +2.2*x[,2]*x[,3] + x[,1]*x[,2]*x[,3]
p = 1/(1+exp(-lp))
y = runif(10000)<p
# fit a logistic regression model
mod = glm(y~x[,1]*x[,2]*x[,3],family="binomial")
# using a cutoff of cut, calculate sensitivity, specificity, and classification rate
perf = function(cut, mod, y)
{
yhat = (mod$fit>cut)
w = which(y==1)
sensitivity = mean( yhat[w] == 1 )
specificity = mean( yhat[-w] == 0 )
c.rate = mean( y==yhat )
d = cbind(sensitivity,specificity)-c(1,1)
d = sqrt( d[1]^2 + d[2]^2 )
out = t(as.matrix(c(sensitivity, specificity, c.rate,d)))
colnames(out) = c("sensitivity", "specificity", "c.rate", "distance")
return(out)
}
s = seq(.01,.99,length=1000)
OUT = matrix(0,1000,4)
for(i in 1:1000) OUT[i,]=perf(s[i],mod,y)
plot(s,OUT[,1],xlab="Cutoff",ylab="Value",cex.lab=1.5,cex.axis=1.5,ylim=c(0,1),type="l",lwd=2,axes=FALSE,col=2)
axis(1,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
axis(2,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
lines(s,OUT[,2],col="darkgreen",lwd=2)
lines(s,OUT[,3],col=4,lwd=2)
lines(s,OUT[,4],col="darkred",lwd=2)
box()
legend(0,.25,col=c(2,"darkgreen",4,"darkred"),lwd=c(2,2,2,2),c("Sensitivity","Specificity","Classification Rate","Distance"))