Optimierung von auc vs logloss bei binären Klassifizierungsproblemen

12

Ich führe eine binäre Klassifizierungsaufgabe durch, bei der die Ergebniswahrscheinlichkeit angemessen niedrig ist (ca. 3%). Ich versuche zu entscheiden, ob ich durch AUC oder Protokollverlust optimieren möchte. Soweit ich verstanden habe, maximiert AUC die Fähigkeit des Modells, zwischen Klassen zu unterscheiden, während der Logloss die Divergenz zwischen tatsächlichen und geschätzten Wahrscheinlichkeiten bestraft. Bei meiner Aufgabe ist es äußerst wichtig, die Präzisionsgenauigkeit zu kalibrieren. Ich würde mich also für Logloss entscheiden, aber ich frage mich, ob das beste Log-Loss-Modell auch das beste AUC / GINI-Modell sein sollte.

Giorgio Spedicato
quelle

Antworten:

12

Wie Sie bereits erwähnt haben, ist die AUC eine Rangstatistik (dh eine Skaleninvariante) und der Protokollverlust eine Kalibrierungsstatistik. Man kann trivial ein Modell konstruieren, das dieselbe AUC hat, aber den Protokollverlust gegenüber einem anderen Modell nicht minimiert, indem man die vorhergesagten Werte skaliert. Erwägen:

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

Wir können also nicht sagen, dass ein Modell, das die AUC maximiert, einen minimierten Protokollverlust bedeutet. Ob ein Modell zur Minimierung des Protokollverlusts einer maximierten AUC entspricht, hängt stark vom Kontext ab. Klassentrennbarkeit, Modellbias usw. In der Praxis könnte man eine schwache Beziehung in Betracht ziehen, aber im Allgemeinen handelt es sich einfach um unterschiedliche Ziele. Betrachten Sie das folgende Beispiel, das die Klassentrennbarkeit erhöht (Effektgröße unseres Prädiktors):

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

Geben Sie hier die Bildbeschreibung ein

khol
quelle
Sehr informative Antwort. In Ihrer Antwort gibt es zwei Vorhersagen mit derselben AUC, aber sehr unterschiedlichem Protokollverlust. Ich komme also zu dieser Frage: Ich habe ein Modell zur Optimierung der AUC trainiert. Aber später wurde mir klar, dass ich mich um einen Protokollverlust kümmern muss. Ich kann es mir nicht leisten, das Modell auf Protokollverlust umzuschulen (was ein idealer Fall sein sollte). Kann ich eine Transformation auf die Vorhersagen anwenden, damit sie den besten Protokollverlust aufweist? (Der hier betrachtete logarithmische Verlust ist eine binäre Bedeutung, die Referenzwahrscheinlichkeit ist entweder 1 oder 0).
Rajesh Dachiraju
1
Was schätzt Ihr Modell? Protokollverlust ist nur dann sinnvoll, wenn Sie hintere Wahrscheinlichkeiten erzeugen, was für ein AUC-optimiertes Modell unwahrscheinlich ist. Rangstatistiken wie die AUC berücksichtigen nur die relative Reihenfolge der Vorhersagen, sodass die Größe der Lücken zwischen den Vorhersagen irrelevant ist. Dies ist bei Wahrscheinlichkeiten eindeutig nicht der Fall. Jede Skalierung, die Sie an Ihren AUC-optimierten Vorhersagen durchführen, muss dieses Problem beheben. Darüber hinaus wird nur die Kalibrierung Ihrer Vorhersagen in Richtung einer angemessenen posterioren Schätzung behandelt, nicht die globale Minimierung von LL, wie in diesem Beitrag beschrieben.
Khol
1
Möglicherweise interessieren Sie sich für die Plattenskalierung als Ausgangspunkt.
Khol
Ich verstehe, dass es nicht global ist. Ich möchte nur eine Transformation einrichten, die möglicherweise einen Parameter enthält, und dann damit herumspielen.
Rajesh Dachiraju
1

Bei unausgeglichenen Etiketten ist der Bereich unter der Präzisionsrückrufkurve der AUC vorzuziehen ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ oder Python-Scikit-Lerndokumente ).

Wenn Sie die Genauigkeit maximieren möchten, können Sie eine Kreuzvalidierung in Betracht ziehen, um das beste Modell (Algorithmus + Hyperparameter) unter Verwendung von "Genauigkeit" als Leistungsmetrik auszuwählen.

Paul
quelle
2
Ich habe hier aus einigen Gründen abgelehnt. 1) Sie sollten entweder eine Quelle oder einen Grund für Ihre erste Aussage angeben. 2) Wie genau optimieren Sie auf Präzision? Würde das nicht ein entartetes Modell schaffen?
Matthew Drury
2
ok danke, dass du mir geholfen hast, eine bessere Antwort zu finden. Ich habe 2 Referenzen hinzugefügt. und wie optimiert man auf Präzision? genau wie jede andere Metrik. Sie geben einfach "Präzision" als Bewertungsfunktion an, zum Beispiel beim Scikit-Lernen. Präzision ist eine Metrik wie Genauigkeit, AUC usw.
Paul
Ahh, sicher. Aber ich denke, wenn Leute "optimieren" lesen, gehen sie davon aus, dass dies während des Trainings Ihres Modells geschieht. Ich denke, sklearn versteht das ziemlich falsch, da es einen festen Klassifizierungsschwellenwert verwendet, und Sie sollten dies wirklich mit einer Kreuzvalidierung optimieren.
Matthew Drury
1
Ja, ich sehe jetzt, wie verwirrend "optimieren" sein kann. Ich bin mir nicht sicher, wie OP es gemeint hat. Für mich ist es so, wie Sie sagen: Stimmen Sie Hyperparameter über den Lebenslauf ab, damit die Präzision maximiert wird. Und ich denke, so wenden Sie es auch in sklearn an.
Paul
Klar, ich denke, Ihre Antwort würde sich hier verbessern, wenn Sie diese Klarstellung hinzufügen würden. Ein bisschen abseits des Themas, aber ich denke tatsächlich, dass sklearn das ziemlich schlecht unterstützt, da es auf einer festen Klassifizierungsschwelle basiert, was meiner Meinung nach eine ziemlich schlechte Praxis ist.
Matthew Drury