Usando il pacchetto caret è possibile ottenere matrici di confusione per valori soglia specifici?


13

Ho ottenuto un modello di regressione logistica (via train) per una risposta binaria e ho ottenuto la matrice di confusione logistica tramite confusionMatrixin caret. Mi dà la matrice di confusione del modello logistico, anche se non sono sicuro di quale soglia venga utilizzata per ottenerlo. Come posso ottenere la matrice di confusione per valori soglia specifici usando confusionMatrixin caret?


Non ho una risposta, ma spesso domande come questa ricevono risposta nel file di aiuto. Se fallisce, puoi guardare il codice sorgente stesso. È possibile stampare l'origine sulla console digitando confusionmatrix, senza parentesi.
Shadowtalker

Non è abbastanza chiaro cosa hai fatto esattamente. Hai chiamato la glmfunzione dal statspacchetto e hai passato il risultato a confusionMatrix? Non sapevo che si potesse farlo, e leggendo il manuale non è chiaro che si possa affatto. O hai fatto predictqualcosa? Un breve esempio sarebbe d'aiuto.
Calimo,

1
@Calimo Ho usato la trainfunzione caretper adattarmi al modello, il che mi permette di specificarlo come glm con la famiglia binomiale. Ho quindi usato la predictfunzione sull'oggetto generato tramite train.
Black Milk,

Risposte:


10

La maggior parte dei modelli di classificazione in R produce sia una previsione di classe che le probabilità per ogni classe. Per i dati binari, in quasi tutti i casi, la previsione della classe si basa su un limite di probabilità del 50%.

glmè la stessa. Con caret, l'utilizzo predict(object, newdata)ti dà la classe prevista e predict(object, new data, type = "prob")ti darà probabilità specifiche della classe (quando objectè generata da train).

Puoi fare le cose in modo diverso definendo il tuo modello e applicando qualsiasi cutoff che desideri. Il caret sito Web ha anche un esempio che utilizza il ricampionamento per ottimizzare il limite di probabilità.

tl; dr

confusionMatrix utilizza le classi previste e quindi un limite di probabilità del 50%

Max


14

C'è un modo abbastanza semplice, supponendo tune <- train(...):

probsTest <- predict(tune, test, type = "prob")
threshold <- 0.5
pred      <- factor( ifelse(probsTest[, "yes"] > threshold, "yes", "no") )
pred      <- relevel(pred, "yes")   # you may or may not need this; I did
confusionMatrix(pred, test$response)

Ovviamente, puoi impostare la soglia su qualsiasi cosa tu voglia provare o scegliere quella "migliore", dove migliore significa massima specificità e sensibilità combinate:

library(pROC)
probsTrain <- predict(tune, train, type = "prob")
rocCurve   <- roc(response = train$response,
                      predictor = probsTrain[, "yes"],
                      levels = rev(levels(train$response)))
plot(rocCurve, print.thres = "best")

Dopo aver visto l'esempio pubblicato da Max, non sono sicuro che ci siano alcune sfumature statistiche che rendono il mio approccio meno desiderato.


Nel diagramma rocCurve emesso, cosa significano i tre valori? ad es. sui miei dati dice 0,289 (0,853, 0,831). Lo 0,289 indica la soglia migliore che si dovrebbe usare per delimitare l'esito binario? vale a dire che ogni caso con una probabilità prevista> 0,289 sarebbe codificato "1" e ogni caso con una probabilità prevista <0,289 sarebbe codificato "0", anziché la soglia predefinita 0,5 del caretpacchetto?
coip

2
sì, è esattamente giusto, e gli altri 2 valori tra parentesi sono sensibilità e specificità (onestamente, però, dimentico quale è quale)
efh0888

2
inoltre, da allora ho capito che puoi estrarlo dalla curva roc usando ciò rocCurve$thresholds[which(rocCurve$sensitivities + rocCurve$specificities == max(rocCurve$sensitivities + rocCurve$specificities))]che ti dà anche la flessibilità di pesarli in modo diverso se vuoi ... un'ultima cosa da notare è che realisticamente, probabilmente vuoi mettere a punto la soglia (come lo faresti con qualsiasi modello di iperparametro) come Max descrive qui .
efh0888
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.