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.
Respuestas
¿Demasiados anuncios?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()
}
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.