在二元分类问题中优化 auc 与 logloss

机器算法验证 分类 二进制数据 奥克 对数损失
2022-01-20 12:01:57

我正在执行一个二元分类任务,其中结果概率相当低(大约 3%)。我正在尝试决定是通过 AUC 还是对数损失进行优化。据我所知,AUC 最大化了模型区分类别的能力,而对数损失惩罚了实际概率和估计概率之间的差异。在我的任务中,校准精度非常重要。所以我会选择logloss,但我想知道最好的log-loss模型是否也应该是最好的AUC / GINI模型。

2个回答

正如您所提到的,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

在此处输入图像描述

对于不平衡的标签,精确召回曲线下的面积优于 AUC(https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/python scikit-learn docs

此外,如果您的目标是最大化精度,您可以考虑使用“精度”作为性能指标进行交叉验证以选择最佳模型(算法 + 超参数)。