otimizando auc vs logloss em problemas de classificação binária


12

Estou executando uma tarefa de classificação binária em que a probabilidade de resultado é baixa (cerca de 3%). Estou tentando decidir se deve otimizar por AUC ou perda de log. Tanto quanto eu entendi, a AUC maximiza a capacidade do modelo de discriminar entre classes, enquanto o logloss penaliza a divergência entre probabilidades reais e estimadas. Na minha tarefa é extremamente importante calibrar a precisão da precisão. Então, eu escolheria o logloss, mas gostaria de saber se o melhor modelo de perda de log também deveria ser o melhor modelo de AUC / GINI.

Respostas:


12

Como você mencionou, a AUC é uma estatística de classificação (ou seja, invariável na escala) e a perda de log é uma estatística de calibração. Pode-se construir trivialmente um modelo que tenha a mesma AUC, mas falhe em minimizar a perda de log em algum outro modelo escalando os valores previstos. 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

Portanto, não podemos dizer que um modelo que maximize a AUC significa perda de log minimizada. Se um modelo que minimiza a perda de log corresponde à AUC maximizada dependerá muito do contexto; separabilidade de classe, viés de modelo, etc. Na prática, pode-se considerar um relacionamento fraco, mas em geral eles são simplesmente objetivos diferentes. Considere o exemplo a seguir, que aumenta a separabilidade da classe (tamanho do efeito do nosso preditor):

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

insira a descrição da imagem aqui


Resposta muito informativa. Em sua resposta, há duas previsões, com a mesma AUC, mas com perdas de log muito diferentes. Então, chego a esta pergunta: treinei um modelo para otimizar a AUC. Mais tarde, porém, percebi que precisava perder dados de log. Não posso me dar ao luxo de treinar novamente o modelo para perda de log (que deve ser o caso ideal). Posso aplicar qualquer transformação nas previsões, para que ela tenha a melhor perda de log. (A perda de log considerada aqui é um significado binário, a probabilidade de referência é 1 ou 0).
Rajesh Dachiraju

1
O que o seu modelo estima? A perda de logs só faz sentido se você estiver produzindo probabilidades posteriores, o que é improvável para um modelo otimizado da AUC. Estatísticas de classificação como a AUC consideram apenas a ordenação relativa das previsões; portanto, a magnitude das lacunas entre as previsões é irrelevante; claramente esse não é o caso de probabilidades. Qualquer escala realizada nas previsões otimizadas da AUC terá que resolver esse problema. Além disso, isso aborda apenas a calibração de suas previsões em direção a uma estimativa posterior razoável, não à minimização global de LL, conforme descrito neste post.
khol

1
Você pode estar interessado em escala de platt como ponto de partida.
khol

Eu entendo que não é global. Eu só quero configurar uma transformação que possa ter um parâmetro e depois brincar com ele.
Rajesh Dachiraju

1

Para rótulos desequilibrados, a área sob a curva de precisão de recuperação é preferível à AUC ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ ou documentos do python scikit-learn )

Além disso, se seu objetivo é maximizar a precisão, considere fazer a validação cruzada para selecionar o melhor modelo (algoritmo + hiperparâmetros) usando "precision" como métrica de desempenho.


2
Eu votei por algumas razões aqui. 1) Você deve citar uma fonte ou um motivo para sua primeira declaração. 2) Como exatamente você otimiza a precisão? Isso não criaria um modelo degenerado?
Matthew Drury

2
ok obrigado por me ajudar a dar uma resposta melhor. Eu adicionei 2 referências. e como você otimiza a precisão? como qualquer outra métrica. Você apenas especifica "precisão" como sua função de pontuação, por exemplo, no scikit-learn. Precisão é uma métrica como precisão, AUC, etc #
Paul

Ahh, claro. Mas acho que quando as pessoas lêem "otimizar", elas assumem que é durante o treinamento do seu modelo. Acho que o sklearn entende isso muito errado, pois ele usa um limite de classificação fixo, e você realmente deve estar ajustando isso com a validação cruzada.
Matthew Drury

1
Sim, agora vejo como "otimizar" pode ser confuso. Não sei como OP significava isso. Para mim, é como você diz: ajuste os hiperparâmetros via CV para que a precisão seja maximizada. E acho que é assim que você o aplica no sklearn também.
Paul

Claro, acho que sua resposta seria melhorada aqui se você adicionasse esse esclarecimento. Um tópico um pouco desconcertante, mas acho que o sklearn é muito fraco em apoiar isso, pois ele é sintonizado com base em um limite de classificação fixo, o que eu argumentaria ser uma prática muito ruim.
Matthew Drury
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.