оптимизация auc против logloss в задачах двоичной классификации


12

Я выполняю задачу бинарной классификации, где вероятность исхода довольно низкая (около 3%). Я пытаюсь решить, следует ли оптимизировать AUC или потерю журнала. Насколько я понял, AUC максимизирует способность модели различать классы, в то время как потери в журнале штрафуют расхождение между фактической и оценочной вероятностями. В моей задаче крайне важно откалибровать точность измерений. Поэтому я бы выбрал logloss, но мне интересно, должна ли лучшая модель потери логарифма также быть лучшими моделями AUC / GINI.

Ответы:


12

Как вы упомянули, AUC является статистикой рангов (т. Е. Инвариант масштаба), а потери в журналах являются статистикой калибровки. Можно тривиально построить модель, которая имеет тот же AUC, но не в состоянии минимизировать потери журнала по сравнению с какой-либо другой моделью путем масштабирования прогнозируемых значений. Рассматривать:

auc <-  function(prediction, actual) {
  mann_whit <- wilcox.test(prediction~actual)$statistic
  1 - mann_whit / (sum(actual)*as.double(sum(!actual)))
}

log_loss <- function (prediction, actual) {
  -1/length(prediction) * sum(actual * log(prediction) + (1-actual) * log(1-prediction))
}

sampled_data <- function(effect_size, positive_prior = .03, n_obs = 5e3) {
  y <- rbinom(n_obs, size = 1, prob = positive_prior)
  data.frame( y = y,
              x1 =rnorm(n_obs, mean = ifelse(y==1, effect_size, 0)))
}

train_data <- sampled_data(4)
m1 <- glm(y~x1, data = train_data, family = 'binomial')
m2 <- m1
m2$coefficients[2] <- 2 * m2$coefficients[2]

m1_predictions <- predict(m1, newdata = train_data, type= 'response')
m2_predictions <- predict(m2, newdata = train_data, type= 'response')

auc(m1_predictions, train_data$y)
#0.9925867 
auc(m2_predictions, train_data$y)
#0.9925867 

log_loss(m1_predictions, train_data$y)
#0.01985058
log_loss(m2_predictions, train_data$y)
#0.2355433

Таким образом, мы не можем сказать, что модель, максимизирующая AUC, означает минимальные потери в журнале. Соответствует ли модель, минимизирующая потери журнала, максимальному AUC, будет в значительной степени зависеть от контекста; отделимость классов, смещение модели и т. д. На практике можно рассматривать слабые отношения, но в целом это просто разные цели. Рассмотрим следующий пример, который увеличивает разделимость классов (размер эффекта нашего предиктора):

for (effect_size in 1:7) {
  results <- dplyr::bind_rows(lapply(1:100, function(trial) {
                                    train_data <- sampled_data(effect_size)
                                    m <- glm(y~x1, data = train_data, family = 'binomial')
                                    predictions <- predict(m, type = 'response')
                                    list(auc = auc(predictions, train_data$y),
                                         log_loss = log_loss(predictions, train_data$y),
                                         effect_size = effect_size)
                                  }))
  plot(results$auc, results$log_loss, main = paste("Effect size =", effect_size))
  readline()
}

effect_1

введите описание изображения здесь


Очень информативный ответ. В вашем ответе есть два прогноза, с тем же AUC, но очень разные потери журнала. Итак, я подхожу к этому вопросу: я подготовил модель для оптимизации AUC. Но позже я понял, что мне нужно идти на потерю журнала. Я не могу позволить себе переобучить модель для потери журнала (что должно быть идеальным случаем). Могу ли я применить любое преобразование к прогнозам, чтобы оно имело лучшую потерю в журнале. (Потери логарифма, рассмотренные здесь, имеют двоичное значение, вероятность ссылки равна 1 или 0).
Раджеш Дачираю

1
Что оценивает ваша модель? Потеря логарифма имеет смысл, только если вы создаете апостериорные вероятности, что маловероятно для оптимизированной модели AUC. Статистика ранжирования, такая как AUC, учитывает только относительное упорядочение прогнозов, поэтому величина разрывов между прогнозами не имеет значения; ясно, что это не относится к вероятностям. Любое масштабирование, которое вы выполняете для своих оптимизированных прогнозов AUC, должно решить эту проблему. Кроме того, это касается только калибровки ваших прогнозов в направлении разумной апостериорной оценки, а не глобальной минимизации LL, как обрисовано в общих чертах в этом посте.
Хол

1
Возможно, вас заинтересует масштабирование Платта в качестве отправной точки.
Хол

Я понимаю, что это не глобально. Я просто хочу настроить преобразование, которое может иметь параметр, а затем поиграть с ним.
Раджеш Дачираджу

1

Для несбалансированных меток область под кривой точного отзыва предпочтительнее, чем AUC ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ или документы Python Scikit-Learn )

Кроме того, если ваша цель - максимизировать точность, вы можете рассмотреть возможность перекрестной проверки, чтобы выбрать лучшую модель (алгоритм + гиперпараметры), используя «точность» в качестве показателя производительности.


2
Здесь я проголосовал по нескольким причинам. 1) Вы должны указать источник или причину вашего первого утверждения. 2) Как именно вы оптимизируете для точности? Разве это не создаст вырожденную модель?
Мэтью Друри

2
Хорошо, спасибо, что помог мне сделать лучший ответ. Я добавил 2 ссылки. и как вы оптимизируете для точности? как и любой другой показатель. Вы просто указываете «точность» в качестве функции оценки, например, в scikit-learn. Точность - это метрика, подобная точности, AUC и т. Д.
Пол

Ах, конечно. Но я думаю, что когда люди читают «оптимизировать», они предполагают, что это происходит во время обучения вашей модели. Я думаю, что sklearn делает это довольно неправильно, так как он использует фиксированный порог классификации, и вы должны действительно настроить его с перекрестной проверкой.
Мэтью Друри

1
Да, теперь я вижу, как «оптимизация» может сбивать с толку. Не уверен, как ОП имел в виду это. Для меня это как вы говорите: настраивайте гиперпараметры с помощью CV, чтобы обеспечить максимальную точность. И я думаю, что именно так вы применяете это и в sklearn.
Пол

Конечно, я думаю, что ваш ответ будет улучшен, если вы добавите это разъяснение. Немного не по теме, но я на самом деле думаю, что sklearn довольно слабо поддерживает это, так как он настраивается на основе фиксированного порога классификации, что, я бы сказал, довольно плохая практика.
Мэтью Друри
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.