在二进制分类问题中优化auc vs logloss


12

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

Answers:


12

如您所述,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()
}

effect_1

在此处输入图片说明


非常有用的答案。在您的回答中,有两个预测,它们的AUC相同,但对数损失却大不相同。因此,我想到了一个问题:我已经训练了一个用于优化AUC的模型。但是后来我意识到我需要进行日志丢失。我负担不起重新训练模型的对数丢失(这应该是理想的情况)。我可以对预测应用任何变换,以使其具有最佳的对数损失。(此处考虑的对数损失是二进制含义,参考概率为1或0)。
Rajesh Dachiraju

1
您的模型估计了什么?对数丢失仅在产生后验概率时才有意义,这对于AUC优化模型来说不太可能。排名统计(如AUC)仅考虑预测的相对顺序,因此预测之间的差异幅度无关紧要;显然,概率并非如此。您对AUC优化的预测执行的任何缩放都必须解决此问题。此外,这仅针对根据合理的后验估计进行的预测校准,而不是本文中概述的LL的全局最小化。
khol

1
您可能对按比例缩放感兴趣。
khol

我了解它不是全球性的。我只想设置一个可能具有参数的转换,然后使用它。
Rajesh Dachiraju

1

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

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


2
我在这里投票有几个原因。1)您应该在第一个陈述中引用来源或原因。2)您如何精确地优化精度?那不会创建退化的模型吗?
马修·德鲁里

2
好的,谢谢您帮助我做出更好的答复。我添加了2个参考。以及如何优化精度?就像其他指标一样 您只需将“ precision”指定为评分功能,例如在scikit-learn中。精度是诸如准确性,AUC等的度量标准
保罗

嗯,当然。但是我认为,当人们阅读“优化”时,他们会认为这是在模型训练期间。我认为sklearn犯错了,因为它使用了固定的分类阈值,因此您应该通过交叉验证对其进行调整。
马修·德鲁里

1
是的,我现在看到“优化”可能令人困惑。不确定OP的含义。对我来说,就像您说的那样:通过CV调整超参数,以使精度最大化。我认为这也是将其应用于sklearn的方式。
保罗

当然,我想如果您增加这一说明,您的答案将会有所改善。话题有点离题,但我实际上认为sklearn支持该功能的能力很差,因为它是基于固定的分类阈值进行调整的,我认为这是非常糟糕的做法。
马修·德鲁里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.