optimizando auc vs logloss en problemas de clasificación binaria

12

Estoy realizando una tarea de clasificación binaria donde la probabilidad de resultado es bastante baja (alrededor del 3%). Estoy tratando de decidir si optimizar por AUC o pérdida de registro. Por lo que he entendido, AUC maximiza la capacidad del modelo para discriminar entre clases mientras que el logloss penaliza la divergencia entre las probabilidades reales y estimadas. En mi tarea es extremadamente importante calibrar la precisión exactitud. Por lo tanto, elegiría logloss, pero me pregunto si el mejor modelo de pérdida de registro también debería ser el mejor modelo AUC / GINI.

Giorgio Spedicato
fuente

Respuestas:

12

Como usted menciona, AUC es una estadística de rango (es decir, invariante de escala) y la pérdida de registro es una estadística de calibración. Uno puede construir trivialmente un modelo que tiene el mismo AUC pero no puede minimizar la pérdida de registro con otro modelo al escalar los valores pronosticados. Considerar:

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 AUC significa pérdida de registro minimizada. Si un modelo que minimiza la pérdida de registros corresponde al AUC maximizado dependerá en gran medida del contexto; separabilidad de clase, sesgo de modelo, etc. En la práctica, uno podría considerar una relación débil, pero en general son simplemente objetivos diferentes. Considere el siguiente ejemplo que aumenta la separabilidad de clase (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()
}

efecto_1

ingrese la descripción de la imagen aquí

khol
fuente
Respuesta muy informativa. En su respuesta, hay dos predicciones, con el mismo AUC pero una pérdida de registro muy diferente. Entonces llego a esta pregunta: he entrenado un modelo para optimizar AUC. Pero luego me di cuenta de que necesito ir por la pérdida de registro. No puedo permitirme volver a entrenar el modelo para la pérdida de registro (que debería ser el caso ideal). ¿Puedo aplicar cualquier transformación en las predicciones, para que tenga la mejor pérdida de registro? (La pérdida de registro considerada aquí es el significado binario, la probabilidad de referencia es 1 o 0).
Rajesh Dachiraju
1
¿Qué estima tu modelo? La pérdida de registro solo tiene sentido si está produciendo probabilidades posteriores, lo cual es poco probable para un modelo optimizado de AUC. Las estadísticas de rango como AUC solo consideran el orden relativo de las predicciones, por lo que la magnitud de las brechas entre las predicciones es irrelevante; claramente este no es el caso de las probabilidades. Cualquier escala que realice en sus predicciones optimizadas de AUC tendrá que abordar este problema. Además, esto solo aborda la calibración de sus predicciones hacia una estimación posterior razonable, no la minimización global de LL, como se describe en esta publicación.
khol
1
Puede que le interese escalar platt como punto de partida.
khol
Entiendo que no es global. Solo quiero configurar una transformación que pueda tener un parámetro y luego jugar con él.
Rajesh Dachiraju
1

Para etiquetas desequilibradas, el área bajo la curva de recuperación de precisión es preferible a AUC ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ o documentos de Python scikit-learn )

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

Pablo
fuente
2
Voté por algunas razones aquí. 1) Debe citar una fuente o una razón para su primera declaración. 2) ¿Cómo se optimiza exactamente para la precisión? ¿No crearía eso un modelo degenerado?
Matthew Drury
2
ok gracias por ayudarme a responder mejor. Agregué 2 referencias. ¿Y cómo optimizas la precisión? como cualquier otra métrica Simplemente especifique "precisión" como su función de puntuación, por ejemplo en scikit-learn. La precisión es una métrica como precisión, AUC, etc.
Paul
Ahh, claro. Pero creo que cuando la gente lea "optimizar" van a asumir que es durante la capacitación de su modelo. Creo que sklearn se equivoca bastante, ya que utiliza un umbral de clasificación fijo, y realmente debería ajustarlo con la validación cruzada.
Matthew Drury
1
Sí, ahora veo cómo "optimizar" puede ser confuso. No estoy seguro de cómo lo dijo OP. Para mí, es como usted dice: sintonice los hiperparámetros a través de CV para que se maximice la precisión. Y creo que así es como lo aplicas en sklearn también.
Paul
Claro, creo que su respuesta mejoraría aquí si agregara esa aclaración. Un poco fuera de tema, pero en realidad creo que sklearn es bastante pobre para apoyar eso, ya que se ajusta a un umbral de clasificación fijo, lo que diría que es una práctica bastante mala.
Matthew Drury