首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从cv.glmnet中提取拟合值、残差和汇总统计数据

从cv.glmnet中提取拟合值、残差和汇总统计数据
EN

Stack Overflow用户
提问于 2020-04-05 11:48:40
回答 3查看 2.7K关注 0票数 0

我想知道如何从特定的lambda(例如"lambda.1se")的cv.glmnet对象中提取合适的值、残差和汇总统计信息。假设只有我可以访问cv.glmnet对象,而不是直接访问培训数据。下面是一个示例:

代码语言:javascript
运行
复制
data(iris)
Inx <- sample(nrow(iris),100)
iris$Species <- factor(iris$Species)

train_data <- iris[Inx, ]
test_data <- iris[-Inx,]

Formula <- "Sepal.Length ~ Sepal.Width + Petal.Length + Species:Petal.Width + 
            Sepal.Width:Petal.Length +  Species +  splines::bs(Petal.Width, df = 2, 
            degree = 2)"

代码语言:javascript
运行
复制
ModelMatrix <- predict(caret::dummyVars(Formula, train_data, fullRank = T,  
                       sep = ""), train_data)
cvglm <- glmnet::cv.glmnet(x = ModelMatrix,
                           y = train_data$Sepal.Length, nfolds = 4, keep = TRUE,  
                           alpha = 1, parallel = F, type.measure = 'mse') 

谢谢你的建议。

EN

回答 3

Stack Overflow用户

发布于 2020-04-05 12:25:35

拟合值:

代码语言:javascript
运行
复制
cvglm$glmnet.fit

Call:  glmnet(x = ModelMatrix, y = train_data$Sepal.Length, parallel = F,      alpha = 1) 

      Df   %Dev    Lambda
 [1,]  0 0.0000 7.047e-01
 [2,]  1 0.1341 6.421e-01
 [3,]  1 0.2454 5.851e-01
 [4,]  1 0.3378 5.331e-01
 [5,]  1 0.4146 4.857e-01
 [6,]  1 0.4783 4.426e-01
 ...omitted

摘要:

代码语言:javascript
运行
复制
do.call( 'cbind', list(lambda = cvglm$lambda, mean = cvglm$cvm, sd = cvglm$cvsd, cvup = cvglm$cvup, cvlo = cvglm$cvlo))       

            lambda      mean          sd      cvup       cvlo
 [1,] 0.7047388085 0.6245721 0.049917703 0.6744898 0.57465442
 [2,] 0.6421317551 0.5526067 0.058082258 0.6106889 0.49452443
 [3,] 0.5850865398 0.4815325 0.053453517 0.5349860 0.42807898
 [4,] 0.5331090641 0.4225556 0.049193377 0.4717490 0.37336222
 [5,] 0.4857491242 0.3736194 0.045278477 0.4188979 0.32834093
 ...omitted
票数 1
EN

Stack Overflow用户

发布于 2020-04-06 16:12:41

cv.glmnet对象不直接保存拟合值或残差。假设您至少有某种测试或验证矩阵(test_df可转换为test_matrix),则可以计算拟合值和残差。s函数的predict参数允许访问特定lambda的betas。

代码语言:javascript
运行
复制
fitted_values <- predict(cvglm, test_matrix, s = 'lambda.1se')

residuals <- test_df$actual_values - fitted_values

对于摘要统计,您可能希望访问cvglm$cvm参数。这是用于决定哪一个lambda生成最佳模型的误差交叉验证度量。在最初的文章中,type.measure参数被设置为mse,因此这个向量将是为每个lambda级别生成的MSE。

下面是如何找到lambda.1se的值:

代码语言:javascript
运行
复制
cvglm$cvm[cvglm$lambda == cvglm$lambda.1se]

从您的其他评论中,听起来您可能想要偏差比,这在cvglm$glmnet.fit$dev.ratio向量中是可以访问的。

代码语言:javascript
运行
复制
cvglm$glmnet.fit$dev.ratio[cvglm$lambda == cvglm$lambda.1se]

来自dev.ratio上的文档:

(零)偏差的分数解释(对于“elnet”,这是R-平方).The偏差计算,如果在模型中包含权重。解可见度定义为2*(loglike_sat - loglike),其中loglike_sat是饱和模型的对数似然(每观测到一个自由参数的模型)。因此dev.rate=1-dev/nulldev.

票数 1
EN

Stack Overflow用户

发布于 2020-04-06 18:36:02

我现在明白你的问题了,你把保持为真,并期望找到合适的值。所以让我们运行这个:

代码语言:javascript
运行
复制
cvglm <- glmnet::cv.glmnet(x = ModelMatrix,
                           y = train_data$Sepal.Length, nfolds = 4, keep = TRUE,  
                           alpha = 1, parallel = F, type.measure = 'mse') 

已安装的值存储在:

代码语言:javascript
运行
复制
dim(cvglm$fit.preval)
[1] 100 100

对于每一个lambda值都是1列。然而,这些

返回一个预先验证的数组,其中包含每个观测值和“lambda”值的拟合值。这意味着这些匹配是用这个观察结果计算出来的,其馀的褶皱被省略了。

在CV中,这些值是未拟合褶皱上的预测值,用于计算mse。因此,例如,我们可以为测试的lambda的第100次值返回交叉验证的mse:

代码语言:javascript
运行
复制
mean((cvglm$fit.preval[,100] - train_data$Sepal.Length)^2)
[1] 0.1072564

cvglm$cvm[100]
[1] 0.1072564

对于从汇总(lm())获得的通常摘要统计,您需要使用cvglm$glmnet下面的内容,但它没有提供方便的函数。这将是@ColinH在答案中所指出的,那就是手工计算它们。培训数据没有存储在对象中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61042096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档