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.