Używam cv.glmnet
do znajdowania predyktorów. Konfiguracja, której używam jest następująca:
lassoResults<-cv.glmnet(x=countDiffs,y=responseDiffs,alpha=1,nfolds=cvfold)
bestlambda<-lassoResults$lambda.min
results<-predict(lassoResults,s=bestlambda,type="coefficients")
choicePred<-rownames(results)[which(results !=0)]
Aby upewnić się, że wyniki są powtarzalne ja set.seed(1)
. Wyniki są bardzo zmienne. Uruchomiłem dokładnie ten sam kod 100, aby zobaczyć, jak zmienne były wyniki. W biegach 98/100 zawsze wybierano jeden konkretny predyktor (czasem tylko sam); inne predyktory zostały wybrane (współczynnik był niezerowy) zwykle 50/100 razy.
Mówi mi więc, że za każdym razem, gdy przeprowadzana jest walidacja krzyżowa, prawdopodobnie wybierze inną najlepszą lambda, ponieważ początkowa randomizacja fałdów ma znaczenie. Inni widzieli ten problem ( wyniki CV.glmnet ), ale nie ma sugerowanego rozwiązania.
Myślę, że może ten, który pokazuje 98/100, jest prawdopodobnie dość mocno skorelowany ze wszystkimi innymi? Wyniki należy ustabilizować jeśli po prostu uruchomić LOOCV ( ), ale jestem ciekaw, dlaczego są one tak zmiennej kiedy .
źródło
set.seed(1)
raz biegnieszcv.glmnet()
100 razy? To nie jest doskonała metodologia powtarzalności; lepiej naset.seed()
prawo przed każdym biegiem, inaczej utrzymuj foldids na stałym poziomie między biegami. Każde z twoich wywołańcv.glmnet()
dzwonisample()
N razy. Więc jeśli długość twoich danych kiedykolwiek się zmienia, zmienia się odtwarzalność.Odpowiedzi:
Chodzi o to, że w
cv.glmnet
K fałdy („części”) są wybierane losowo.W krzyżowej weryfikacji K-fałdów zestaw danych jest podzielony na części , a części K - 1 służą do przewidywania części K (odbywa się to razy K , za każdym razem przy użyciu innej części K ). Odbywa się to dla wszystkich lambd, i to ten, który daje najmniejszy błąd weryfikacji krzyżowej.K K−1 K K
lambda.min
Dlatego przy użyciu wyniki się nie zmieniają: każda grupa składa się z jednej, więc nie ma dużego wyboru dla grup K.nfolds=n K
Z
cv.glmnet()
podręcznika referencyjnego:MSE to ramka danych zawierająca wszystkie błędy dla wszystkich lambd (dla 100 przebiegów),
lambda.min
to twoja lambda z minimalnym średnim błędem.źródło
cv.glmnet(...)$lambda
. Moja alternatywa to naprawia: stats.stackexchange.com/a/173895/19676Następnie dla każdego predyktora otrzymuję:
W ten sposób uzyskuję dość solidny opis działania predyktora. Gdy masz już rozkłady dla współczynników, nie możesz uruchomić żadnych statystyk, które Twoim zdaniem warto uzyskać CI, wartości p itp., Ale jeszcze tego nie zbadałem.
Ta metoda może być używana z mniej więcej dowolną metodą selekcji, o której mogę myśleć.
źródło
Dodam inne rozwiązanie, które obsługuje błąd w @ Alice z powodu brakujących lambd, ale nie wymaga dodatkowych pakietów, takich jak @Max Ghenis. Podziękowania należą się wszystkim pozostałym odpowiedziom - każdy robi użyteczne punkty!
źródło
Odpowiedź Alicji działa dobrze w większości przypadków, ale czasami pomija błędy z powodu
cv.glmnet$lambda
czasami zwracających wyniki o różnej długości, np .:OptimLambda
poniżej powinno działać w ogólnym przypadku, a także jest szybsze, wykorzystującmclapply
do równoległego przetwarzania i unikania pętli.źródło
You can control the randomness if you explicitly set foldid. Here an example for 5-fold CV
Now run cv.glmnet with these foldids.
You will get the same results each time.
źródło