optimisation auc vs logloss dans les problèmes de classification binaire

12

J'effectue une tâche de classification binaire où la probabilité de résultat est assez faible (environ 3%). J'essaie de décider s'il faut optimiser par AUC ou perte de journal. Autant que j'ai compris, l'AUC maximise la capacité du modèle à discriminer entre les classes tandis que la perte de log pénalise la divergence entre les probabilités réelles et estimées. Dans ma tâche est extrêmement important de calibrer la précision de précision. Je choisirais donc la perte de journal, mais je me demande si le meilleur modèle de perte de journal devrait également être le meilleur modèle AUC / GINI.

Giorgio Spedicato
la source

Réponses:

12

Comme vous le mentionnez, l'ASC est une statistique de rang (c'est-à-dire invariant d'échelle) et la perte de log est une statistique d'étalonnage. On peut construire trivialement un modèle qui a la même AUC mais ne parvient pas à minimiser la perte de journal par rapport à un autre modèle en mettant à l'échelle les valeurs prédites. Considérer:

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

Donc, nous ne pouvons pas dire qu'un modèle maximisant l'AUC signifie une perte de journal minimisée. La question de savoir si un modèle minimisant la perte de log correspond à l'ASC maximisée dépendra fortement du contexte; séparabilité des classes, biais de modèle, etc. En pratique, on peut considérer une relation faible, mais en général ce sont simplement des objectifs différents. Prenons l'exemple suivant qui augmente la séparabilité des classes (taille d'effet de notre prédicteur):

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()
}

effet_1

entrez la description de l'image ici

khol
la source
Réponse très instructive. Dans votre réponse, il y a deux prédictions, avec la même AUC mais une perte de journal très différente. J'en viens donc à cette question: j'ai formé un modèle d'optimisation de l'AUC. Mais plus tard, j'ai réalisé que je devais opter pour la perte de journaux. Je ne peux pas me permettre de recycler le modèle pour la perte de journal (ce qui devrait être le cas idéal). Puis-je appliquer n'importe quelle transformation sur les prédictions, afin qu'elle ait la meilleure perte de journal. (La perte de log considérée ici est une signification binaire, la probabilité de référence est soit 1 soit 0).
Rajesh Dachiraju
1
Qu'est-ce que votre modèle estime? La perte de journal n'a de sens que si vous produisez des probabilités postérieures, ce qui est peu probable pour un modèle optimisé AUC. Les statistiques de classement comme l'AUC ne prennent en compte que l'ordre relatif des prévisions, de sorte que l'amplitude des écarts entre les prévisions n'a pas d'importance; ce n'est clairement pas le cas pour les probabilités. Toute mise à l'échelle que vous effectuez sur vos prévisions optimisées AUC devra résoudre ce problème. En outre, cela ne concerne que l'étalonnage de vos prédictions vers une estimation postérieure raisonnable, et non la minimisation globale de la LL, comme indiqué dans cet article.
khol
1
Vous pourriez être intéressé par la mise à l' échelle de plateaux comme point de départ.
khol
Je comprends que ce n'est pas mondial. Je veux juste configurer une transformation qui pourrait avoir un paramètre, puis jouer avec.
Rajesh Dachiraju
1

Pour les étiquettes déséquilibrées, l'aire sous la courbe de rappel de précision est préférable à l'ASC ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ ou aux documents scikit-learn python )

De plus, si votre objectif est de maximiser la précision, vous pouvez envisager de faire une validation croisée pour sélectionner le meilleur modèle (algorithme + hyperparamètres) en utilisant la «précision» comme mesure de performance.

Paul
la source
2
J'ai rétrogradé pour quelques raisons ici. 1) Vous devez citer une source ou une raison pour votre première déclaration. 2) Comment optimisez-vous exactement la précision? Cela ne créerait-il pas un modèle dégénéré?
Matthew Drury
2
ok merci de m'aider à faire une meilleure réponse. J'ai ajouté 2 références. et comment optimisez-vous la précision? comme toute autre métrique. Vous spécifiez simplement la «précision» comme fonction de notation, par exemple dans scikit-learn. La précision est une métrique comme la précision, l'ASC, etc.
Paul
Ahh, bien sûr. Mais je pense que lorsque les gens liront "Optimiser", ils supposeront que c'est pendant la formation de votre modèle. Je pense que sklearn se trompe, car il utilise un seuil de classification fixe, et vous devriez vraiment le régler avec une validation croisée.
Matthew Drury
1
Oui, je vois maintenant comment "optimiser" peut être déroutant. Je ne sais pas comment OP signifiait cela. Pour moi, c'est comme vous le dites: régler les hyperparamètres via CV pour maximiser la précision. Et je pense que c'est ainsi que vous l'appliquez dans sklearn.
Paul
Bien sûr, je pense que votre réponse serait améliorée ici si vous ajoutiez cette précision. Un peu hors sujet, mais je pense en fait que sklearn est assez faible pour soutenir cela, car il s'accorde sur un seuil de classification fixe, ce qui, selon moi, est une assez mauvaise pratique.
Matthew Drury