Чи можна за допомогою пакету caret отримати матриці плутанини для конкретних порогових значень?


13

Я отримав модель логістичної регресії (через train) для бінарного відповіді, і я отримав логістичну матрицю сплутаності через confusionMatrixв caret. Це дає мені матрицю плутанини логістичної моделі, хоча я не впевнений, який поріг використовується для її отримання. Як отримати матрицю плутанини для конкретних порогових значень, використовуючи confusionMatrixв caret?


У мене немає відповіді, але часто такі питання відповідають у файлі довідки. Якщо це не вдається, ви можете подивитися на вихідний код. Ви можете надрукувати джерело на консолі, ввівши confusionmatrixбез дужок.
shadowtalker

Не зовсім зрозуміло, що саме ви зробили. Ви викликали glmфункцію з statsпакета і передавали її результат confusionMatrix? Я не знав, що хтось може це зробити, і прочитавши посібник, це зовсім не ясно, можна взагалі. Або ти predictщось робив ? Короткий приклад допоможе.
Калімо

1
@Calimo Я використовував цю trainфункцію, caretщоб відповідати моделі, яка дозволяє мені вказати її як glm з двочленним сімейством. Потім я використав predictфункцію на об'єкті, створеному через train.
Чорне молоко

Відповіді:


11

Більшість моделей класифікації в R створюють як передбачення класу, так і ймовірності для кожного класу. Для двійкових даних майже в кожному випадку передбачення класів базується на 50% -й ймовірності відключення.

glmте ж саме. З caret, використання predict(object, newdata)дає вам передбачуваний клас і predict(object, new data, type = "prob")надасть вам імовірності, характерні для класу (коли objectпороджується train).

Ви можете робити інакше, визначивши власну модель та застосувавши все, що вам потрібно. На caret веб-сайті також є приклад, який використовує перекомпонування для оптимізації обмеження ймовірності.

тл; д-р

confusionMatrix використовує передбачувані класи і, таким чином, 50% відхилення ймовірності

Макс


14

Існує досить простий спосіб, якщо припустити 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)

Очевидно, ви можете встановити поріг у тому, що ви хочете спробувати, або вибрати "найкраще", де найкраще означає найвищу комбіновану специфічність та чутливість:

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

Переглянувши приклад, який Макс розмістив, я не впевнений, чи є якісь статистичні нюанси, які роблять мій підхід менш бажаним.


У вихідному сюжеті rocCurve, що означають три значення? наприклад, на моїх даних там написано 0,289 (0,853, 0,831). Чи означає 0,289 найкращий поріг, який слід використовувати для демаркації бінарного результату? тобто кожен випадок із прогнозованою ймовірністю> 0,289 буде кодований "1", а кожен випадок із передбачуваною ймовірністю <0,289 буде кодований "0", а не 0,5 порогу за замовчуванням caretпакета?
копія

2
так, це точно так, а інші два значення в дужках - це чутливість та специфічність (якщо чесно, я забуваю, що це таке)
efh0888

2
Крім того, з тих пір я зрозумів, що ви можете витягнути його з кривої roc, використовуючи rocCurve$thresholds[which(rocCurve$sensitivities + rocCurve$specificities == max(rocCurve$sensitivities + rocCurve$specificities))]що також дає вам можливість зважувати їх по-різному, якщо хочете ... Останнє, що потрібно відзначити, це те, що реально ви, ймовірно, хочете налаштувати поріг (наприклад, ви б з будь-якою гіперпараметром моделі), як описує тут Макс .
efh0888
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.