2012-06-21 41 views
6

Tôi đang sử dụng glmnet để dự đoán xác suất dựa trên một bộ 5 tính năng sử dụng mã sau. Tôi cần công thức thực tế vì tôi cần sử dụng nó trong một chương trình khác (không phải R).Diễn giải tên hệ số trong glmnet trong R

deg = 3 

glmnet.fit <- cv.glmnet(poly(train.matrix,degree=deg),train.result,alpha=0.05,family='binomial') 

Tên của các hệ số kết quả có năm vị trí (tôi giả sử đây là một trong mỗi đối tượng) và mỗi một trong số họ là một số giữa 0 và 3 (tôi giả sử đây là bậc của đa thức). Nhưng tôi vẫn còn bối rối về cách chính xác để tái tạo lại công thức.

Thực hiện các ví dụ:

> coef(glmnet.fit,s= best.lambda) 
(Intercept) -2.25e-01 
... 
0.1.0.0.1 3.72e+02 
1.1.0.0.1 9.22e+04 
0.2.0.0.1 6.17e+02 
... 

Hãy gọi các tính năng A, B, C, D, E. Đây có phải là cách công thức nên được giải thích?

Y = 
-2.25e-01 + 
... 
(3.72e+02 * (B * E) + 
(9.22e+04 * (A * B * E) + 
(6.17e+02 * (B^2 + E) 
... 

Nếu điều đó không đúng thì tôi nên diễn giải như thế nào?

Tôi đã thấy question and answer sau đây nhưng không giải quyết được các loại tên hệ số này.

Cảm ơn trước sự giúp đỡ của bạn.

Trả lời

6

Thông thường, chúng tôi sử dụng hàm dự đoán. Trong trường hợp của bạn, bạn cần các hệ số để sử dụng trong một chương trình khác. Chúng ta có thể kiểm tra sự thỏa thuận giữa việc sử dụng dự đoán và kết quả nhân dữ liệu với các hệ số.

# example data 

library(ElemStatLearn) 
library(glmnet) 
data(prostate) 

# training data 

data.train <- prostate[prostate$train,] 
y <- data.train$lpsa 

# isolate predictors 

data.train <- as.matrix(data.train[,-c(9,10)]) 

# test data 

data.test <- prostate[!prostate$train,] 
data.test <- as.matrix(data.test[,-c(9,10)]) 

# fit training model 

myglmnet =cv.glmnet(data.train,y) 

# predictions by using predict function 

yhat_enet <- predict(myglmnet,newx=data.test, s="lambda.min") 

# get predictions by using coefficients 

beta <- as.vector(t(coef(myglmnet,s="lambda.min"))) 

# Coefficients are returned on the scale of the original data. 
# note we need to add column of 1s for intercept 

testX <- cbind(1,data.test) 
yhat2 <- testX %*% beta 

# check by plotting predictions 

plot(yhat2,yhat_enet) 

Vì vậy, mỗi hệ số tương ứng với một cột trong dữ liệu đào tạo của bạn. Cái đầu tiên tương ứng với chặn. Tóm lại, bạn có thể trích xuất các hệ số và nhân với dữ liệu thử nghiệm để thu được kết quả mà bạn quan tâm.

+0

Cảm ơn phản hồi của bạn. Thật không may, tôi vẫn không chắc chắn làm thế nào để chuyển đổi các tên hệ số và giá trị thành một công thức. "Vì vậy, mỗi hệ số tương ứng với một cột trong dữ liệu đào tạo của bạn". Điều đó không thể đúng. Tôi có ~ 80 hệ số khác 0. Nhưng tôi chỉ có 5 cột dữ liệu huấn luyện. Tôi nghĩ rằng mỗi một trong những con số được phân tách theo thời gian đó có thể tương ứng với một trong các cột của tôi. Bất kỳ ý kiến ​​thứ hai? – dougp

+0

Kiểm tra các cột của: polyData <- poly (train.matrix, degree = deg). poly đang mở rộng dữ liệu đào tạo của bạn (từ 5 cols đến ~ 80) với đa thức trực giao. Đó là những gì bạn đang tìm kiếm? Bạn sẽ thấy rằng có các cột/tên mới và các cột này khớp với các hệ số. – julieth

+0

Tôi hiểu. Điều đó giúp ích rất nhiều. Cảm ơn bạn. Tôi đã thử điều này một lần mà không có "poly" và một lần với mức độ = 1 và mọi thứ rõ ràng hơn. Khi tôi nhìn vào điều này, có vẻ như việc xây dựng lại công thức chung của tôi là chính xác, ngoại trừ một điều. Tôi nghĩ rằng các tính năng A, B, C, D, E thực sự là đa thức trực giao (không phải là dữ liệu thô). – dougp

Các vấn đề liên quan