Classification

在二元分類問題中優化 auc 與 logloss

  • September 15, 2016

我正在執行一個二元分類任務,其中結果概率相當低(大約 3%)。我正在嘗試決定是通過 AUC 還是對數損失進行優化。據我所知,AUC 最大化了模型區分類別的能力,而對數損失懲罰了實際概率和估計概率之間的差異。在我的任務中,校準精度非常重要。所以我會選擇logloss,但我想知道最好的log-loss模型是否也應該是最好的AUC / GINI模型。

正如您所提到的,AUC 是一個等級統計量(即尺度不變),而對數損失是一個校準統計量。可以簡單地構建一個具有相同 AUC 但無法通過縮放預測值來最小化其他模型的對數損失的模型。考慮:

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

因此,我們不能說最大化 AUC 的模型意味著最小化對數損失。最小化對數損失的模型是否對應於最大化 AUC 將在很大程度上取決於上下文;類可分離性、模型偏差等。在實踐中,人們可能會考慮一種弱關係,但總的來說,它們只是不同的目標。考慮以下示例,該示例增加了類可分離性(我們的預測器的效果大小):

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

效果_1

在此處輸入圖像描述

引用自:https://stats.stackexchange.com/questions/235089

comments powered by Disqus