Używam glmnet do obliczania oszacowań regresji grzbietu. Mam wyniki, które wzbudziły we mnie podejrzenia, ponieważ glmnet naprawdę robi to, co myślę. Aby to sprawdzić, napisałem prosty skrypt R, w którym porównuję wynik regresji grzbietu wykonanej przez rozwiązanie i ten w glmnet, różnica jest znacząca:
n <- 1000
p. <- 100
X. <- matrix(rnorm(n*p,0,1),n,p)
beta <- rnorm(p,0,1)
Y <- X%*%beta+rnorm(n,0,0.5)
beta1 <- solve(t(X)%*%X+5*diag(p),t(X)%*%Y)
beta2 <- glmnet(X,Y, alpha=0, lambda=10, intercept=FALSE, standardize=FALSE,
family="gaussian")$beta@x
beta1-beta2
Norma różnicy wynosi zwykle około 20, co nie może wynikać z różnych algorytmów numerycznych, muszę robić coś złego. Jakie ustawienia muszę ustawić glmnet
, aby uzyskać taki sam efekt jak w przypadku kalenicy?
Odpowiedzi:
Różnica, którą obserwujesz, wynika z dodatkowego podziału przez liczbę obserwacji N, które GLMNET wykorzystuje w swojej funkcji celu i domyślnej standaryzacji Y przez odchylenie standardowe próbki, jak pokazano poniżej.
gdzie używamy zamiast 1 / ( n - 1 ) dla s y , s y =1/n 1/(n−1) sy
Różniczkując względem beta, ustawiając równanie na zero,
I rozwiązując wersję beta, otrzymujemy oszacowanie,
Aby odzyskać dane szacunkowe (i odpowiadające im kary) na oryginale metryczny Y, GLMNET mnoży zarówno szacunki i lambdas by i powroty tych wyników do użytkownika,sy
λ
Porównaj to rozwiązanie ze standardową pochodną regresji kalenicy.
Zauważ, że jest skalowany przez dodatkowy czynnik N. Dodatkowo, gdy używamy lub funkcji, kara będzie domyślnie skalowane przez 1 / s y . To znaczy, kiedy używamy tych funkcji do uzyskania oszacowań współczynników dla niektórych λ ∗λ 1/sy λ∗ , faktycznie uzyskujemy oszacowania dla .λ=λ∗/sy
predict()
coef()
Na podstawie tych obserwacji, kara stosowana w GLMNET musi być skalowane przez czynnik .sy/N
Wyniki uogólniają się na włączenie przechwytywania i znormalizowanych zmiennych X. Modyfikujemy znormalizowaną macierz X, tak aby zawierała kolumnę jedynek, a macierz diagonalną, aby miała dodatkowy wpis zerowy w pozycji [1,1] (tj. Nie penalizować przecięcia). Następnie możesz unormować szacunki według odpowiednich odchyleń standardowych próbki (ponownie upewnij się, że używasz 1 / n przy obliczaniu odchylenia standardowego).
Dodano kod pokazujący znormalizowany X bez przechwytywania:
źródło
Według https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html , kiedy rodzina jest
gaussian
,glmnet()
powinna zminimalizowaćglmnet(x, y, alpha=1)
glmnet_2.0-13
glmnet(x, y, alpha=0)
For the lasso (α=1 ), scaling η back to report the penalty as ηsy makes sense. Then for all α , ηsy has to be reported as the penalty to maintain continuity of the results across α . This probably is the cause of the problem above. This is partly due to using (2) to solve (1). Only when α=0 or α=1 istnieje pewna równoważność między problemami (1) i (2) (tj. zgodność między λ w (1) i η w 2)). Dla każdego innegoα ∈ ( 0 , 1 ) , problemy (1) i (2) to dwa różne problemy z optymalizacją i nie ma żadnej relacji jeden do jednego między λ w (1) i η w 2).
źródło