R 的 glmnet 投掷 "A and B inner dimensions must match",但他们已经这样做了

R's glmnet throwing "A and B inner dimensions must match", but they already do

我应该说,虽然我正在学习 glmnet 来解决这个问题,但我已经将相同的数据集与其他方法一起使用并且效果很好。

在这个过程中,我将我的数据分成训练集和测试集,全部格式化为矩阵,glmnet 毫无怨言地构建了模型。但是,当我尝试 运行 对 holdout 集的预测时,它会抛出以下错误:

glmfit <- glmnet(train_x_mat,train_y_mat, alpha=1)
glmpred <- predict(glmfit, s=glmfit$lambda.1se, new = test_x_mat)
# output:
Error in cbind2(1, newx) %*% nbeta : 
Cholmod error 'A and B inner dimensions must match' at file ../MatrixOps/cholmod_ssmult.c, line 82

但是,我知道 x_trainx_test 具有相同的列数:

ncol(test_x)
[1] 146
ncol(train_x)
[1] 146

我是 glmnet 的新手;我还需要做些什么让它配合吗?

编辑:

这是尺寸。为最初发布矢量而道歉。这可能是它的核心。

dim(train_x_mat)
[1] 1411  208
dim(test_x_mat)
[1] 352 204

这很奇怪,因为它们是这样创建的:

train_x_mat <- sparse.model.matrix(~.-1, data = train_x, verbose = F)
test_x_mat <- sparse.model.matrix(~.-1, data = test_x, verbose = F)

对于 运行 陷入此问题的任何其他人,即使看起来他们不应该陷入此问题,这个问题特别与 R 的 sparse.model.matrix 有关。它将分离一个因素的每个级别并为其提供自己的列。因此,如果您的数据集不是特别大,您的训练数据和测试数据可能有不同的列。

一个解决方案,要么向需要它们的矩阵添加额外的空白列,要么删除两者不共享的列。当然,如果您正在构建模型并期望获得新数据,则前者更可取。但无论如何,整个问题表明您的数据集对于这项工作来说太小了。