Tầm quan trọng thay đổi từ GLMNET


18

Tôi đang xem xét sử dụng Lasso như một phương pháp để chọn các tính năng và điều chỉnh mô hình dự đoán với mục tiêu nhị phân. Dưới đây là một số mã tôi đã chơi để thử phương pháp với hồi quy logistic thường xuyên.

Câu hỏi của tôi là tôi có được một nhóm các biến "đáng kể" nhưng tôi có thể xếp thứ tự các biến này để ước tính tầm quan trọng tương đối của từng biến không? Các hệ số có thể được tiêu chuẩn hóa cho mục đích xếp hạng này theo giá trị tuyệt đối (tôi hiểu rằng chúng được hiển thị trên thang đo biến ban đầu thông qua coefhàm)? Nếu vậy, làm thế nào để làm như vậy (sử dụng độ lệch chuẩn của x và y) Chuẩn hóa các hệ số hồi quy .

MẪU MÃ SỐ:

    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)

Câu trả lời:


14

Theo như tôi biết thì glmnet không tính được các lỗi tiêu chuẩn của các hệ số hồi quy (vì nó phù hợp với các tham số mô hình sử dụng gốc tọa độ tuần hoàn). Vì vậy, nếu bạn cần các hệ số hồi quy được tiêu chuẩn hóa, bạn sẽ cần sử dụng một số phương pháp khác (ví dụ: glm)

Phải nói rằng, nếu các biến giải thích được chuẩn hóa trước sự phù hợp và glmnet được gọi là "standardize = FALSE", thì các hệ số ít quan trọng hơn sẽ nhỏ hơn các biến quan trọng hơn - vì vậy bạn có thể xếp hạng chúng theo độ lớn của chúng. Điều này càng trở nên rõ rệt hơn với độ co rút không tầm thường (tức là lambda khác không)

Hi vọng điêu nay co ich..


2
cảm ơn. Tôi tin rằng coeff được trả lại trên quy mô ban đầu. Vì vậy, người ta sẽ cần phải thay đổi quy mô của chúng (tôi giả sử bằng cách sử dụng kỹ thuật tôi đã đăng chẳng hạn).
B_Miner

người dùng6129 đúng! bạn không nhận được bất kỳ phương tiện xếp hạng các biến được chọn. Đó là một lĩnh vực hoạt động nghiên cứu.
suncoolsu

3
@B_Miner: bạn đã đúng, nếu được gọi với glmnet "standardize = TRUE" sẽ trả về các hệ số theo tỷ lệ ban đầu. Một cách để khắc phục điều đó là chuẩn hóa các biến giải thích bên ngoài (ví dụ: sử dụng hàm "scale ()") và gọi glmnet với "standardize = FALSE". Các hệ số kết quả sau đó có thể được xếp hạng theo độ lớn để đánh giá tầm quan trọng của chúng.
Yevgeny

@suncoolsu: vui lòng xem câu trả lời cập nhật của tôi ở trên
Yevgeny

@Yevgeny Tôi có một câu hỏi. Sau đó, về mặt kỹ thuật, các kết quả hiệu suất (ví dụ như khu vực dưới đường cong) có giống nhau hay không nếu chúng ta đặt 'standardize = FALSE' và tự chuẩn hóa các biến hoặc chúng ta chỉ sử dụng 'standardize = TRUE'? (Chỉ các hệ số beta được trả về sẽ khác nhau). Đây là những gì tôi nghĩ về mặt lý thuyết, nhưng trong thực tế, tôi nhận được kết quả tốt hơn một chút khi tôi sử dụng 'standardize = TRUE'. Do đó, cả hai hệ số và hiệu suất là khác nhau. Đây có phải là cách nó phải được?
Michelle

7

Để có được hệ số trong một không gian cho phép bạn so sánh trực tiếp tầm quan trọng của chúng, bạn phải chuẩn hóa chúng. Tôi đã viết một ghi chú trên Thinklab để thảo luận về tiêu chuẩn hóa các hệ số hồi quy logistic.

(Rất) Câu chuyện dài, tôi khuyên bạn nên sử dụng phương pháp 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

Nếu bạn dựa vào tiêu chuẩn hóa nội bộ bằng glmnet (tùy chọn mặc định standardize = TRUE), các hệ số được tiêu chuẩn hóa này thực sự là những hệ số từ bước phù hợp, trước khi truyền lại bằng glmnet trong không gian ban đầu (xem ghi chú khác :-)).


2
Tôi nghĩ rằng dòng cuối cùng của bạn nên được std_coefs <- coefs[-1, 1] * sds. Điều này tương ứng với ghi chú của bạn cho biết
b=bσx

Antoine - Bạn có thể xác nhận rằng phép nhân và không chia là thích hợp ở đây không?
B_Miner

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

Vâng, đó là một lỗi đánh máy (Một lời nhắc khác là không bao giờ gõ ví dụ mà không chạy mã ;-)) Cảm ơn bạn đã bắt nó, nó đã được sửa.
Antoine Lizée

Điều này đưa ra các hệ số chuẩn hóa chính xác, cho dù glmnetđối tượng được tạo bằng standardize = TRUEhay standardize = FALSE, có?
James Hirschorn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.