Ist es mit dem Caret-Paket möglich, Verwechslungsmatrizen für bestimmte Schwellenwerte zu erhalten?

13

Ich habe ein logistisches Regressionsmodell (Via train) für eine binäre Antwort erhalten, und ich habe die logistische Verwirrungsmatrix über confusionMatrixin erhalten caret. Es gibt mir die logistische Modellverwirrungsmatrix, obwohl ich nicht sicher bin, welcher Schwellenwert verwendet wird, um es zu erhalten. Wie erhalte ich die Verwirrungsmatrix für bestimmte Schwellenwerte mit confusionMatrixin caret?

Schwarze Milch
quelle
Ich habe keine Antwort, aber häufig werden Fragen wie diese in der Hilfedatei beantwortet. Wenn dies fehlschlägt, können Sie sich den Quellcode selbst ansehen. Sie können die Quelle durch Eingabe confusionmatrixohne Klammern auf der Konsole drucken .
Shadowtalker
Es ist nicht ganz klar, was Sie genau getan haben. Haben Sie die glmFunktion aus dem statsPaket aufgerufen und das Ergebnis an übergeben confusionMatrix? Ich wusste nicht, dass man das kann, und wenn man das Handbuch liest, ist es nicht klar, dass man das überhaupt kann. Oder hast du predictwas? Ein kurzes Beispiel würde helfen.
Calimo
1
@Calimo Ich habe die trainFunktion verwendet caret, um das Modell anzupassen. Dadurch kann ich es als glm mit Binomialfamilie angeben. Ich habe dann die predictFunktion auf dem Objekt verwendet, das über generiert wurde train.
Black Milk

Antworten:

10

Die meisten Klassifizierungsmodelle in R erzeugen sowohl eine Klassenvorhersage als auch die Wahrscheinlichkeiten für jede Klasse. In fast allen Fällen basiert die Klassenvorhersage für Binärdaten auf einer 50% igen Wahrscheinlichkeitsgrenze.

glmist dasselbe. Mit caretusing erhalten predict(object, newdata)Sie die vorhergesagte Klasse und erhalten predict(object, new data, type = "prob")klassenspezifische Wahrscheinlichkeiten (wann objectwird generiert von train).

Sie können die Dinge anders machen, indem Sie Ihr eigenes Modell definieren und den gewünschten Cutoff anwenden. Die caret Website enthält auch ein Beispiel , das Resampling verwendet, um die Wahrscheinlichkeitsgrenze zu optimieren.

tl; dr

confusionMatrix Verwendet die vorhergesagten Klassen und somit eine 50% ige Wahrscheinlichkeitsgrenze

Max

topepo
quelle
14

Es gibt einen ziemlich einfachen Weg, vorausgesetzt 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)

Natürlich können Sie den Schwellenwert auf das einstellen, was Sie möchten, oder den "besten" auswählen, wobei "am besten" höchste kombinierte Spezifität und Empfindlichkeit bedeutet:

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")

Nachdem ich mir das Beispiel von Max angesehen habe, bin ich mir nicht sicher, ob es statistische Nuancen gibt, die meinen Ansatz weniger wünschenswert machen.

efh0888
quelle
Was bedeuten die drei Werte im ausgegebenen rocCurve-Diagramm? zB steht auf meinen Daten 0,289 (0,853, 0,831). Bedeutet der Wert 0,289 die beste Schwelle, die zur Abgrenzung des binären Ergebnisses verwendet werden sollte? dh jeder Fall mit einer vorhergesagten Wahrscheinlichkeit> 0,289 würde "1" codiert und jeder Fall mit einer vorhergesagten Wahrscheinlichkeit <0,289 würde "0" codiert, anstatt der 0,5-Standardschwelle des caretPakets?
Coip
2
Ja, das ist genau richtig, und die anderen 2 Werte in Klammern sind Sensibilität und Spezifität (ehrlich gesagt, ich vergesse jedoch, welche welche ist)
efh0888
2
Seitdem habe ich herausgefunden, dass Sie es aus der ROC - Kurve extrahieren können, rocCurve$thresholds[which(rocCurve$sensitivities + rocCurve$specificities == max(rocCurve$sensitivities + rocCurve$specificities))]wodurch Sie die Flexibilität haben, sie unterschiedlich zu gewichten, wenn Sie möchten Sie würden mit jedem Modell hyperparameter), wie Max hier beschreibt .
Efh0888