ottimizzazione di auc vs logloss nei problemi di classificazione binaria


12

Sto eseguendo un'attività di classificazione binaria in cui la probabilità di risultato è abbastanza bassa (intorno al 3%). Sto cercando di decidere se ottimizzare tramite AUC o perdita di log. Per quanto ho capito, l'AUC massimizza la capacità del modello di discriminare tra le classi mentre il logloss penalizza la divergenza tra le probabilità effettive e stimate. Nel mio compito è estremamente importante calibrare l'accuratezza della precisione. Quindi sceglierei logloss, ma mi chiedo se il miglior modello di perdita del log dovrebbe essere anche il miglior modello AUC / GINI.

Risposte:


12

Come accennato, l'AUC è una statistica di rango (cioè invariante di scala) e la perdita di log è una statistica di calibrazione. Uno può banalmente costruire un modello che ha lo stesso AUC ma non riesce a minimizzare la perdita di log rispetto ad altri modelli ridimensionando i valori previsti. Prendere in considerazione:

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

Quindi, non possiamo dire che un modello che massimizza l'AUC significhi una perdita di log ridotta al minimo. Se un modello che minimizza la perdita di log corrisponde all'AUC massimizzata dipenderà fortemente dal contesto; separabilità della classe, distorsione del modello, ecc. In pratica, si potrebbe considerare una relazione debole, ma in generale si tratta semplicemente di obiettivi diversi. Considera l'esempio seguente che aumenta la separabilità della classe (dimensione dell'effetto del nostro predittore):

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

inserisci qui la descrizione dell'immagine


Risposta molto istruttiva. Nella risposta ci sono due previsioni, con la stessa AUC ma una perdita di registro molto diversa. Quindi arrivo a questa domanda: ho formato un modello per l'ottimizzazione dell'AUC. Ma più tardi mi sono reso conto che devo andare per la perdita di registro. Non posso permettermi di riqualificare il modello per la perdita di log (che dovrebbe essere il caso ideale). Posso applicare qualsiasi trasformazione sulle previsioni, in modo che abbia la migliore perdita di registro. (La perdita di registro qui considerata è un significato binario, la probabilità di riferimento è 1 o 0).
Rajesh Dachiraju,

1
Cosa stima il tuo modello? La perdita del log ha senso solo se si producono probabilità posteriori, il che è improbabile per un modello ottimizzato AUC. Le statistiche di classificazione come AUC considerano solo l'ordinamento relativo delle previsioni, quindi l'entità dei divari tra le previsioni è irrilevante; chiaramente questo non è il caso delle probabilità. Qualsiasi ridimensionamento eseguito sulle previsioni ottimizzate per AUC dovrà risolvere questo problema. Inoltre, questo indirizza solo la calibrazione delle tue previsioni verso una ragionevole stima posteriore, non la minimizzazione globale di LL, come indicato in questo post.
khol

1
Potresti essere interessato al ridimensionamento del piatto come punto di partenza.
khol

Capisco che non è globale. Voglio solo impostare una trasformazione che potrebbe avere un parametro e poi giocarci.
Rajesh Dachiraju,

1

Per le etichette non bilanciate, l'area sotto la curva di richiamo di precisione è preferibile all'AUC ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ o python scikit-learn docs )

Inoltre, se il tuo obiettivo è massimizzare la precisione, puoi prendere in considerazione la convalida incrociata per selezionare il modello migliore (algoritmo + iperparametri) usando "precisione" come metrica delle prestazioni.


2
Ho effettuato il downgrade per alcuni motivi qui. 1) Dovresti citare una fonte o un motivo per la tua prima affermazione. 2) Come ottimizzi esattamente per la precisione? Non creerebbe un modello degenerato?
Matthew Drury,

2
ok grazie per avermi aiutato a dare una risposta migliore. Ho aggiunto 2 riferimenti. e come ottimizzi per la precisione? proprio come qualsiasi altra metrica. Devi solo specificare "precisione" come funzione di punteggio, ad esempio in scikit-learn. La precisione è una metrica come accuratezza, AUC, ecc.
Paul,

Ah, certo. Ma penso che quando le persone leggeranno "ottimizzare", supporranno che sia durante l'allenamento del tuo modello. Penso che sklearn si sbagli abbastanza, dal momento che utilizza una soglia di classificazione fissa e dovresti davvero ottimizzarla con la validazione incrociata.
Matthew Drury,

1
Sì, ora vedo come "ottimizzare" possa essere fonte di confusione. Non sono sicuro di cosa significasse OP. Per me, è come dici tu: ottimizza gli iperparametri tramite CV, quindi la precisione è massimizzata. E penso che sia così che lo applichi anche in sklearn.
Paul,

Certo, penso che la tua risposta sarebbe migliorata qui se aggiungessi questo chiarimento. Un po 'fuori tema, ma in realtà penso che sklearn sia abbastanza scarso nel sostenerlo, dal momento che si sintonizza sulla base di una soglia di classificazione fissa, che direi che è una cattiva pratica.
Matthew Drury,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.