Jak wymusić, aby wagi były nieujemne w regresji liniowej


27

Korzystam ze standardowej regresji liniowej za pomocą scikit-learn w python. Chciałbym jednak wymusić, aby wagi były dodatnie dla każdej cechy (nie ujemne), czy jest jakiś sposób, aby to osiągnąć? Szukałem w dokumentacji, ale nie mogłem znaleźć sposobu na osiągnięcie tego. Rozumiem, że nie mogę znaleźć najlepszego rozwiązania, ale potrzebuję, aby wagi były nieujemne.

Odpowiedzi:


27

To, czego szukasz, to regresja nieujemna najmniejszych kwadratów . Jest to prosty problem optymalizacji w programowaniu kwadratowym, gdzie twoim ograniczeniem jest to, że wszystkie współczynniki (inaczej wagi) powinny być dodatnie.

To powiedziawszy, nie ma standardowej implementacji nieujemnych najmniejszych kwadratów w Scikit-Learn. Żądanie ściągnięcia jest nadal otwarte .

Ale wygląda na to, że Scipy zaimplementował to samo .

PS: Nie próbowałem wersji scipy. Znalazłem to wyłącznie przez przeglądanie stron.


1
co z regresją kalenicową, w której wymusza to pozytywne?
Charlie Parker

15

Korzystam z obejścia z Lasso w Scikit Learn (zdecydowanie nie jest to najlepszy sposób na robienie rzeczy, ale działa dobrze). Lasso ma parametr, positivektóry można ustawić Truei wymusić, aby współczynniki były dodatnie. Ponadto ustawienie współczynnika alpharegularyzacji na wartość bliską 0 powoduje, że Lasso naśladuje regresję liniową bez regularyzacji. Oto 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

Oto przykład, dlaczego chcesz to zrobić (i w przybliżeniu jak).

Mam 3 modele prognostyczne cen mieszkań: liniowy, zwiększanie gradientu, sieć neuronowa.

Chcę połączyć je w średnią ważoną i znaleźć najlepsze wagi.

Prowadzę regresję liniową i otrzymuję rozwiązanie z wagami takimi jak -3,1, 2,5, 1,5 i niektórymi punktami przechwytywania.

Więc zamiast tego używam sklearn

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

I otrzymuję dodatnie wagi, które sumują się (bardzo blisko) do 1. W moim przykładzie chcę, aby alfa działało najlepiej poza próbką, więc używam LassoCV z walidacją krzyżową.

Dokumenty sklearn stwierdzają, że nie powinieneś ustawiać alfa na 0 z powodów numerycznych, jednak możesz również użyć prostej Lasso () i ustawić parametr alfa tak niski, jak to tylko możliwe, aby uzyskać rozsądną odpowiedź.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.