Wdrażam regresję Ridge'a w module Python / C i natrafiłem na ten „mały” problem. Chodzi o to, że chcę próbować efektywne stopnie swobody mniej więcej równomiernie rozmieszczone (jak wykres na stronie 65 w „Elementach uczenia statystycznego” ), tj. Próbka:
Jak sugeruje tytuł, muszę próbkować z do w pewnej skali, tak że jest próbkowany (w przybliżeniu), powiedzmy, w przedziałów od do ... czy jest to łatwy sposób? Myślałem, że rozwiązując równanie dla każdego przy użyciu metody Newtona-Raphsona, ale to doda zbyt wiele iteracji, szczególnie gdy jest duże. Jakieś sugestie?
ridge-regression
Néstor
źródło
źródło
Odpowiedzi:
To długa odpowiedź . Podajmy tutaj jego krótką wersję.
R
nieobecny przy jakichkolwiek próbach optymalizacji, może obliczyć siatkę o wielkości 100 przy w ciągu kilku sekund. Starannie napisany kod zmniejszyłby to o co najmniej 2–3 rzędy wielkości.C
Istnieją dwa schematy podane poniżej, aby zagwarantować monotoniczną konwergencję. Jeden wykorzystuje granice pokazane poniżej, które wydają się pomagać czasami w zachowaniu kroku Newtona lub dwóch.
Przykład : i jednolita siatka dla stopni swobody wielkości 100. Wartości własne są rozkładem Pareto, a zatem bardzo wypaczonym. Poniżej znajdują się tabele liczby kroków Newtona, aby znaleźć każdy katalog główny.p=100000
Ogólnie rzecz biorąc, nie będzie dla tego rozwiązania w formie zamkniętej , ale istnieje wiele struktur, które można wykorzystać do tworzenia bardzo skutecznych i bezpiecznych rozwiązań przy użyciu standardowych metod wyszukiwania root.
Zanim zagłębimy się zbyt głęboko w rzeczy, zbierzmy pewne właściwości i konsekwencje funkcji
Właściwość 0 : jest racjonalną funkcjądf λ . (Wynika to z definicji.)
df(λ)−y=0 p p
Konsekwencja 0 : Nie będzie ogólnego rozwiązania algebraicznego dla znalezienia pierwiastka . Wynika to z faktu, że istnieje równoważny wielomianowy problem ze znalezieniem pierwiastka stopnia a więc jeśli nie jest bardzo małe (tj. Mniej niż pięć), nie będzie ogólnego rozwiązania. Potrzebujemy więc metody numerycznej.
Właściwość 1 : Funkcja jest wypukła i maleje w . (Weź pochodne.) Konsekwencja 1 (a) : Algorytm znajdowania pierwiastka Newtona zachowa się bardzo ładnie w tej sytuacji. Niech będą pożądanymi stopniami swobody, a . Konsekwencja 1 (b) : Ponadto, jeśli zaczynamy od , wówczas pierwszydf λ≥0
y λ0 odpowiednim pierwiastkiem, tj. . W szczególności, jeśli zaczniemy od dowolnej wartości początkowej (więc, ), to sekwencja iteracji kroku Newtona zbiegnie się monotonicznie do unikalne rozwiązaniey=df(λ0) λ1<λ0 df(λ1)>y λ1,λ2,… λ0
λ1>λ0 krok dałby , skąd monotonicznie wzrośnie do rozwiązania na podstawie poprzedniej konsekwencji (patrz zastrzeżenie poniżej). Intuicyjnie ten ostatni fakt wynika, ponieważ jeśli zaczniemy na prawo od nasady, pochodna jest „zbyt” płytka z powodu wypukłości więc pierwszy krok Newtona zabierze nas gdzieś na lewo od nasady. Uwaga: Ponieważ nie jest ogólnie wypukłe dla ujemnegoλ2≤λ0 df df λ , to stanowi silny powód, aby preferować rozpoczęcie od lewej strony żądanego katalogu głównego. W przeciwnym razie musimy dokładnie sprawdzić, czy krok Newtona nie spowodował ujemnej wartości szacowanego pierwiastka, co może umieścić nas gdzieś w niep wypukłej części .
Konsekwencja 1 (c) : Po znalezieniu katalogu głównego dla niektórych a następnie szukamy katalogu głównego dla niektórych , używając taki sposób, że jako nasze początkowe przypuszczenie gwarantuje, że zaczynamy na lewo od drugiego katalogu głównego. Zatem nasza konwergencja jest odtąd monotoniczna.df
y1 y2<y1 λ1 df(λ1)=y1
Właściwość 2 : Istnieją rozsądne granice zapewniające „bezpieczne” punkty początkowe. Używając argumentów wypukłości i nierówności Jensena, mamy następujące granice Konsekwencja 2 : To mówi nam, że root spełniający posłuszny Tak więc, do wspólnej stałej, rdzeń między środkami harmonicznymi i arytmetycznymi .
Zakłada się, że dla wszystkich . Jeśli tak nie jest, to ta sama granica obowiązuje, biorąc pod uwagę tylko dodatnie i zastępując liczbą dodatnich . NB : Ponieważ przy założeniu, że wszystkie , to , skąd granice są zawsze nietrywialne (np. Dolna granica jest zawsze nieujemna).di>0 i di p di df(0)=p di>0 y∈(0,p]
Oto wykres „typowego” przykładu z . Nałożyliśmy siatkę o rozmiarze 10 dla stopni swobody. Są to poziome linie na wykresie. Pionowe zielone linie odpowiadają dolnej granicy w .df(λ) p=400 (⋆)
Algorytm i przykładowy kod R.
Bardzo skutecznym algorytmem posiadającym siatkę pożądanych stopni swobody w jest sortowanie ich w malejącej kolejności, a następnie sekwencyjne znajdowanie pierwiastka każdego z nich, przy użyciu poprzedniego pierwiastka jako punktu początkowego dla następujących elementów 1. Możemy to udoskonalić, sprawdzając, czy każdy pierwiastek jest większy niż dolna granica dla następnego pierwiastka, a jeśli nie, możemy zamiast tego rozpocząć następną iterację od dolnej granicy.y1,…yn (0,p]
Oto przykładowy kod
R
bez żadnych prób jego optymalizacji. Jak widać poniżej, wciąż jest dość szybki, choćR
- mówiąc grzecznie - przerażająco, okropnie, strasznie wolno w pętlach.Poniżej znajduje się końcowy pełny algorytm, który pobiera siatkę punktów i wektor (di nie !).d2i
Przykładowe wywołanie funkcji
źródło
Ponadto istnieje kilka metod, które skutecznie obliczą pełną ścieżkę regularyzacji:
Powyżej są wszystkie pakiety R, ponieważ używasz Pythona, scikit-learn zawiera implementacje dla ridge, lasso i elastycznej siatki.
źródło
ols
Funkcji w Rrms
pakiecie można użyć optymalizacji numerycznej, aby znaleźć optymalne kary za pomocą skutecznej AIC. Ale musisz podać maksymalną karę, która nie zawsze jest łatwa.Możliwą alternatywą według poniższego źródła wydaje się być:
Rozwiązanie w postaci zamkniętej:df(λ)=tr(X(X⊤X+λIp)−1X⊤)
Jeśli używasz równania normalnego jako solwera lub obliczasz oszacowanie wariancji-kowariancji, powinieneś już obliczyć . Podejście to działa najlepiej, jeśli szacujesz współczynniki dla różnych λ .(X⊤X+λIp)−1 λ
Źródło: https://onlinecourses.science.psu.edu/stat857/node/155
źródło