Lineer regresyonda ağırlıkları negatif olmaya zorlama


27

Python'da scikit-learn kullanarak standart bir doğrusal regresyon kullanıyorum. Bununla birlikte, ağırlıkları her özellik için negatif (negatif değil) tümüyle pozitif olmaya zorlamak istiyorum, bunu başarabilmemin bir yolu var mı? Belgelere bakıyordum ama bunu başarmanın bir yolunu bulamadım. Anladığım kadarıyla en iyi çözümü alamayabilirim, ancak ağırlıkların negatif olmamasına ihtiyacım var.

Yanıtlar:


27

Aradığın şey negatif olmayan en küçük kare regresyondur . İkinci dereceli programlamada, kısıtlamanızın tüm katsayıların (diğer bir deyişle ağırlıklar) pozitif olması gerektiği basit bir optimizasyon problemidir.

Bunu söyledikten sonra , Scikit-Learn'de negatif olmayan en küçük karelerin standart bir uygulaması yoktur . Çekme isteği hala açık .

Ancak, Scipy de aynı şeyi yapmış gibi görünüyor .

Not: Ben scipy sürümünü denemedim. Ben sadece etrafta dolaşarak buldum.


1
Olumlu olmaya zorlanan sırt regresyonuna ne dersiniz?
Charlie Parker,

15

Scikit Learn'de Lasso ile bir geçici çözüm kullanıyorum (Bu, işleri yapmanın en iyi yolu değil, ama iyi çalışıyor). Lasso, positiveayarlanabilecek Trueve katsayıları pozitif olmaya zorlayacak bir parametreye sahiptir . Dahası, Düzenleme katsayısının alpha0'a yakın olacak şekilde ayarlanması, Lasso'yu Doğrusal Regresyon'u düzensiz hale getirmeden yapar. İşte kod:

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)

0

İşte neden yapmak istediğinizi gösteren bir örnek (ve yaklaşık olarak nasıl).

3 Konut modeline ilişkin tahmin modellerine sahibim: doğrusal, gradyan artırma, sinir ağı.

Onları ağırlıklı bir ortalamaya karıştırmak ve en iyi ağırlıkları bulmak istiyorum.

Doğrusal regresyon yapıyorum ve -3.1, 2.5, 1.5 gibi ağırlıklar ve bazı engellemeler ile bir çözüm buluyorum.

Öyleyse yaptığım şey sklearn kullanmak.

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

Ve 1 (1'e çok yakın) olan pozitif ağırlıklar elde ediyorum. Örneğimde, örneklem dışında en iyi çalışan alfa'yı istiyorum, böylece LassoCV'yi çapraz doğrulama ile kullanıyorum.

Sklearn belgeleri, sayısal nedenlerden dolayı alfa değerini 0 olarak ayarlamamanız gerektiğini belirtir, ancak düz Lasso () kullanabilir ve alfa parametresini makul bir yanıt almak için elinizden geldiğince düşük olarak ayarlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.