【问题标题】:R - cv.glmnet error: matrices must have same number of columnsR - cv.glmnet 错误:矩阵必须具有相同的列数
【发布时间】:2014-04-19 16:09:12
【问题描述】:

从具有大型稀疏数据集的 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 的数量越多意味着验证子集越大,并且在其中任何一个中删除变量的机会就越小。

一些补充说明:

错误仅出现在接近 1 的alphaalpha=1 相当于 L1 正则化)并使用标准化。 family="Gaussian" 不会出现。

你认为会发生什么?

【问题讨论】:

  • 我注意到您使用的是默认 lambda 序列,不建议这样做,您应该提供自己的序列。

标签: r glmnet


【解决方案1】:

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

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

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

Trevor Hastie(glmnet 维护者)

【讨论】:

  • 我也收到了这个问题,非常感谢您观看版块
  • 这个错误也发生在我身上,所以如果理解正确,它只发生在零变量的情况下,所以假设我有一个变量的二进制矩阵 MAT,如果我将它转换为 MAT=MAT +1,意味着将其值更改为 0 变为 1,1 变为 2 应该可以解决问题。这是正确的吗?
  • Trevor,这里有任何行为变化,或者我们可以跟踪 Github 问题吗?
  • 这个月我自己也遇到了这个问题。指定 lambda 序列并没有纠正问题。这个错误有没有得到修复?
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2020-12-07
相关资源
最近更新 更多