Czy za pomocą pakietu Caret można uzyskać macierze pomyłek dla określonych wartości progowych?

13

Otrzymałem model regresji logistycznej (via train) dla odpowiedzi binarnej i uzyskałem macierz dezorientacji logistycznej przez confusionMatrixin caret. Daje mi to macierz dezorientacji modelu logistycznego, choć nie jestem pewien, jakiego progu używa się do jej uzyskania. Jak uzyskać macierz nieporozumień dla określonych wartości progowych za pomocą confusionMatrixin caret?

Czarne Mleko
źródło
Nie mam odpowiedzi, ale często na takie pytania można znaleźć w pliku pomocy. Jeśli to się nie powiedzie, możesz spojrzeć na sam kod źródłowy. Możesz wydrukować źródło na konsoli, pisząc confusionmatrixbez nawiasów.
shadowtalker
Nie jest do końca jasne, co dokładnie zrobiłeś. Czy wywołałeś glmfunkcję z statspakietu i przekazałeś jej wynik confusionMatrix? Nie wiedziałem, że można to zrobić, a czytanie instrukcji nie jest jasne. A może predictcoś zrobiłeś ? Pomocny byłby krótki przykład.
Calimo,
1
@ Calimo Użyłem tej trainfunkcji, caretaby dopasować model, co pozwala mi określić go jako glm w rodzinie dwumianowej. Następnie użyłem predictfunkcji na obiekcie wygenerowanym przez train.
Black Milk

Odpowiedzi:

11

Większość modeli klasyfikacji w R daje zarówno prognozę klasową, jak i prawdopodobieństwo dla każdej klasy. W przypadku danych binarnych prawie w każdym przypadku przewidywanie klasy opiera się na 50% granicy prawdopodobieństwa.

glmJest taki sam. Używając caret, predict(object, newdata)daje przewidywaną klasę i predict(object, new data, type = "prob")daje specyficzne dla klasy prawdopodobieństwa (kiedy objectjest generowane przez train).

Możesz robić różne rzeczy, definiując własny model i stosując dowolne ograniczenie. caret Strona ma również przykładem , który używa resampling do optymalizacji odcięcia prawdopodobieństwa.

tl; dr

confusionMatrix używa przewidywanych klas, a tym samym 50% prawdopodobieństwa odcięcia

Max

topepo
źródło
14

Jest dość prosty sposób, zakładając 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)

Oczywiście możesz ustawić próg na cokolwiek, co chcesz spróbować, lub wybrać „najlepszy”, gdzie najlepszy oznacza najwyższą połączoną specyficzność i czułość:

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

Po zapoznaniu się z zamieszczonym przykładem Maxa nie jestem pewien, czy istnieją jakieś niuanse statystyczne, które sprawiają, że moje podejście jest mniej pożądane.

efh0888
źródło
Co w przedstawionym wykresie rocCurve oznaczają trzy wartości? np. na moich danych mówi 0.289 (0.853, 0.831). Czy 0.289 oznacza najlepszy próg, który należy zastosować przy wyznaczaniu wyniku binarnego? tj. każdy przypadek z przewidywanym prawdopodobieństwem> 0,289 byłby kodowany „1”, a każdy przypadek z przewidywanym prawdopodobieństwem <0,289 byłby kodowany „0”, a nie domyślny próg 0,5 caretpakietu?
Coip
2
tak, to dokładnie prawda, a pozostałe 2 wartości w nawiasach to czułość i specyficzność (szczerze mówiąc, zapominam, która jest która)
efh0888
2
ponadto, od tamtej pory doszedłem do wniosku, że możesz wyodrębnić go z krzywej roc, rocCurve$thresholds[which(rocCurve$sensitivities + rocCurve$specificities == max(rocCurve$sensitivities + rocCurve$specificities))]co również daje ci elastyczność w ważeniu ich inaczej, jeśli chcesz ... ostatnią rzeczą, na którą należy zwrócić uwagę, jest to, że realistycznie, prawdopodobnie chcesz wyregulować próg (jak zrobiłbyś z dowolnym hiperparametrem modelu), jak opisuje tutaj Max .
efh0888