Przeglądam sekcję LAB §6.6 na temat regresji grzbietu / Lasso w książce „An Introduction to Statistics Learning with Applications in R” Jamesa, Witten, Hastie, Tibshirani (2013).
Mówiąc dokładniej, próbuję zastosować model scikit-learn Ridge
do zestawu danych „Hitters” z pakietu R „ISLR”. Stworzyłem ten sam zestaw funkcji, jak pokazano w kodzie R. Nie mogę jednak zbliżyć się do wyników z glmnet()
modelu. Wybrałem jeden parametr dostrajania L2 do porównania. (argument „alfa” w scikit-learn).
Pyton:
regr = Ridge(alpha=11498)
regr.fit(X, y)
http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Chapter%206.ipynb
R:
Zauważ, że argument alpha=0
w glmnet()
oznacza, że należy zastosować karę L2 (regresja Ridge'a). Dokumentacja ostrzega, aby nie wprowadzać pojedynczej wartości lambda
, ale wynik jest taki sam, jak w ISL, gdzie używany jest wektor.
ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)
Co powoduje różnice?
Edycja:
W przypadku korzystania penalized()
z pakietu z karą w R współczynniki są takie same jak w przypadku scikit-learn.
ridge.mod2 <- penalized(y,x,lambda2=11498)
Może pytanie może następnie być również: „Jaka jest różnica między glmnet()
i penalized()
robiąc regresji Ridge?
Nowe opakowanie Pythona dla rzeczywistego kodu Fortran używanego w pakiecie R glmnet
https://github.com/civisanalytics/python-glmnet
sklearn.linear_model.Ridge
dokonuje się niecentralizowanego oszacowania przechwytywania (standard), a kara jest taka, że||Xb - y - intercept||^2 + alpha ||b||^2
jest minimalizowanab
. Przed karą mogą występować czynniki1/2
lub1/n_samples
oba te czynniki , dzięki czemu wyniki są od razu różne. Aby oddzielić problem skalowania kary, ustaw karę na 0 w obu przypadkach, usuń wszelkie rozbieżności, a następnie sprawdź, co powoduje dodanie kary. A przy okazji tutaj IMHO jest właściwym miejscem do zadawania tego pytania.Odpowiedzi:
W mojej odpowiedzi brakuje współczynnika , proszę zobaczyć odpowiedź @visitors poniżej, aby uzyskać prawidłowe porównanie.1N
Oto dwa odniesienia, które powinny wyjaśnić związek.
Dokumentacja sklearn mówi, że
linear_model.Ridge
optymalizuje następującą funkcję celuPapier glmnet mówi, że elastyczna siatka optymalizuje następującą funkcję celu
Zauważ, że dwie implementacje używają na zupełnie różne sposoby, sklearn używa do ogólnego poziomu regularyzacji, podczas gdy glmnet używa do tego celu, rezerwując do handlu między regularyzacją grzbietu i lasso. α λ αα α λ α
Porównując formuły, wygląda na to, że ustawienie i w glmnet powinno odzyskać rozwiązanie .λ = 2 α sklearnα=0 λ=2αsklearn
linear_model.Ridge
źródło
standardize = FALSE
wglmnet()
celu uzyskania identycznych wyników.linear_model.Ridge
do jakiejkolwiek analizy świata rzeczywistego.linear_model.Ridge
model sklearn automatycznie standaryzuje funkcje. Normalizacja jest opcjonalna. Zastanawiam się, dlaczego muszę dezaktywować standaryzację,glmnet()
aby uzyskać identyczne wyniki w modelach.Odpowiedź Matthew Drury powinna mieć współczynnik 1 / N. Dokładniej...
Dokumentacja glmnet stwierdza, że elastyczna siatka minimalizuje funkcję strat
Dokumentacja sklearn mówi, że
linear_model.Ridge
minimalizuje funkcję stratco jest równoważne z minimalizacją
Aby uzyskać to samo rozwiązanie z glmnet i sklearn, obie funkcje utraty muszą być takie same. Oznacza to ustawienie i w glmnet.α=0 λ=2Nαsklearn
Wyjście glmnet: –0,03862100, –0,03997036, –0,07276511, 0,42727955
wydajność sklearn: –0,03862178, –0,0399697, –0,07276535, 0,42727921
źródło