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)

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

有时增加有nfolds帮助。这与假设一致,因为数量越多nfolds意味着验证子集越大,并且在其中任何一个中删除变量的机会越小。

一些附加说明:

错误仅出现在alpha接近 1(alpha=1相当于 L1 正则化)和使用标准化的情况下。它没有出现family="Gaussian"

你认为会发生什么?

4

1 回答 1

13

这个例子是有问题的,因为一个变量只有一个 1,其余的都是零。这是逻辑回归可能发散(如果未正则化)的情况,因为将该系数驱动到无穷大(根据响应加减)将完美地预测该观察结果,并且不会影响其他任何事情。

现在模型是正则化的,所以这不应该发生,但它确实会导致问题。我发现通过使 alpha 更小(朝向山脊,在本例中为 0.5)问题就消失了。

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

Trevor Hastie(glmnet 维护者)

于 2014-03-17T01:18:02.710 回答