যেমনটি আপনি উল্লেখ করেছেন, এউসি হ'ল একটি র্যাঙ্কের পরিসংখ্যান (অর্থাত্ স্কেল ইনগ্রেন্টেট) এবং লগ হ্রাস একটি ক্রমাঙ্কন পরিসংখ্যান। কেউ তুচ্ছভাবে এমন মডেল তৈরি করতে পারে যা একই এউসি রয়েছে তবে পূর্বাভাসকৃত মানগুলি স্কেল করে অন্য কোনও মডেল লগ ক্ষতি কমাতে ব্যর্থ হয়। বিবেচনা:
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
সুতরাং, আমরা বলতে পারি না যে একটি মডেল সর্বাধিকীকরণ করা মানে হ'ল ন্যূনতম লগ হ্রাস। কোনও মডেল লগ ক্ষয়কে হ্রাস করা সর্বাধিক এওসি-র সাথে সামঞ্জস্য করে কিনা সে প্রসঙ্গে খুব বেশি নির্ভর করবে; শ্রেণীর পৃথকীকরণ, মডেল পক্ষপাত, ইত্যাদি অনুশীলনে, কেউ একটি দুর্বল সম্পর্ক বিবেচনা করতে পারে তবে সাধারণভাবে তারা কেবল ভিন্ন উদ্দেশ্য। নিম্নোক্ত উদাহরণটি বিবেচনা করুন যা বর্গ বিভাজন বৃদ্ধি করে (আমাদের পূর্বাভাসকারীর প্রভাব আকার):
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()
}