optymalizacja auc vs logloss w problemach z klasyfikacją binarną

12

Wykonuję binarne zadanie klasyfikacyjne, w którym prawdopodobieństwo wyniku jest dość niskie (około 3%). Próbuję zdecydować, czy przeprowadzić optymalizację na podstawie AUC, czy utraty logów. O ile rozumiem, AUC maksymalizuje zdolność modelu do rozróżnienia między klasami, podczas gdy utrata logiczna karze rozbieżność między rzeczywistymi a szacowanymi prawdopodobieństwami. W moim zadaniu niezwykle ważne jest skalibrowanie dokładności dokładności. Wybrałbym więc logloss, ale zastanawiam się, czy najlepszy model utraty logów powinien być najlepszym modelem AUC / GINI.

Giorgio Spedicato
źródło

Odpowiedzi:

12

Jak wspomniałeś, AUC jest statystyką rang (tj. Niezmiennikiem skali), a utrata logu jest statystyką kalibracji. Można w prosty sposób skonstruować model, który ma tę samą wartość AUC, ale nie zminimalizuje utraty logarytmu względem innego modelu poprzez skalowanie przewidywanych wartości. Rozważać:

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

Nie możemy więc powiedzieć, że model maksymalizujący AUC oznacza zminimalizowaną utratę logów. To, czy model minimalizujący utratę logów odpowiada zmaksymalizowanemu AUC, będzie w dużym stopniu zależał od kontekstu; rozdzielność klas, odchylenie modelu itp. W praktyce można rozważyć słabą zależność, ale generalnie są to po prostu inne cele. Rozważ następujący przykład, który zwiększa separowalność klas (wielkość efektu naszego predyktora):

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

efekt_1

wprowadź opis zdjęcia tutaj

khol
źródło
Bardzo pouczająca odpowiedź. W odpowiedzi masz dwie prognozy, o tej samej AUC, ale bardzo różnej utracie logów. Przechodzę do tego pytania: wytrenowałem model optymalizacji AUC. Ale później zdałem sobie sprawę, że muszę iść na utratę logów. Nie mogę sobie pozwolić na ponowne przeszkolenie modelu pod kątem utraty logów (co powinno być idealnym przypadkiem). Czy mogę zastosować dowolną transformację w prognozach, aby uzyskać najlepszą utratę dziennika. (Uwzględniona tutaj strata logarytmiczna ma znaczenie binarne, prawdopodobieństwo odniesienia wynosi 1 lub 0).
Rajesh Dachiraju,
1
Co ocenia twój model? Utrata logów ma sens tylko wtedy, gdy produkujesz prawdopodobieństwa a posteriori, co jest mało prawdopodobne w przypadku modelu zoptymalizowanego pod kątem AUC. Statystyki rang, takie jak AUC, uwzględniają jedynie względne uporządkowanie prognoz, więc wielkość luk między prognozami jest nieistotna; oczywiście nie dotyczy to prawdopodobieństw. Każde skalowanie, które przeprowadzasz w przypadku zoptymalizowanych prognoz AUC, będzie musiało rozwiązać ten problem. Co więcej, dotyczy to tylko kalibracji twoich prognoz w kierunku rozsądnego oszacowania z tyłu, a nie globalnej minimalizacji LL, jak opisano w tym poście.
khol
1
Punktem początkowym może być skalowanie Platta .
khol
Rozumiem, że to nie jest globalne. Chcę tylko skonfigurować transformację, która może mieć parametr, a następnie pobawić się nim.
Rajesh Dachiraju,
1

W przypadku niezrównoważonych etykiet obszar pod krzywą dokładnego przywołania jest lepszy niż AUC ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ lub python scikit-learn docs )

Ponadto, jeśli Twoim celem jest maksymalizacja precyzji, możesz rozważyć przeprowadzenie weryfikacji krzyżowej, aby wybrać najlepszy model (algorytm + hiperparametry), używając „precyzji” jako miernika wydajności.

Paweł
źródło
2
Głosowałem tutaj z kilku powodów. 1) Powinieneś podać źródło lub powód swojego pierwszego oświadczenia. 2) Jak dokładnie optymalizujesz pod kątem precyzji? Czy to nie stworzyłoby zdegenerowanego modelu?
Matthew Drury
2
ok dzięki za pomoc w znalezieniu lepszej odpowiedzi. Dodałem 2 referencje. i jak zoptymalizować precyzję? jak każda inna metryka. Po prostu określasz „precyzję” jako funkcję oceniania, na przykład w scikit-learn. Precyzja to metryka, taka jak dokładność, AUC itp.
Paul
Ach, jasne. Ale myślę, że kiedy ludzie czytają „optymalizuj”, zakładają, że dzieje się to podczas treningu twojego modelu. Myślę, że sklearn źle to rozumie, ponieważ wykorzystuje ustalony próg klasyfikacji i naprawdę powinieneś dostroić to za pomocą weryfikacji krzyżowej.
Matthew Drury
1
Tak, teraz widzę, jak „optymalizacja” może być myląca. Nie jestem pewien, jak OP to oznaczało. Dla mnie to tak, jak mówisz: dostrój hiperparametry za pomocą CV, aby precyzja była zmaksymalizowana. I myślę, że tak też stosuje się to w sklearn.
Paul
Pewnie, myślę, że twoja odpowiedź byłaby tutaj lepsza, gdybyś dodał to wyjaśnienie. Trochę nie na temat, ale myślę, że sklearn jest dość kiepski we wspieraniu tego, ponieważ dostosowuje się do ustalonego progu klasyfikacji, co, jak twierdzę, jest dość złą praktyką.
Matthew Drury