Variabel kepentingan dari GLMNET

18

Saya melihat menggunakan laso sebagai metode untuk memilih fitur dan menyesuaikan model prediksi dengan target biner. Di bawah ini adalah beberapa kode yang saya mainkan untuk mencoba metode ini dengan regresi logistik yang teratur.

Pertanyaan saya adalah apakah saya mendapatkan sekelompok variabel "signifikan" tetapi apakah saya dapat menentukan urutannya untuk memperkirakan tingkat kepentingan relatif masing-masing? Dapatkah koefisien distandarisasi untuk keperluan peringkat ini dengan nilai absolut (saya mengerti bahwa koefisien ditunjukkan pada skala variabel asli melalui coeffungsi)? Jika ya, bagaimana cara melakukannya (menggunakan standar deviasi x dan y) Menstandarisasi Koefisien Koefisien .

KODE SAMPEL:

    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
sumber

Jawaban:

14

Sejauh yang saya tahu glmnet tidak menghitung kesalahan standar koefisien regresi (karena cocok dengan parameter model menggunakan keturunan koordinat siklik). Jadi, jika Anda memerlukan koefisien regresi standar, Anda perlu menggunakan beberapa metode lain (misalnya glm)

Karena itu, jika variabel penjelas distandarisasi sebelum fit dan glmnet disebut dengan "standardize = FALSE", maka koefisien yang kurang penting akan lebih kecil daripada yang lebih penting - sehingga Anda bisa memberi peringkat mereka hanya dengan besarnya. Ini menjadi lebih jelas dengan penyusutan jumlah non-sepele (yaitu lambda bukan nol)

Semoga ini membantu..

Yevgeny
sumber
2
Terima kasih. Saya percaya koin dikembalikan ke skala semula. Jadi kita perlu mengubah skala mereka (saya berasumsi dengan menggunakan teknik yang saya posting misalnya).
B_Miner
user6129 benar! Anda tidak mendapatkan sarana untuk menentukan peringkat variabel yang dipilih. Ini adalah area penelitian aktif.
suncoolsu
3
@ B_Miner: Anda benar, jika dipanggil dengan "standardize = TRUE" glmnet mengembalikan koefisien pada skala asli. Salah satu cara untuk menyiasatinya adalah dengan membakukan variabel penjelas di luar (misalnya menggunakan fungsi "skala ()" dan memanggil glmnet dengan "standardize = FALSE". Koefisien yang dihasilkan kemudian dapat diberi peringkat berdasarkan besarnya untuk menilai kepentingan mereka.
Yevgeny
@suncoolsu: tolong lihat jawaban saya yang diperbarui di atas
Yevgeny
@ Yevgeny Saya punya pertanyaan. Maka secara teknis, haruskah hasil kinerja (misalnya area di bawah kurva) sama apakah kita menetapkan 'standardize = FALSE' dan membakukan variabel sendiri atau kita hanya menggunakan 'standardize = TRUE'? (Hanya koefisien beta yang dikembalikan akan berbeda). Inilah yang saya pikirkan secara teoritis, tetapi dalam praktiknya, saya mendapatkan hasil yang sedikit lebih baik ketika saya menggunakan 'standardize = TRUE'. Karenanya, baik koefisien dan kinerja berbeda. Apakah ini seharusnya?
Michelle
7

Untuk mendapatkan koefisien dalam ruang yang memungkinkan Anda membandingkan kepentingannya secara langsung, Anda harus membakukannya. Saya menulis catatan tentang Thinklab untuk membahas standardisasi koefisien regresi logistik.

(Sangat) Singkatnya, saya menyarankan untuk menggunakan metode 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

Jika Anda mengandalkan standarisasi internal oleh glmnet (opsi default standardize = TRUE), koefisien terstandarisasi ini sebenarnya yang dihasilkan dari langkah pemasangan, sebelum mentransformasi ulang oleh glmnet di ruang asli (lihat catatan lain :-)).

Antoine Lizée
sumber
2
std_coefs <- coefs[-1, 1] * sds
b=bσx
Antoine - Bisakah Anda mengonfirmasi bahwa perkalian dan bukan pembagian itu benar di sini?
B_Miner
1
σx+bx+=+(bσx)(x-μ)/σx+...bσx=x
Ya, ini salah ketik (Pengingat lain untuk tidak pernah mengetik contoh tanpa menjalankan kode ;-)) Terima kasih karena sudah menemukannya, sudah diperbaiki.
Antoine Lizée
Ini memberikan koefisien standar yang benar, apakah glmnetobjek itu dibuat dengan standardize = TRUEatau standardize = FALSE, ya?
James Hirschorn