Apakah benar mengevaluasi driver individu dengan nilai AUC?
Saya berdiskusi dengan supervisor saya tentang penggunaan AUC untuk menentukan, pada dasarnya, pentingnya tiga driver berbeda yang masing-masing terdiri dari beberapa variabel. Dia mengklaim saya dapat melihat nilai AUC untuk keseluruhan model dan kemudian mencoba menjalankan model serupa hanya dengan menggunakan satu driver pada satu waktu, mendapatkan nilai AUC untuk setiap driver dan kemudian menilai pentingnya setiap driver.
Inherent driver: 2 variables
Static driver: 2 variables
Dynamic driver: 7 variables
Jadi, keluaran AUC saya dari model ElasticNet biner adalah sebagai berikut:
Overall AUC score (all drivers included): 0.89
Kemudian saya melakukan model ElasticNet yang sama tetapi hanya dengan dua variabel saya yang dipilih di inherent driver
dan variabel terikat . Begitu seterusnya dengan driver berikutnya, dll. Nilai ABK adalah sebagai berikut:
Inherent driver: 0.58
Static driver: 0.67
Dynamic driver: 0.88
- Apakah hasilnya kemudian memberi tahu saya bahwa saya
dynamic driver
relatif lebih penting, atau lebih baik dalam membedakan 0 dari 1? - Apakah ini bahkan metode yang masuk akal secara statistik? Jika tidak, bagaimana lagi saya bisa mengevaluasinya?
EDIT:
V1 dependent V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 -1.3 0 494. 34.1 2.23 43.0 4.58 46.7 283. 0.442 34.5 0
2 -4.2 0 231. 16.9 1.01 69.4 0 66.4 277. 0.959 11.1 0
3 -11.7 0 646. 132. 20.5 88.0 0.063 34.0 291. 5.63 21 0
4 -9.3 0 44.0 16.4 0.397 39.1 2.37 77.6 279. 7.24 31.8 0
5 -14.2 0 88.2 128. 40.6 83.4 1.09 47.2 284. 8.23 2.92 0
6 19.4 0 382. 49.4 1.15 54.4 0.914 53.6 279. 3.03 16.8 1
df <- df %>% select(V1, dependent, V2, V3, V4, V5, V6, V7, V8, V9, V11, V12)
training.samples <- df$dependent %>% createDataPartition(p = 0.8, list = FALSE) train <- df[training.samples, ] test <- df[-training.samples, ] x.train <- data.frame(train[, names(train) != "dependent"]) x.train <- data.matrix(x.train) y.train <- train$dependent
x.test <- data.frame(test[, names(test) != "dependent"])
x.test <- data.matrix(x.test)
y.test <- test$dependent list.of.fits.overall.model <- list() for (i in 0:10){ fit.name <- paste0("alpha", i/10) list.of.fits.overall.model[[fit.name]] <- cv.glmnet(x.train, y.train, type.measure = c("auc"), alpha = i/10, family = "binomial", nfolds = 10, foldid = foldid, parallel = TRUE) } predicted <- predict(list.of.fits.overall.model[[fit.name]], s = list.of.fits.overall.model[[fit.name]]$lambda.1se, newx = x.test, type = "response")
#PLOT AUC
pred <- prediction(predicted, y.test)
perf <- performance(pred, "tpr", "fpr")
plot(perf)
abline(a = 0, b = 1, lty = 2, col = "red")
auc_ROCR <- performance(pred, measure = "auc")
auc_ROCR <- [email protected][[1]]
auc_ROCR
Sekarang saya ulangi seluruh prosedur pemodelan jaring-elastis (cari pengorbanan punggungan / laso yang optimal dan nilai penalti yang optimal) hanya dengan dua variabel. Pada dasarnya, saya mengubah yang berikut:
df.inherent <- df %>% select(V1, dependent, V2)
training.samples <- df.inherent$dependent %>% createDataPartition(p = 0.8, list = FALSE) train <- df.inherent[training.samples, ] test <- df.inherent[-training.samples, ] x.train <- data.frame(train[, names(train) != "dependent"]) x.train <- data.matrix(x.train) y.train <- train$dependent
x.test <- data.frame(test[, names(test) != "dependent"])
x.test <- data.matrix(x.test)
y.test <- test$dependent list.of.fits.inherent <- list() for (i in 0:10){ fit.name <- paste0("alpha", i/10) list.of.fits.inherent[[fit.name]] <- cv.glmnet(x.train, y.train, type.measure = c("auc"), alpha = i/10, family = "binomial", nfolds = 10, foldid = foldid, parallel = TRUE) } predicted <- predict(list.of.fits.inherent[[fit.name]], s = list.of.fits.inherent[[fit.name]]$lambda.1se, newx = x.test, type = "response")
Jadi akhirnya, hal terakhir yang dipertanyakan @EDM di komentar.
Jawaban
Mengingat bahwa hukuman penting untuk pemodelan Anda, Anda berada di jalur yang berpotensi bagus, tetapi Anda perlu memasukkan informasi tentang potensi kesalahan dalam metrik kualitas ABK Anda. Anda tidak dapat membandingkan AUC 0,58 dengan salah satu dari 0,67 kecuali Anda tahu bagaimana variabel perkiraan tersebut.
Cara sederhana untuk menanganinya adalah dengan mengulangi proses dengan beberapa (katakanlah beberapa ratus) pemisahan uji / latihan alih-alih satu kali seperti yang Anda lakukan saat ini. Split test / train split bisa jadi tidak dapat diandalkan dengan kumpulan data yang memiliki apa pun di bawah beberapa ribu kasus . (Karena Anda mungkin memerlukan kurang dari 200 kasus di kelas minoritas agar sesuai dengan model yang tidak di -enalisasi dengan 11 prediktor secara andal, saya berasumsi bahwa Anda tidak memiliki beberapa ribu kasus dan karenanya harus melakukan lebih banyak pengambilan sampel ulang dalam peristiwa apa pun.) Kemudian Anda menggunakan variabilitas di antara (beberapa ratus) nilai AUC set-uji untuk mengukur apakah ada perbedaan di antara subset prediktor dapat diandalkan secara statistik atau tidak.
Anda mungkin lebih baik menggunakan pendekatan serupa berdasarkan bootstrap daripada beberapa tes / latihan split. Anda terlebih dahulu menggunakan semua data agar sesuai dengan model lengkap. Dengan begitu, Anda mendapatkan model lengkap yang, tidak seperti pendekatan Anda, menggunakan semua data yang tersedia untuk dibuat dan tidak bergantung pada perbedaan pengujian / latihan tertentu.
Anda kemudian mengulangi seluruh proses pemodelan (termasuk pilihan alpha
dan lambda
melalui validasi silang internal) pada beberapa ratus sampel bootstrap dari kumpulan data, dan menggunakan seluruh kumpulan data sebagai set pengujian di setiap kasus. Di bawah prinsip bootstrap yang dianalogikan dengan membangun model pada beberapa sampel dari seluruh populasi yang diminati dan kemudian mengujinya pada populasi. Dengan demikian, Anda mendapatkan perkiraan yang masuk akal tentang kualitas proses pemodelan: optimisme (overfitting) pada nilai koefisien, dan bias serta variabilitas dalam perkiraan ukuran kualitas Anda.
Dalam hal pemodelan, bahkan jika Anda memilih untuk menggunakan ABK sebagai ukuran akhir Anda, Anda harus menggunakan penyimpangan, bukan ABK sebagai kriteria untuk pilihan validasi silang alpha
dan lambda
. AUC (atau C-index) tidak terlalu sensitif untuk membedakan antar model. Juga, pikirkan baik-baik apakah lambda.1se
pilihan yang baik dalam hal ini. Itu membantu dalam mendapatkan model pelit, tetapi dengan begitu sedikit prediktor untuk memulai (hanya 2 dalam contoh kedua Anda) Anda mungkin jauh lebih baik dengan lambda.min
nilai yang meminimalkan kesalahan validasi silang (sekali lagi, paling baik dilakukan dengan penyimpangan bahkan jika akhir Anda evaluasi perlu dilakukan dengan AUC).