ตัวแปรสำคัญจาก GLMNET


18

ฉันกำลังดูการใช้ lasso เป็นวิธีการเลือกคุณสมบัติและปรับโมเดลการทำนายให้เหมาะสมกับเป้าหมายไบนารี ด้านล่างนี้เป็นรหัสที่ฉันเล่นด้วยเพื่อลองใช้วิธีที่มีการถดถอยโลจิสติกปกติ

คำถามของฉันคือฉันได้รับกลุ่มตัวแปร "สำคัญ" แต่ฉันสามารถจัดอันดับสิ่งเหล่านี้เพื่อประเมินความสำคัญสัมพัทธ์ของแต่ละรายการได้หรือไม่ สัมประสิทธิ์สามารถเป็นมาตรฐานสำหรับจุดประสงค์ของการจัดอันดับนี้ด้วยค่าสัมบูรณ์ (ฉันเข้าใจว่าพวกเขาจะแสดงในระดับตัวแปรดั้งเดิมผ่านcoefฟังก์ชั่น)? หากดังนั้นวิธีที่จะทำเช่นนั้น (ใช้ค่าเบี่ยงเบนมาตรฐานของ x และ y) วางมาตรฐานค่าสัมประสิทธิ์การถดถอย

รหัสตัวอย่าง:

    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)

คำตอบ:


14

เท่าที่ฉันรู้ glmnet ไม่ได้คำนวณข้อผิดพลาดมาตรฐานของสัมประสิทธิ์การถดถอย ดังนั้นหากคุณต้องการค่าสัมประสิทธิ์การถดถอยมาตรฐานคุณจะต้องใช้วิธีการอื่น (เช่น glm)

ต้องบอกว่าถ้าตัวแปรอธิบายได้มาตรฐานก่อนพอดีและ glmnet ถูกเรียกด้วย "standardize = FALSE" ค่าสัมประสิทธิ์ที่สำคัญน้อยกว่านั้นจะเล็กกว่าค่าที่สำคัญกว่า - ดังนั้นคุณสามารถจัดอันดับตัวแปรตามขนาดของมัน สิ่งนี้ยิ่งเด่นชัดยิ่งขึ้นด้วยการลดลงของปริมาณที่ไม่สำคัญ (เช่นแลมบ์ดาที่ไม่ใช่ศูนย์)

หวังว่านี่จะช่วย ..


2
ขอบคุณ ฉันเชื่อว่า coeff จะถูกส่งคืนในระดับเดิม ดังนั้นหนึ่งจะต้องปรับขนาดพวกเขา (ฉันถือว่าโดยใช้เทคนิคที่ฉันโพสต์ตัวอย่าง)
B_Miner

user6129 ถูกต้อง! คุณไม่ได้รับการจัดอันดับตัวแปรที่เลือก มันเป็นพื้นที่ของงานวิจัย
suncoolsu

3
@B_Miner: คุณถูกต้องถ้าเรียกด้วย "standardize = TRUE" glmnet จะคืนค่าสัมประสิทธิ์ในระดับเดิม วิธีหนึ่งที่จะหลีกเลี่ยงปัญหานี้ก็คือสร้างมาตรฐานของตัวแปรอธิบายนอก (เช่นใช้ฟังก์ชัน "scale ()") และเรียก glmnet ด้วย "standardize = FALSE" ค่าสัมประสิทธิ์ที่เกิดขึ้นนั้นสามารถถูกจัดอันดับตามขนาดเพื่อตัดสินความสำคัญของพวกเขา
Yevgeny

@suncoolsu: โปรดดูคำตอบที่อัปเดตของฉันด้านบน
Yevgeny

@Yevgeny ฉันมีคำถาม จากนั้นในทางเทคนิคแล้วผลการปฏิบัติงาน (เช่นพื้นที่ใต้เส้นโค้ง) จะเหมือนกันไม่ว่าเราจะตั้งค่า 'standardize = FALSE' และสร้างมาตรฐานให้กับตัวแปรของตัวเราเองหรือเราแค่ใช้ 'standardize = TRUE'? (เฉพาะค่าสัมประสิทธิ์เบต้าที่ส่งคืนเท่านั้นจะแตกต่างกัน) นี่คือสิ่งที่ฉันคิดในทางทฤษฎี แต่ในทางปฏิบัติฉันได้รับผลลัพธ์ที่ดีขึ้นเล็กน้อยเมื่อฉันใช้ 'standardize = TRUE' ดังนั้นทั้งค่าสัมประสิทธิ์และประสิทธิภาพจึงแตกต่างกัน นี่เป็นวิธีที่ควรหรือไม่
มิเชล

7

ในการรับค่าสัมประสิทธิ์ในพื้นที่ที่ให้คุณเปรียบเทียบความสำคัญโดยตรงคุณต้องสร้างมาตรฐาน ฉันเขียนบันทึกใน Thinklab เพื่อหารือเกี่ยวกับมาตรฐานของสัมประสิทธิ์การถดถอยโลจิสติก

(มาก) เรื่องสั้นยาวฉันแนะนำให้ใช้วิธี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

หากคุณพึ่งพามาตรฐานภายในโดย glmnet (ตัวเลือกเริ่มต้นstandardize = TRUE) สัมประสิทธิ์มาตรฐานเหล่านี้เป็นสิ่งที่เกิดจากขั้นตอนที่เหมาะสมก่อนที่จะทำการส่งต่อโดย glmnet ในพื้นที่เดิม (ดูหมายเหตุอื่น :-))


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

แอนทอน - คุณสามารถยืนยันได้ว่าการคูณและการหารไม่เหมาะสมหรือไม่
B_Miner

1
σx+x+=+(σx)(x-μ)/σx+...σx=x

ใช่มันเป็นตัวพิมพ์ผิด (ยังเป็นเครื่องเตือนความจำอีกอย่างว่าอย่าพิมพ์ตัวอย่างโดยไม่ต้องใช้รหัส ;-)) ขอบคุณที่จับมันมันได้รับการแก้ไขแล้ว
แอนทอนLizée

สิ่งนี้ให้ค่าสัมประสิทธิ์มาตรฐานที่ถูกต้องไม่ว่าจะสร้างglmnetวัตถุด้วยstandardize = TRUEหรือstandardize = FALSEใช่
James Hirschorn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.