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

时间:2014-03-14 11:30:32

标签: r glmnet

使用大型稀疏数据集从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)

这可能与初始变量筛选有关(基于XY的内积)。而不是将系数固定为零glmnet从X矩阵中删除变量,这是针对每个验证集完成的。然后,如果某些变量被丢弃并保留在其他变量中,则会出现错误。

有时增加nfolds会有所帮助。这与假设一致,因为nfolds的数量越大意味着验证子集越大,并且在任何一个中丢弃变量的可能性就越小。

一些补充说明:

错误仅出现在alpha接近1(alpha=1相当于L1正则化)并使用标准化时。它不适用于family="Gaussian"

您认为可能会发生什么?

1 个答案:

答案 0 :(得分:10)

此示例存在问题,因为一个变量有一个1,其余变量为零。这是逻辑回归可能发散(如果不是正则化)的情况,因为将该系数驱动到无穷大(取决于响应的正负)将完美地预测该观察,而不会影响其他任何事物。

现在模型已经正规化,所以这不应该发生,但它确实会导致问题。 我发现通过使alpha变小(朝向脊,本例为.5),问题就消失了。

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

Trevor Hastie(glmnet维护者)