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?
sumber
Jawaban:
glmnet
di 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- .Jika Anda menjalankanλ
glmnet
panggilan terpisah untuk setiap , itu jauh lebih lambat, dan memang dokumentasi di negara bagian berikut ini tentang parameter:?glmnet
lambda
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.λ λ
sumber
glmnet
sketsa, mereka semua adalah penulis yang sama (Friedman, Hastie, Tibshirani, dll.), Kecuali bahwaglmnet
makalahnya lebih baru dan menggunakan algoritma pathwise. Selain itu,glmnet
paket ini dikelola oleh penulis yang sama, jadi Anda mungkin mengharapkannya berkinerja lebih baik daripada versi Mathworks. Namun, versi Matlabglmnet
juga ada, dikelola oleh Junyang Qian, yang mungkin sesuai dengan tujuan Anda.