Definisi tepat ukuran Deviance dalam paket glmnet, dengan crossvalidation?


12

Untuk penelitian saya saat ini, saya menggunakan metode Lasso melalui paket glmnet di R pada variabel dependen binomial.

Dalam glmnet lambda optimal ditemukan melalui validasi silang dan model yang dihasilkan dapat dibandingkan dengan berbagai tindakan, misalnya kesalahan klasifikasi atau penyimpangan.

Pertanyaan saya: Bagaimana tepatnya penyimpangan didefinisikan dalam glmnet? Bagaimana cara menghitungnya?

(Dalam makalah yang sesuai "Jalur Regularisasi untuk Model Linear Umum melalui Keturunan Koordinat" oleh Friedman et al. Saya hanya menemukan komentar ini tentang penyimpangan yang digunakan dalam cv.glmnet: "berarti penyimpangan (minus dua kali log-kemungkinan di sebelah kiri-keluar) data) "(hal. 17)).


Ini sama dengan penyimpangan yang digunakan glm(atau setidaknya, seharusnya - hanya ada satu definisi penyimpangan yang saya ketahui).
Hong Ooi

Ya, tapi saya pikir mereka memperluasnya dengan cara seperti yang ditunjukkan oleh kutipan di posting pertama saya. Deviance seperti yang saya mengerti dapat membandingkan kinerja dua model tetapi bagaimana penulis memasukkan data kiri dari validasi silang? Bagaimana "minus dua kali log-kemungkinan pada data yang ditinggalkan" masuk akal?
Jo Wmann

1
Baiklah, terima kasih, sekarang saya pikir saya mengerti: Penyimpangan didefinisikan sebagai -2 * log-likelihood atau lebih tepatnya (2 * log-likelihood) / (log-likelihood dari null-model). Ini juga menjelaskan, mengapa ukuran penyimpangan mereka untuk nilai yang berbeda dari lambda tidak melebihi interval 0,2. Model tersebut diperkirakan pada lipatan k-1 dari validasi silang dan diterapkan pada lipatan yang tersisa. Untuk aplikasi pada flip yang tersisa, log-likelihood-score dihitung. Ini diulang k kali dan rata-rata hasil k untuk setiap lambda dari ukuran penyimpangan yang didefinisikan di atas dikembalikan.
Jo Wmann

1
Ya itu selalu rata-rata di semua lipatan untuk setiap lambda. Saya pikir Anda dapat menggunakan salah satu penyimpangan langsung atau rasio wrt ke model nol, yang mungkin merupakan model intersep saja. Ada dua perangkap: a) lipatan mungkin tidak memiliki jumlah titik data yang sama persis b) setiap lipatan berisi data yang berbeda (secara alami). untuk memperbaiki (a) Anda dapat membagi penyimpangan dengan jumlah titik data dalam lipatan yang dipilih. untuk memperbaiki (a) dan (b) pada saat yang sama menggunakan pendekatan rasio. model deviance mengasumsikan bahwa set data sama di setiap model (ide yang sama dalam estimasi MAP di mana mereka mengabaikan penyebut).
Cagdas Ozgenc

1
Namun begitu lipatan masuk ke dalam gambar, penyebutnya tidak sama di lipatan. Jadi rasio mengatasi hal itu dengan membatalkan penyebut. Tapi saya tidak tahu seberapa besar masalah ini ketika Anda rata-rata lipat.
Cagdas Ozgenc

Jawaban:


9

Dalam Friedman, Hastie, dan Tibshirani (2010) , penyimpangan model binomial, untuk tujuan validasi silang, dihitung sebagai

minus dua kali lipat kemungkinan log pada data yang ditinggalkan (hlm. 17)

Mengingat bahwa ini adalah kertas yang dikutip dalam dokumentasi untukglmnet (pada halaman 2 dan 5), itu mungkin merupakan formula yang digunakan dalam paket.

Dan memang, dalam kode sumber untuk fungsi cvlognet, residu penyimpangan untuk respons dihitung sebagai

-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))

dimana predmatsederhana

predict(glmnet.object,x,lambda=lambda)

dan diteruskan dari cv.glmnetfungsi encolsing . Saya menggunakan kode sumber yang tersedia di halaman JStatSoft untuk kertas , dan saya tidak tahu seberapa mutakhir kode itu. Kode untuk paket ini sangat sederhana dan mudah dibaca; Anda selalu dapat memeriksa sendiri dengan mengetik glmnet:::cv.glmnet.


1

Selain jawaban @shadowtalker, ketika saya menggunakan paket glmnet, saya merasa seperti penyimpangan dalam validasi silang yang dinormalkan.

library(glmnet)
data(BinomialExample)

fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value

# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706

# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))

# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637

Ref: deviance R document

karena jika saya melakukan pembagian,

head(deviance(fit$glmnet.fit)) / length(y))

hasilnya adalah

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

yang sangat dekat dengan $ cvm fit.

Ini mungkin komentar dari @Hong Ooi pada pertanyaan ini:

/programming/43468665/poisson-deviance-glmnet

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.