R-cv.glmnet错误:矩阵必须具有相同的列数。

8

当我在使用glmnet包中的R语言cv.glmnet函数处理大型稀疏数据集时,经常会出现以下错误:

# Error: Matrices must have same number of columns in .local(x, y, ...)

我用随机生成的数据成功复现了错误:

set.seed(10)

X <- matrix(rbinom(5000, 1, 0.1), nrow=1000, ncol=5)
X[, 1] <- 0
X[1, 1] <- 1

Y <- rep(0, 1000)
Y[c(1:20)] <- 1

model <- cv.glmnet(x=X, y=Y, family="binomial", alpha=0.9, standardize=T, 
                   nfolds=4)

这可能与初始变量筛选有关(基于X和Y的内积)。glmnet不是将系数固定为零,而是从X矩阵中删除变量,并针对每个验证集执行此操作。然后,如果变量在某些验证集中被删除,在其他集合中保留,则会出现错误。
有时增加nfolds有所帮助。这符合假设,因为更高的nfolds意味着更大的验证子集和更小的丢弃任何变量的机会。
还要注意以下几点:
- 仅在alpha接近1(alpha=1等价于L1正则化)并使用标准化时出现错误。 - 采用family="Gaussian"不会出现错误。
你认为可能会发生什么事情?

我注意到你正在使用默认的lambda序列,这并不推荐,你应该提供自己的序列。 - smci
1个回答

13

这个例子存在问题,因为一个变量只有一个1,其他都是0。这是逻辑回归容易发散的情况(如果不正则化),因为将该系数推向无穷大(根据响应是正或负),将完美地预测该观察结果,而不会影响其他任何事情。

现在模型已经被正则化了,所以不应该出现这种情况,但它确实会引起问题。 我发现通过使alpha更小(接近岭,对于这个例子是0.5),问题就解决了。

真正的问题与每个折叠使用的lambda序列有关,但这有点技术性。我将尝试修复cv.glmnet中的错误,使此问题消失。

Trevor Hastie(glmnet维护人员)


我也收到了这个问题,非常感谢您的关注。 - Patrick McCann
我也遇到了这个错误,所以如果我理解正确的话,它只会在变量为零的情况下发生。假设我有一个二进制矩阵MAT,如果我将其更改为MAT=MAT+1,即更改其值,使0变为1,1变为2,那么它应该可以解决问题。这样说对吗? - yeinhorn
1
Trevor,这里有任何行为变化吗?或者我们可以跟踪Github问题吗? - Max Ghenis
我自己这个月也遇到了这个问题。指定lambda序列并没有解决问题。这个bug有被修复吗? - Kevin L. Keys

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