Kelompokkan variabel kategori dalam glmnet

8

Pertimbangkan kecocokan berikut:

fit3a=glmnet(x,g4,family="multinomial",type.multinomial="grouped")

Bagaimana cara saya menunjukkan kolom mana xyang kategorikal / multinomial? Apakah ada opsi untuk menentukan indeks variabel yang dikelompokkan?

Dokumentasi menjelaskan opsi type.multinomialsebagai berikut:

Jika "dikelompokkan" maka penalti laso yang dikelompokkan digunakan pada koefisien multinomial untuk suatu variabel. Ini memastikan mereka semua bersama-sama. Standarnya adalah "ungrouped".

James
sumber

Jawaban:

13

Dua argumen pertama yang glmnet()diharapkan adalah matriks prediktor ( x, dalam kasus Anda) dan vektor respons ( g4, dalam kasus Anda). Untuk xmatriks, diharapkan bahwa Anda telah mengelabui variabel kategori apa pun. Dengan kata lain, glmnet()tidak benar-benar tahu apakah ada prediktor Anda yang masuk kategori, karena mereka sudah dibuat-buat.

Jika data Anda dalam bingkai data, cara yang baik untuk membangun xmatriks menggunakan model.matrix()fungsi. Ini menerima bahasa rumus, secara otomatis akan mengecualikan variabel respons, dan akan membuat variabel dummy untuk setiap prediktor yang didefinisikan sebagai faktor.

The family="multinomial"dan type.multinomial="grouped"pilihan mengacu pada variabel respon memiliki lebih dari 2 hasil yang mungkin. Anda dapat mengirimkan variabel respons ( g4) sebagai faktor.

Penulis paket memberikan sketsa yang bagus menjelaskan penggunaan glmnet(), meskipun sayangnya tidak memberikan contoh penggunaan model.matrix()untuk menyiapkan xmatriks.

Kevin Markham
sumber
1
Agak terlambat ke pesta, tetapi hanya untuk mencatat bahwa pengantar bagus lain untuk glmnet, bersama dengan contoh menggunakan model.matrix, diberikan dalam Pengantar Pembelajaran Statistik. www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf
owen88
12

Seperti yang ditunjukkan justmarkham, Anda dapat membuat matriks desain xmenggunakan model.matrix. Perhatikan bahwa Anda ingin mengecualikan intersep, karena glmnet menyertakan satu secara default. Anda mungkin juga ingin mengubah fungsi kontras default, yang secara default tidak menyertakan satu level dari masing-masing faktor (pengkodean pengobatan). Tetapi karena hukuman laso, ini tidak lagi diperlukan untuk identifikasi, dan bahkan membuat interpretasi dari variabel yang dipilih lebih rumit. Untuk melakukan ini, atur

contr.Dummy <- function(contrasts, ...){
   conT <- contr.treatment(contrasts=FALSE, ...)
   conT
}
options(contrasts=c(ordered='contr.Dummy', unordered='contr.Dummy'))

Sekarang, level apa pun dari suatu faktor dipilih, Anda dapat menganggapnya sebagai menyarankan bahwa level spesifik ini penting, dibandingkan semua level yang dihilangkan. Dalam pembelajaran mesin, saya telah melihat pengkodean ini disebut sebagai pengkodean satu-panas.

Dengan asumsi bahwa g4ada Klevel, type.multinomial="grouped"opsi menentukan bahwa fitur xsemua akan memasuki model secara bersamaan untuk masing-masing Kprediktor linier, yang bertentangan dengan memiliki prediktor linier untuk setiap kelas (secara umum) memiliki fitur-fiturnya sendiri. glmnettidak (saat ini?) mendukung jenis hukuman prediktor ( xmatriks) yang dikelompokkan . Paket grplassotidak, tetapi ditulis dalam R murni, jadi lebih lambat daripada glmnet, tetapi Anda bisa mencobanya.

Andrew M
sumber
Bisakah Anda menjelaskan ini sedikit berbeda? Atau (lebih tepatnya) Anda dapat memberikan wawasan untuk pertanyaan saya yang terkait: stats.stackexchange.com/questions/238623/…
theforestecologist
Hai @AndrewM, model.matrixtidak mengecualikan level apa pun dari variabel kategori pertama saat kita menghilangkan intersep. Haruskah matriks desain menjadi input dalam hal glmnetapa pun? dan bagaimana kita menginterpretasikan tingkat yang tidak diizinkan dari variabel kategori pertama dalam regresi laso?
Goldman Clarck