Jak wykonać nieujemną regresję kalenicy? Lasso nieujemne jest dostępne w scikit-learn
, ale dla grzbietu nie mogę wymusić nieujemności bety i rzeczywiście otrzymuję współczynniki ujemne. Czy ktoś wie, dlaczego tak jest?
Czy mogę również zastosować grzbiet w kategoriach zwykłych najmniejszych kwadratów? Przeniesiono to do innego pytania: Czy mogę wdrożyć regresję kalenicy w odniesieniu do regresji OLS?
Odpowiedzi:
Raczej anty-klimatyczna odpowiedź na „ Czy ktoś wie, dlaczego tak jest? ” Polega na tym, że po prostu nikomu nie zależy na wdrożeniu nieujemnej regresji grzbietu. Jednym z głównych powodów jest to, że ludzie już zaczęli wdrażać nieujemne elastyczne procedury sieciowe (na przykład tutaj i tutaj ). Elastyczna siatka zawiera regresję kalenicy jako specjalny przypadek (jeden zasadniczo ustawia część LASSO na zerową wagę). Prace te są stosunkowo nowe, więc nie zostały jeszcze włączone do scikit-learn lub podobnego pakietu ogólnego zastosowania. Możesz poprosić autorów tych artykułów o kod.
EDYTOWAĆ:
Ponieważ @amoeba i ja omawialiśmy te komentarze, faktyczna implementacja tego jest względnie prosta. Powiedzmy, że mamy następujący problem z regresją:
gdziex1 i x2 są standardowymi normami, takimi jak: xp∼N(0,1) . Zauważ, że używam standardowych zmiennych predykcyjnych, więc nie muszę później normalizować. Dla uproszczenia nie dołączam również przechwytywania. Możemy natychmiast rozwiązać ten problem regresji za pomocą standardowej regresji liniowej. Więc w R powinno być coś takiego:
Zwróć uwagę na ostatni wiersz. Prawie wszystkie procedury regresji liniowej wykorzystują rozkład QR do oszacowaniaβ . Chcielibyśmy użyć tego samego w naszym problemie z regresją kalenicy. W tym momencie przeczytaj ten post przez @whuber; będziemy wdrażać dokładnie tę procedurę. Krótko mówiąc, będziemy powiększać naszą oryginalną matrycę projektowąX z λ−−√Ip macierz diagonalna i nasz wektor odpowiedzi y z p zera W ten sposób będziemy mogli ponownie wyrazić pierwotny problem regresji kalenicy(XTX+λI)−1XTy tak jak (X¯TX¯)−1X¯Ty¯ gdzie ¯ symbolizuje wersję rozszerzoną. Sprawdź też kompletność slajdów 18–19 z tych notatek , uważam je za dość proste. Więc w R chcielibyśmy niektóre z następujących:
i to działa. OK, więc mamy część regresji grzbietu. Moglibyśmy rozwiązać w inny sposób, moglibyśmy sformułować go jako problem optymalizacji, w którym rezydualna suma kwadratów jest funkcją kosztu, a następnie zoptymalizować względem niej, tj.minβ||y¯−X¯β||22 . Rzeczywiście możemy to zrobić:
który zgodnie z oczekiwaniami znów działa. Teraz chcemy tylko: gdzie . Jest to po prostu ten sam problem optymalizacji, ale ograniczony, aby rozwiązanie nie było ujemne.minβ||y¯−X¯β||22 β≥0
co pokazuje, że pierwotne nieujemne zadanie regresji grzbietu można rozwiązać, zmieniając formułę jako prosty ograniczony problem optymalizacji. Niektóre zastrzeżenia:
optim
„a L-BFGS-B argumentu. Jest to najbardziej waniliowy solver R, który akceptuje granice. Jestem pewien, że znajdziesz dziesiątki lepszych rozwiązań.Kod dla punktu 5:
źródło
Pakiet R glmnet, który wprowadza elastyczną siatkę, a zatem pozwala na to lasso i grzbiet. Dzięki parametrom
lower.limits
iupper.limits
możesz ustawić minimalną lub maksymalną wartość dla każdej masy osobno, więc jeśli ustawisz dolne limity na 0, wykona ona nieujemną siatkę elastyczną (lasso / grzbiet).Istnieje również opakowanie Pythona https://pypi.python.org/pypi/glmnet/2.0.0
źródło
Przypomnijmy, że próbujemy rozwiązać:
jest równa:
z nieco większą algebrą:
Rozwiązaniem w pseudo-python jest po prostu:
patrz: W jaki sposób wykonuje się rzadkie nieujemne najmniejsze kwadraty za pomocą w postaci ?K x⊤Rkx
dla nieco bardziej ogólnej odpowiedzi.
źródło