R: Пакет Caret: Brier Score - PullRequest
       55

R: Пакет Caret: Brier Score

1 голос
/ 03 апреля 2020

Я хочу выполнить регрессию c с помощью функции train() из пакета caret. Моя модель выглядит примерно так:

model <- train(Y ~.,
  data = train_data,
  family = "binomial",
  method = "glmnet")

С помощью полученной модели я хочу сделать прогнозы:

pred <- predict(model, newdata = test_data, s = "lambda.min", type = "prob")

Теперь я хочу оценить, насколько хорошо предсказания модели сравниваются с фактическими данными испытаний. Для этого я знаю, как получить RO C и AU C. Однако я также заинтересован в получении более яркой оценки. Формула для оценки Brier почти идентична MSE. Проблема, с которой я сталкиваюсь, заключается в том, что аргумент type в предикте допускает только «prob» (или «класс», который меня не интересует), что дает вероятность того, что один прогноз будет ОДИН (например, 0,64), и дополняющий вероятность быть нулем (например, 0,37). Однако для оценки Бриера мне нужна одна оценка вероятности для каждого прогноза, которая содержит информацию об обоих (например, значение выше 0,5 будет означать 1, а значение ниже 0,5 будет означать 0). Я не нашел никакого решения для получения Brier Score в пакете caret. Мне известно, что с пакетом cv.glmnet функция predict допускает аргумент «ответ», который решит мою проблему. Однако для личных предпочтений я бы хотел остаться с пакетом caret. Спасибо за помощь!

1 Ответ

2 голосов
/ 03 апреля 2020

Если мы go по вики-определению оценки Бриера:

Наиболее распространенная формулировка оценки Бриера:

forumla

где f_t - это прогнозируемая вероятность, o_t - фактический результат (0 или 1), а N - количество экземпляров прогнозирования.

В R, если ваша метка является фактором, тогда регрессия logisti c всегда будет прогнозироваться относительно 2-го уровня, то есть вы просто вычисляете вероятность и 0/1 относительно нее. Например:

library(caret)
idx = sample(nrow(iris),100)
data = iris
data$Species = factor(ifelse(data$Species=="versicolor","v","o"))
levels(data$Species)
[1] "o" "v"

В этом случае o равно 0, а v равно 1.

train_data = data[idx,]
test_data = data[-idx,]

model <- train(Species ~.,data = train_data,family = "binomial",method = "glmnet")

pred <- predict(model, newdata = test_data)

Таким образом, мы можем увидеть вероятность класса:

head(pred)
          o          v
1 0.8367885 0.16321154
2 0.7970508 0.20294924
3 0.6383656 0.36163437
4 0.9510763 0.04892370
5 0.9370721 0.06292789

Для подсчета очков:

f_t = pred[,2]
o_t = as.numeric(test_data$Species)-1
mean((f_t - o_t)^2)
[1] 0.32
...