Như bạn đã đề cập, AUC là một thống kê xếp hạng (tức là bất biến tỷ lệ) & mất log là một thống kê hiệu chuẩn. Người ta có thể xây dựng một mô hình có AUC tương tự nhưng không giảm thiểu mất log ghi lại một số mô hình khác bằng cách nhân rộng các giá trị dự đoán. Xem xét:
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
Vì vậy, chúng ta không thể nói rằng một mô hình tối đa hóa AUC có nghĩa là giảm thiểu mất log. Việc một mô hình giảm thiểu mất log có tương ứng với AUC tối đa hóa hay không sẽ phụ thuộc rất nhiều vào bối cảnh; phân tách lớp, thiên vị mô hình, v.v. Trong thực tế, người ta có thể xem xét một mối quan hệ yếu, nhưng nói chung chúng chỉ đơn giản là các mục tiêu khác nhau. Xem xét ví dụ sau đây làm tăng khả năng phân tách lớp (kích thước hiệu ứng của công cụ dự đoán của chúng tôi):
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()
}