GLMNET'ten değişken önem


18

Kement özellikleri seçmek ve ikili bir hedef ile öngörülü bir model uydurmak için bir yöntem olarak bakıyorum. Aşağıda, düzenli lojistik regresyon yöntemini denemek için oynadığım bazı kodlar var.

Benim sorum bir grup "önemli" değişkenleri almak ama her birinin göreceli önemini tahmin etmek için bunları sıralamak mümkün mü? Katsayılar bu sıralama için mutlak değere göre standardize edilebilir coefmi (fonksiyonla orijinal değişken ölçeğinde gösterildiklerini anlıyorum )? Öyleyse, nasıl yapılır (x ve y'nin standart sapmasını kullanarak) Regresyon Katsayılarını Standartlaştırın .

BASİT 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)

Yanıtlar:


14

Bildiğim kadarıyla glmnet regresyon katsayılarının standart hatalarını hesaplamıyor (çünkü döngüsel koordinat inişini kullanarak model parametrelerine uyuyor). Dolayısıyla, standartlaştırılmış regresyon katsayılarına ihtiyacınız varsa, başka bir yöntem kullanmanız gerekir (örn. Glm)

Açıklayıcı değişkenler uyum ve glmnet çağrılmadan önce standartlaştırılırsa, "standardize = FALSE" ile çağrılırsa, daha az önemli katsayılar daha önemli olanlardan daha küçük olacaktır - böylece bunları sadece büyüklüklerine göre sıralayabilirsiniz. Bu önemsiz miktarda büzülme ile daha da belirgin hale gelir (yani sıfır olmayan lambda)

Bu yardımcı olur umarım..


2
Teşekkürler. Katsayının orijinal ölçekte geri döndüğüne inanıyorum. Bu yüzden onları yeniden ölçeklendirmek gerekir (örneğin yayınladığım tekniği kullanarak varsayalım).
B_Miner

user6129 doğru! seçilen değişkenleri sıralamanın bir yolu yoktur. Aktif bir araştırma alanı.
suncoolsu

3
@B_Miner: haklısınız, "standardize = TRUE" ile çağrılırsa glmnet orijinal ölçekte katsayıları döndürür. Bunu aşmanın bir yolu, açıklayıcı değişkenleri dışarıda standartlaştırmaktır (örn. "Scale ()" işlevini kullanarak) ve glmnet'i "standardize = FALSE" ile çağırmaktır. Elde edilen katsayılar daha sonra önemlerini değerlendirmek için büyüklüğe göre sıralanabilir.
Yevgeny

@suncoolsu: pls yukarıdaki güncellenmiş cevabımı gör
Yevgeny

@Yevgeny Bir sorum var. Daha sonra teknik olarak, 'standardize = FALSE' ayarlayıp değişkenleri kendimiz standardize edersek veya sadece 'standardize = TRUE' kullanırsak performans sonuçları (örneğin eğrinin altındaki alan) aynı mı olmalıdır? (Yalnızca döndürülen beta katsayıları farklı olacaktır). Teorik olarak böyle düşünüyorum, ama pratikte, 'standardize = TRUE' kullandığımda biraz daha iyi sonuçlar elde ediyorum. Dolayısıyla hem katsayılar hem de performans farklıdır. Böyle mi olmalı?
Michelle

7

Katsayılarını, önemlerini doğrudan karşılaştırmanıza izin veren bir alanda elde etmek için, bunları standartlaştırmanız gerekir. Thinklab'a lojistik regresyon katsayılarının standardizasyonunu tartışmak için bir not yazdım .

(Çok) Uzun lafın kısası, Agresti yöntemini kullanmanızı tavsiye ederim :

# 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

Eğer glmnet tarafından dahili standardizasyona güveniyorsanız (varsayılan seçenek standardize = TRUE), bu standartlaştırılmış katsayılar aslında orijinal alanda glmnet ile yeniden dönüşümden önce, montaj adımından kaynaklananlardır ( başka bir nota :-) bakın).


2
std_coefs <- coefs[-1, 1] * sds
b=bσx

Antoine - Burada bölünmenin değil çarpmanın doğru olduğunu onaylayabilir misiniz?
B_Miner

1
σx+bx+=+(bσx)(xμ)/σx+bσx=x

Evet, bir yazım hatası.
Antoine Lizée

Bu, glmnetnesne ile oluşturulmuş olsun standardize = TRUEveya olmasın, doğru standartlaştırılmış katsayıları verir standardize = FALSEmi?
James Hirschorn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.