Mengapa laso di matlab jauh lebih lambat daripada glmnet dalam R (10 menit versus ~ 1 dtk)?

9

Saya mengamati bahwa fungsi laso di MATLAB relatif lambat. Saya menjalankan banyak masalah regresi, dengan biasanya 1 hingga 100 prediktor dan 200 hingga 500 pengamatan. Dalam beberapa kasus, laso ternyata sangat lambat (untuk menyelesaikan masalah regresi butuh beberapa menit). Saya menemukan bahwa ini adalah kasus ketika prediktor sangat berkorelasi (misalnya, seri waktu suhu udara pada titik grid tetangga dari model atmosfer).

Saya membandingkan kinerja contoh di bawah ini di matlab dan R.

y adalah vektor prediktif dan dengan 163 elemen (mewakili pengamatan) dan x adalah matriks prediktor dengan 100 baris dan 163 pengamatan yang sesuai dengan pengamatan pada y. Saya menerapkan fungsi MATLAB laso sebagai berikut:

[beta_L,stats]=lasso(x,y,'cv',4);

Sama di R, menggunakan glmnet:

fit.lasso=cv.glmnet(predictor.ts,predictand.ts,nfolds=4)

Baik MATLAB dan R didasarkan pada algoritma penurunan koordinat. Nilai default untuk jumlah nilai lambda adalah 100 untuk laso dan glmnet. Ambang konvergensi untuk penurunan koordinat per default 10 ^ -4 di matlab, dan bahkan lebih rendah di R (10 ^ -7).

Fungsi R membutuhkan satu detik di komputer saya. Matlab membutuhkan waktu beberapa menit, dengan sebagian besar waktu perhitungan dihabiskan dalam algoritma penurunan koordinat.

Ketika prediktor kurang berkorelasi (misalnya, tipe variabel yang berbeda dari model atmosfer numerik) laso di Matlab tidak begitu lambat, tetapi masih membutuhkan ~ 30 - dibandingkan dengan ~ 1 dalam R).

Apakah matlab laso benar-benar jauh lebih tidak efisien daripada glmnet, atau apakah saya melewatkan sesuatu?

Marlis Hofer
sumber
predictor.ts harus diganti oleh x dan predictand.ts oleh y ...
Marlis Hofer
Terbaik untuk menginstal port glmnet Matlab yang tersedia dari web.stanford.edu/~astie/glmnet_matlab - ia menggunakan semua jenis trik komputasi untuk mempercepat penurunan koordinat awal algo (misalnya strategi penyaringan fitur cepat).
Tom Wenseleers

Jawaban:

6

glmnetdi R cepat karena menggunakan apa yang disebut jalur regularisasi . Pada dasarnya, Anda memilih urutan parameter hukuman yang . Solusi untuk digunakan sebagai awal yang hangat untuk , solusi untuk digunakan sebagai awal yang hangat untuk , dan seterusnya. Ini karena solusinya harus dekat satu sama lain. Jadi pas model untuk parameter hukuman , Anda tidak memulai keturunan koordinat dari tempat yang benar-benar acak di ruang parameter. Sebaliknya Anda mulai dari suatu tempat yang sudah dekat dengan solusi: parameter untuk model ke- .λ1,...λmλ1λ2λ2λ3(n+1)n

Jika Anda menjalankan glmnetpanggilan terpisah untuk setiap , itu jauh lebih lambat, dan memang dokumentasi di negara bagian berikut ini tentang parameter:λ?glmnetlambda

PERINGATAN: gunakan dengan hati-hati. Jangan berikan nilai tunggal untuk lambda [...] Persediaan alih-alih urutan penurunan nilai lambda. glmnetbergantung pada penghangatnya yang dimulai untuk kecepatan, dan seringkali lebih cepat untuk menyesuaikan seluruh jalur daripada menghitung satu kecocokan.

Tekankan milikku. Jadi pada saat pendekatan jalur non-regularisasi menghitung solusi untuk satu pendekatan berbasis jalur regularisasi telah melakukan semua dan mulai pada lipatan berikutnya. Lihat juga komentar untuk jawaban ini dari Chris Haug. Tampaknya dia memiliki akses ke MATLAB, yang tidak saya miliki. Temuannya tampaknya mengkonfirmasi kecurigaan saya bahwa perbedaan kecepatan berasal dari penggunaan jalur regularisasi.λλ

Einar
sumber
2
Sebagai pemeriksaan cepat, jika Anda melihat referensi dalam dokumentasi Matlab versus glmnetsketsa, mereka semua adalah penulis yang sama (Friedman, Hastie, Tibshirani, dll.), Kecuali bahwa glmnetmakalahnya lebih baru dan menggunakan algoritma pathwise. Selain itu, glmnetpaket ini dikelola oleh penulis yang sama, jadi Anda mungkin mengharapkannya berkinerja lebih baik daripada versi Mathworks. Namun, versi Matlab glmnetjuga ada, dikelola oleh Junyang Qian, yang mungkin sesuai dengan tujuan Anda.
Chris Haug