Cara memaksa bobot menjadi non-negatif dalam regresi Linear

27

Saya menggunakan regresi linier standar menggunakan scikit-learn in python. Namun, saya ingin memaksa bobot semua positif untuk setiap fitur (bukan negatif), apakah ada cara saya bisa mencapai itu? Saya mencari di dokumentasi tetapi tidak dapat menemukan cara untuk mencapai itu. Saya mengerti saya mungkin tidak mendapatkan solusi terbaik, tetapi saya perlu bobotnya menjadi non-negatif.

pengguna
sumber

Jawaban:

27

Apa yang Anda cari, adalah regresi kuadrat terkecil Non-negatif . Ini adalah masalah optimasi sederhana dalam pemrograman kuadratik di mana kendala Anda adalah bahwa semua koefisien (alias bobot) harus positif.

Karena itu, tidak ada implementasi standar kuadrat terkecil Non-negatif di Scikit-Learn. Permintaan tarik masih terbuka .

Tapi, sepertinya Scipy telah menerapkan hal yang sama .

PS: Saya belum pernah mencoba versi yang cekatan. Saya menemukannya hanya dengan mencari-cari di sekitar.

Dawny33
sumber
1
bagaimana dengan regresi ridge di mana ia dipaksa untuk positif?
Charlie Parker
15

Saya menggunakan solusi dengan Lasso di Scikit Learn (Ini jelas bukan cara terbaik untuk melakukan sesuatu tetapi bekerja dengan baik). Lasso memiliki parameter positiveyang dapat diatur ke Truedan memaksa koefisien menjadi positif. Selanjutnya, pengaturan koefisien Regularisasi alphaagar mendekati 0 menjadikan Lasso meniru Regresi Linier tanpa regularisasi. Ini kodenya:

from sklearn.linear_model import Lasso
lin = Lasso(alpha=0.0001,precompute=True,max_iter=1000,
            positive=True, random_state=9999, selection='random')
lin.fit(X,y)
Adarsh ​​Chavakula
sumber
0

Berikut adalah contoh mengapa Anda ingin melakukannya (dan kira-kira caranya).

Saya memiliki 3 model prediksi harga perumahan: linear, peningkatan gradien, jaringan saraf.

Saya ingin mencampurnya menjadi rata-rata tertimbang dan menemukan bobot terbaik.

Saya menjalankan regresi linier, dan saya mendapatkan solusi dengan bobot seperti -3.1, 2.5, 1.5, dan beberapa intersep.

Jadi yang saya lakukan malah menggunakan sklearn

blendlasso = LassoCV(alphas=np.logspace(-6, -3, 7),
                     max_iter=100000,
                     cv=5,
                     fit_intercept=False,
                     positive=True)

Dan saya mendapatkan bobot positif yang jumlahnya (sangat dekat) dengan 1. Dalam contoh saya, saya ingin alpha yang bekerja paling baik di luar sampel jadi saya menggunakan LassoCV dengan cross-validation.

Dokumen sklearn menyatakan bahwa Anda tidak boleh mengatur alpha ke 0 karena alasan numerik, namun Anda juga dapat menggunakan straight Lasso () dan mengatur parameter alpha serendah Anda bisa mendapatkan jawaban yang masuk akal.

McNuts berbatu
sumber