使用大型稀疏数据集从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"
。
您认为可能会发生什么?
答案 0 :(得分:10)
此示例存在问题,因为一个变量有一个1,其余变量为零。这是逻辑回归可能发散(如果不是正则化)的情况,因为将该系数驱动到无穷大(取决于响应的正负)将完美地预测该观察,而不会影响其他任何事物。
现在模型已经正规化,所以这不应该发生,但它确实会导致问题。 我发现通过使alpha变小(朝向脊,本例为.5),问题就消失了。
这里真正的问题是每个折叠使用的lambda序列,但这有点技术性。我将尝试修复cv.glmnet,使这个问题消失。
Trevor Hastie(glmnet维护者)