Bagaimana cara melakukan regresi ridge non-negatif? Laso non-negatif tersedia di scikit-learn
, tetapi untuk ridge, saya tidak dapat menegakkan non-negativitas beta, dan memang, saya mendapatkan koefisien negatif. Adakah yang tahu mengapa ini terjadi?
Juga, dapatkah saya menerapkan punggungan dalam hal kuadrat terkecil reguler? Pindah ini ke pertanyaan lain: Dapatkah saya menerapkan regresi ridge dalam hal regresi OLS?
Jawaban:
Jawaban yang agak anti-iklim untuk " Apakah ada yang tahu mengapa ini? " Adalah bahwa tidak ada yang cukup peduli untuk menerapkan rutinitas regresi ridge non-negatif. Salah satu alasan utama adalah bahwa orang-orang sudah mulai menerapkan rutin jaring elastis non-negatif (misalnya di sini dan di sini ). Jaring elastis mencakup regresi punggungan sebagai kasus khusus (satu dasarnya mengatur bagian LASSO memiliki bobot nol). Karya-karya ini relatif baru sehingga belum dimasukkan dalam scikit-learn atau paket penggunaan umum serupa. Anda mungkin ingin menanyakan kode ini kepada pembuat makalah ini.
EDIT:
Seperti @amoeba dan saya bahas di komentar implementasi sebenarnya ini relatif sederhana. Katakanlah seseorang memiliki masalah regresi berikut untuk:
di mana dan x 2 keduanya normals standar seperti: x p ∼ N ( 0 ,x1 x2 . Perhatikan saya menggunakan variabel prediktor standar sehingga saya tidak harus menormalisasi setelahnya. Untuk kesederhanaan saya juga tidak menyertakan intersep. Kita dapat segera menyelesaikan masalah regresi ini dengan menggunakan regresi linier standar. Jadi di R itu harus seperti ini:xhal∼ N( 0 , 1 )
Perhatikan baris terakhir. Hampir semua rutinitas regresi linier menggunakan dekomposisi QR untuk memperkirakan . Kami ingin menggunakan hal yang sama untuk masalah regresi ridge kami. Pada titik ini baca posting ini oleh @whuber; kami akan menerapkan prosedur ini dengan tepat . Singkatnya, kita akan menambah matriks desain asli X kitaβ X dengan matriks diagonal dan vektor respons kamiydenganpnol. Dengan cara itu kita akan dapat kembali mengungkapkan masalah regresi ridge asli(XTX+λI) - 1 XTysebagai ( ˉ X T ˉ X ) - 1 ˉ X T ˉ y mana ¯λ--√sayahal y hal ( XTX+ λ I)- 1XTy ( X¯TX¯)- 1X¯Ty¯ ¯ melambangkan versi augmented. Lihat slide 18-19 dari catatan ini juga untuk kelengkapannya, saya menemukannya cukup mudah. Jadi dalam R kami ingin beberapa hal berikut:
dan itu berhasil. OK, jadi kami mendapat bagian regresi ridge. Kita dapat menyelesaikannya dengan cara lain, kita dapat memformulasikannya sebagai masalah optimisasi di mana jumlah sisa kuadrat adalah fungsi biaya dan kemudian mengoptimalkannya, yaitu.minβ| | y¯- X¯β| |22 . Cukup yakin kita bisa melakukan itu:
yang seperti yang diharapkan lagi berfungsi. Jadi sekarang kita hanya ingin: mana β ≥minβ| | y¯- X¯β| |22 β≥ 0
yang menunjukkan bahwa tugas regresi ridge non-negatif yang asli dapat diselesaikan dengan merumuskan kembali sebagai masalah optimisasi terbatas yang sederhana. Beberapa peringatan:
optim
's L-BFGS-B argumen. Ini adalah pemecah vanilla R paling yang menerima batas. Saya yakin Anda akan menemukan lusinan pemecah yang lebih baik.Kode untuk poin 5:
sumber
Paket R glmnet yang mengimplementasikan jaring elastis dan karenanya laso dan ridge memungkinkan hal ini. Dengan parameter
lower.limits
danupper.limits
, Anda dapat menetapkan nilai minimum atau maksimum untuk setiap bobot secara terpisah, jadi jika Anda menetapkan batas bawah ke 0, itu akan melakukan jaring elastis non-negatif (laso / bubungan).Ada juga pembungkus python https://pypi.python.org/pypi/glmnet/2.0.0
sumber
Ingatlah bahwa kami mencoba untuk memecahkan:
setara dengan:
dengan beberapa aljabar:
Solusi dalam pseudo-python adalah melakukan:
untuk jawaban yang sedikit lebih umum.
sumber