Интерпретация имен коэффициентов в glmnet в R

Я использую glmnet для прогнозирования вероятностей на основе набора из 5 функций, используя следующий код. Мне нужна фактическая формула, потому что мне нужно использовать ее в другой (не R) программе.

deg = 3

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

Имена результирующих коэффициентов имеют пять позиций (я предполагаю, что это одна из каждой характеристики), и каждая из них представляет собой число от 0 до 3 (я предполагаю, что это степень многочлена). Но я все еще не понимаю, как именно восстановить формулу.

Возьмем, к примеру:

> 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
...

Назовем признаки A,B,C,D,E. Так ли следует интерпретировать формулу?

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

Если это не так, как я должен это интерпретировать?

Я видел следующий вопрос и ответ, но он не обращаться к этим типам имен коэффициентов.

Заранее спасибо за вашу помощь.


person dougp    schedule 21.06.2012    source источник


Ответы (1)


Обычно мы используем функцию прогнозирования. В вашем случае нужны коэффициенты для использования в другой программе. Мы можем проверить соответствие между использованием предсказания и результатом умножения данных на коэффициенты.

# 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)

Таким образом, каждый коэффициент соответствует столбцу в ваших обучающих данных. Первый соответствует перехвату. В общем, вы можете извлечь коэффициенты и умножить на данные теста, чтобы получить интересующие вас результаты.

person julieth    schedule 21.06.2012
comment
Спасибо за ваш ответ. К сожалению, я до сих пор не знаю, как преобразовать имена и значения этих коэффициентов в формулу. Таким образом, каждый коэффициент соответствует столбцу в ваших обучающих данных. Это не может быть правдой. У меня ~80 ненулевых коэффициентов. Но у меня есть только 5 столбцов обучающих данных. Я думаю, что каждое из этих чисел, разделенных точками, вероятно, соответствует одному из моих столбцов. Есть второе мнение? - person dougp; 21.06.2012
comment
Проверьте столбцы: polyData ‹- poly(train.matrix, Degree=deg). poly расширяет ваши тренировочные данные (с 5 столбцов до ~ 80) с помощью ортогональных полиномов. Это то, что вы ищете? Вы увидите, что есть новые столбцы/имена, и они соответствуют коэффициентам. - person julieth; 22.06.2012
comment
Я понимаю. Это очень помогает. Спасибо. Я попробовал это один раз без поли и один раз со степенью = 1, и все стало более ясно. Когда я углублюсь в это, окажется, что моя общая реконструкция формулы верна, за исключением одного момента. Я думаю, что функции A, B, C, D, E на самом деле являются ортогональными полиномами (а не необработанными данными). - person dougp; 22.06.2012