在R中使用glmnet时解释系数名称

6

我正在使用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)
...

如果这不正确,我应该如何解释它?
我看到了以下 问题和答案,但它没有涉及到这些系数名称的类型。
提前感谢你的帮助。
1个回答

8
通常,我们使用predict函数。在您的情况下,您需要使用另一个程序中的系数。我们可以检查使用predict和将数据乘以系数的结果之间的一致性。
# 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)

所以每个系数对应于您的训练数据中的一列。第一个系数对应于截距。总体而言,您可以提取���数并将其与测试数据相乘,以获得您感兴趣的结果。


谢谢您的回复。不幸的是,我仍然不确定如何将这些系数名称和值转换为公式。"所以每个系数对应于您的训练数据中的一列"。这不可能是真的。我有大约80个非零系数。但是我只有5列训练数据。我认为那些点号分隔的数字中的每一个都可能对应于我的一列。有什么意见吗? - dougp
请查看以下列:polyData <- poly(train.matrix,degree=deg)。poly函数使用正交多项式将训练数据(从5列扩展到约80列)。这是您要寻找的吗?您会发现有新的列/名称,它们与系数相匹配。 - julieth
我明白了,这非常有帮助,谢谢。我曾尝试过不使用“Poly”,以及将degree = 1,事情变得更加清晰。随着我对此的进一步研究,似乎我的公式整体重建是正确的,只有一点需要修改。我认为特征A、B、C、D、E实际上是正交多项式(而不是原始数据)。 - dougp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接