【问题标题】:glmnet predict method throwing cryptic errorglmnet预测方法抛出神秘错误
【发布时间】:2013-12-03 15:37:56
【问题描述】:

我正在尝试使用glmnet 进行预测,并收到一条非常神秘的错误消息。 我以前在使用glmnet 时没有遇到过这种情况,并且谷歌搜索错误没有结果。最后一行未注释时会发生错误。

library(ISLR)
library(glmnet)


Hitters=na.omit(Hitters)
Hitters$Salary = log(Hitters$Salary)

Hitters.train = Hitters[1:200,]
Hitters.test = Hitters[201:dim(Hitters)[1],]

x=model.matrix(Salary~.,Hitters)[,-1]
cv.out=cv.glmnet(x, Hitters$Salary, alpha=0)
bestlam=cv.out$lambda.min
ridge.mod=glmnet(x, Hitters$Salary, alpha=0,lambda=bestlam)

newx = data.matrix(Hitters.test)
#ridge.pred=predict(ridge.mod,s=bestlam,newx=newx)

错误输出:

Loading required package: Matrix
Loading required package: methods
Loaded glmnet 1.9-5

Error in as.matrix(cbind2(1, newx) %*% nbeta) : 
  error in evaluating the argument 'x' in selecting a method for function 'as.matrix': Error in t(.Call(Csparse_dense_crossprod, y, t(x))) : 
  error in evaluating the argument 'x' in selecting a method for function 't': Error: Cholmod error 'X and/or Y have wrong dimensions' at file ../MatrixOps/cholmod_sdmult.c, line 90
Calls: %*% -> %*% -> t
Calls: predict ... predict.elnet -> NextMethod -> predict.glmnet -> as.matrix
Execution halted

注意更改newx = data.matrix(Hitters.test)newx = model.matrix(Salary~.,Hitters.test) 没有帮助。

根据要求,这是sessionInfo()在运行前的输出。

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
[1] C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

这是运行后的输出:

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
[1] C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] glmnet_1.9-5 Matrix_1.1-0 ISLR_1.0

loaded via a namespace (and not attached):
[1] grid_3.0.2      lattice_0.20-23

【问题讨论】:

  • 希望看到sessionInfo() 的结果。这是由于Matrix 软件包的最近更新,或者Matrixglmnet 版本之间的不匹配造成的……?

标签: r glmnet


【解决方案1】:

原来我必须NULL 出回复。以下工作没有错误:

library(ISLR)
library(glmnet)


Hitters=na.omit(Hitters)
Hitters$Salary = log(Hitters$Salary)

Hitters.train = Hitters[1:200,]
Hitters.test = Hitters[201:dim(Hitters)[1],]

x=model.matrix(Salary~.,Hitters)[,-1]
cv.out=cv.glmnet(x, Hitters$Salary, alpha=0)
bestlam=cv.out$lambda.min
ridge.mod=glmnet(x, Hitters$Salary, alpha=0,lambda=bestlam)

Hitters.test$Salary <- NULL
newx = data.matrix(Hitters.test)
ridge.pred=predict(ridge.mod,s=bestlam,newx=newx)

【讨论】:

  • 你不是这样删除输入data.frame的一整列吗?它将如何让您在随后的预测函数中使用结果矩阵(缺少薪水列)?所有变量都需要匹配...
  • @theforestecologist,很抱歉,我没有足够的上下文来回答这个问题,因为它已经太长了。
  • 我只是评论一下,我对这个问题的解决方案是手动将我的 x 变量因子的水平设置为在我的初始训练数据和我的测试数据之间相同。
猜你喜欢
  • 2012-01-24
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2017-04-20
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多