Zmienna ważność od GLMNET

18

Patrzę na użycie lasso jako metody wybierania cech i dopasowywania modelu predykcyjnego do celu binarnego. Poniżej znajduje się kod, z którym bawiłem się, aby wypróbować metodę ze znormalizowaną regresją logistyczną.

Moje pytanie brzmi: otrzymuję grupę „znaczących” zmiennych, ale czy jestem w stanie uporządkować je w celu oszacowania względnej ważności każdej z nich? Czy współczynniki można znormalizować w tym celu rangi według wartości bezwzględnej (rozumiem, że są pokazane w oryginalnej skali zmiennej poprzez coeffunkcję)? Jeśli tak, jak to zrobić (używając standardowego odchylenia xiy) Standaryzuj współczynniki regresji .

PRZYKŁADOWY KOD:

    library(glmnet)

    #data comes from

#http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic)

    datasetTest <- read.csv('C:/Documents and Settings/E997608/Desktop/wdbc.data.txt',head=FALSE)


#appears to use the first level as the target success
   datasetTest$V2<-as.factor(ifelse(as.character(datasetTest$V2)=="M","0","1"))


#cross validation to find optimal lambda
#using the lasso because alpha=1

    cv.result<-cv.glmnet(       
              x=as.matrix(dataset[,3:ncol(datasetTest)]),
              y=datasetTest[,2],        
              family="binomial",        
              nfolds=10,        
              type.measure="deviance",       
              alpha=1      
              )

#values of lambda used

    histogram(cv.result$lambda)

#plot of the error measure (here was deviance)
#as a CI from each of the 10 folds
#for each value of lambda (log actually)

    plot(cv.result) 

#the mean cross validation error (one for each of the
#100 values of lambda

    cv.result$cvm

#the value of lambda that minimzes the error measure
#result: 0.001909601

    cv.result$lambda.min
    log(cv.result$lambda.min)

#the value of lambda that minimzes the error measure
#within 1 SE of the minimum
#result: 0.007024236

    cv.result$lambda.1se

#the full sequence was fit in the object called cv.result$glmnet.fit
#this is same as a call to it directly.
#here are the coefficients from the min lambda

    coef(cv.result$glmnet.fit,s=cv.result$lambda.1se)
B_Miner
źródło

Odpowiedzi:

14

O ile mi wiadomo, glmnet nie oblicza standardowych błędów współczynników regresji (ponieważ pasuje do parametrów modelu przy użyciu cyklicznego opadania współrzędnych). Tak więc, jeśli potrzebujesz standardowych współczynników regresji, będziesz musiał użyć innej metody (np. Glm)

To powiedziawszy, jeśli zmienne objaśniające zostaną znormalizowane przed dopasowaniem, a glmnet zostanie wywołany z „standaryzuj = FAŁSZ”, wówczas mniej ważne współczynniki będą mniejsze niż te ważniejsze - aby można je było uszeregować według wielkości. Staje się to jeszcze bardziej wyraźne przy niebanalnym skurczu ilości (tj. Niezerowa lambda)

Mam nadzieję że to pomoże..

Jewgienij
źródło
2
dzięki. Uważam, że współczynniki są zwracane w oryginalnej skali. Trzeba je więc przeskalować (zakładam, na przykład, stosując technikę, którą opublikowałem).
B_Miner
user6129 ma rację! nie ma możliwości rankingu wybranych zmiennych. To aktywny obszar badań.
suncoolsu,
3
@B_Miner: masz rację, jeśli zostanie wywołany z „standize = TRUE”, glmnet zwraca współczynniki w oryginalnej skali. Jednym ze sposobów obejścia tego jest standaryzacja zmiennych objaśniających na zewnątrz (np. Za pomocą funkcji „scale ()”) i wywołanie glmnet za pomocą „standize = FALSE”. Uzyskane współczynniki można następnie uszeregować według wielkości, aby ocenić ich znaczenie.
Jewgienij
@ suncoolsu: proszę zobaczyć moją zaktualizowaną odpowiedź powyżej
Jewgienij
@Yevgeny Mam pytanie. Zatem technicznie, czy wyniki wydajności (np. Pole pod krzywą) powinny być takie same, niezależnie od tego, czy ustawiamy „standaryzacja = FAŁSZ” i sami standaryzujemy zmienne, czy po prostu używamy „standaryzacja = PRAWDA”? (Tylko zwrócone współczynniki beta byłyby inne). Teoretycznie tak myślę, ale w praktyce uzyskuję nieco lepsze wyniki, gdy używam „standaryzuj = PRAWDA”. Dlatego zarówno współczynniki, jak i wydajność są różne. Czy tak powinno być?
Michelle,
7

Aby uzyskać współczynnik w przestrzeni, która pozwala bezpośrednio porównać ich ważność, musisz je znormalizować. Napisałem notatkę na temat Thinklab, aby omówić standaryzację współczynników regresji logistycznej.

(Bardzo) Krótko mówiąc, radzę stosować metodę Agresti :

# if X is the input matrix of the glmnet function,
# and cv.result is your glmnet object:
sds <- apply(X, 2, sd)
cs <- as.matrix(coef(cv.result, s = "lambda.min"))
std_coefs <- coefs[-1, 1] * sds

Jeśli polegałeś na wewnętrznej standaryzacji przez glmnet (opcja domyślna standardize = TRUE), te znormalizowane współczynniki są w rzeczywistości tymi, które wynikają z kroku dopasowania, przed ponowną transformacją przez glmnet w pierwotnej przestrzeni (patrz inna uwaga :-)).

Antoine Lizée
źródło
2
std_coefs <- coefs[-1, 1] * sds
b=bσx
Antoine - Czy możesz potwierdzić, że mnożenie, a nie dzielenie jest tutaj właściwe?
B_Miner
1
σx+bx+=+(bσx)(x-μ)/σx+bσx=x
Tak, to literówka (jeszcze jedno przypomnienie, żeby nigdy nie pisać przykładów bez uruchamiania kodu ;-)) Dzięki za złapanie, zostało naprawione.
Antoine Lizée,
Daje to prawidłowe ustandaryzowane współczynniki, niezależnie od tego, czy glmnetobiekt został utworzony za pomocą, standardize = TRUEczy standardize = FALSEtak?
James Hirschorn