mengoptimalkan auc vs logloss dalam masalah klasifikasi biner


12

Saya melakukan tugas klasifikasi biner di mana probabilitas hasil cukup rendah (sekitar 3%). Saya mencoba memutuskan apakah akan mengoptimalkan dengan AUC atau log-loss. Seperti yang saya mengerti, AUC memaksimalkan kemampuan model untuk membedakan antara kelas-kelas sementara logloss menghukum perbedaan antara probabilitas aktual dan estimasi. Dalam tugas saya sangat penting untuk mengkalibrasi akurasi presisi. Jadi saya akan memilih logloss, tapi saya bertanya-tanya apakah model log-loss terbaik juga harus menjadi model AUC / GINI terbaik.

Jawaban:


12

Seperti yang Anda sebutkan, AUC adalah statistik peringkat (yaitu skala invarian) & log loss adalah statistik kalibrasi. Satu mungkin sepele membangun model yang memiliki AUC yang sama tetapi gagal untuk meminimalkan log loss wrt beberapa model lain dengan penskalaan nilai yang diprediksi. Mempertimbangkan:

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

Jadi, kita tidak bisa mengatakan bahwa model memaksimalkan AUC berarti meminimalkan kehilangan log. Apakah model meminimalkan kehilangan log sesuai dengan AUC yang dimaksimalkan akan sangat bergantung pada konteks; keterpisahan kelas, bias model, dll. Dalam praktiknya, orang mungkin menganggap hubungan yang lemah, tetapi secara umum mereka hanya berbeda tujuan. Pertimbangkan contoh berikut yang menumbuhkan pemisahan kelas (efek ukuran prediktor kami):

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

masukkan deskripsi gambar di sini


Jawaban yang sangat informatif. Dalam jawaban Anda ada dua prediksi, dengan AUC yang sama tetapi kehilangan log sangat berbeda. Jadi saya sampai pada pertanyaan ini: Saya telah melatih model untuk mengoptimalkan AUC. Tetapi kemudian saya menyadari bahwa saya harus mencari log loss. Saya tidak mampu melatih model untuk kehilangan log (yang seharusnya menjadi kasus ideal). Dapatkah saya menerapkan transformasi apa pun pada prediksi, sehingga memiliki log loss terbaik. (Kehilangan log yang dianggap di sini adalah makna biner, probabilitas referensi adalah 1 atau 0).
Rajesh Dachiraju

1
Berapa perkiraan model Anda? Kehilangan log hanya masuk akal jika Anda menghasilkan probabilitas posterior, yang tidak mungkin untuk model yang dioptimalkan AUC. Statistik peringkat seperti AUC hanya mempertimbangkan urutan relatif dari prediksi, sehingga besarnya kesenjangan antara prediksi tidak relevan; jelas ini bukan untuk probabilitas. Setiap penskalaan yang Anda lakukan pada prediksi AUC yang dioptimalkan harus mengatasi masalah ini. Selain itu, ini hanya membahas kalibrasi prediksi Anda terhadap perkiraan posterior yang masuk akal, bukan minimalisasi global LL, seperti yang diuraikan dalam posting ini.
khol

1
Anda mungkin tertarik dengan penskalaan platt sebagai titik awal.
khol

Saya mengerti ini bukan global. Saya hanya ingin mengatur transformasi yang mungkin memiliki parameter dan kemudian bermain-main dengannya.
Rajesh Dachiraju

1

Untuk label yang tidak seimbang, area di bawah kurva presisi-recall lebih disukai daripada AUC ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/ atau python scikit-learn docs )

Juga, jika tujuan Anda adalah untuk memaksimalkan presisi, Anda dapat mempertimbangkan melakukan validasi silang untuk memilih model terbaik (algoritma + hyperparameters) menggunakan "presisi" sebagai metrik kinerja.


2
Saya turun karena beberapa alasan di sini. 1) Anda harus mengutip sumber atau alasan untuk pernyataan pertama Anda. 2) Bagaimana tepatnya Anda mengoptimalkan presisi? Bukankah itu menciptakan model yang merosot?
Matthew Drury

2
ok terima kasih telah membantu saya membuat jawaban yang lebih baik. Saya menambahkan 2 referensi. dan bagaimana Anda mengoptimalkan presisi? sama seperti metrik lainnya. Anda cukup menentukan "presisi" sebagai fungsi penilaian Anda, misalnya di scikit-learn. Presisi adalah metrik seperti akurasi, AUC, dll
Paul

Ahh tentu. Tapi saya pikir ketika orang membaca "mengoptimalkan" mereka akan menganggap itu selama pelatihan model Anda. Saya pikir sklearn mendapatkan ini sangat salah, karena menggunakan ambang klasifikasi tetap, dan Anda harus benar-benar menyetel itu dengan validasi silang.
Matthew Drury

1
Yap, sekarang saya melihat bagaimana "mengoptimalkan" mungkin membingungkan. Tidak yakin bagaimana OP bersungguh-sungguh. Bagi saya, seperti yang Anda katakan: tune hyperparameters via CV sehingga presisi dimaksimalkan. Dan saya pikir itulah cara Anda menerapkannya di sklearn juga.
Paul

Tentu, saya pikir jawaban Anda akan ditingkatkan di sini jika Anda menambahkan klarifikasi itu. Sedikit topik, tapi saya benar-benar berpikir sklearn cukup buruk dalam mendukung itu, karena lagu didasarkan pada ambang klasifikasi tetap, yang menurut saya adalah praktik yang sangat buruk.
Matthew Drury
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.