我正在执行二进制分类任务,其中结果概率相当低(大约3%)。我正在尝试决定是否通过AUC或对数损失进行优化。据我所知,AUC最大化了模型区分类别的能力,而对数损失则惩罚了实际概率与估计概率之间的差异。在我的任务中,校准精度非常重要。所以我会选择logloss,但是我想知道最好的log-loss模型是否也应该是最好的AUC / GINI模型。
我正在执行二进制分类任务,其中结果概率相当低(大约3%)。我正在尝试决定是否通过AUC或对数损失进行优化。据我所知,AUC最大化了模型区分类别的能力,而对数损失则惩罚了实际概率与估计概率之间的差异。在我的任务中,校准精度非常重要。所以我会选择logloss,但是我想知道最好的log-loss模型是否也应该是最好的AUC / GINI模型。
Answers:
如您所述,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()
}
对于不平衡的标签,精确召回曲线下的面积要优于AUC(https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/或python scikit-learn docs)
另外,如果您的目标是最大程度地提高精度,则可以考虑使用“精度”作为性能指标进行交叉验证,以选择最佳模型(算法+超参数)。