22 votos

optimización de auc frente a logloss en problemas de clasificación binaria

Estoy realizando una tarea de clasificación binaria en la que la probabilidad de resultado es bastante baja (en torno al 3%). Estoy tratando de decidir si optimizar por AUC o log-loss. Según tengo entendido, el AUC maximiza la capacidad del modelo para discriminar entre clases, mientras que el log-loss penaliza la divergencia entre las probabilidades reales y las estimadas. En mi tarea es extremadamente importante calibrar la precisión. Así que elegiría logloss, pero me pregunto si el mejor modelo log-loss debería ser también el mejor modelo AUC / GINI.

15voto

Devin Crossman Puntos 146

Como menciona, el AUC es un estadístico de rango (es decir, invariante de la escala) y la pérdida logarítmica es un estadístico de calibración. Se puede construir trivialmente un modelo que tenga el mismo AUC pero que no consiga minimizar la pérdida logarítmica con respecto a otro modelo escalando los valores predichos. Consideremos:

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

Por lo tanto, no podemos decir que un modelo que maximiza el AUC significa que minimiza la pérdida logarítmica. Que un modelo que minimice la pérdida logarítmica se corresponda con un AUC maximizado dependerá en gran medida del contexto; separabilidad de clases, sesgo del modelo, etc. En la práctica, se podría considerar que existe una relación débil, pero en general se trata simplemente de objetivos diferentes. Consideremos el siguiente ejemplo en el que crece la separabilidad de clases (tamaño del efecto de nuestro predictor):

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

enter image description here

3voto

user2562540 Puntos 13

En el caso de etiquetas desequilibradas, el área bajo la curva de precisión-recuerdo es preferible al AUC ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ o python scikit-learn docs )

Además, si su objetivo es maximizar la precisión, puede considerar realizar una validación cruzada para seleccionar el mejor modelo (algoritmo + hiperparámetros) utilizando la "precisión" como métrica de rendimiento.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X