我应该说虽然我正在学习glmnet来解决这个问题,但是我已经使用了与其他方法相同的数据集,并且它运行良好。
在这个过程中,我将我的数据分成训练和测试集,所有这些都被格式化为矩阵,并且glmnet构建了模型而没有抱怨。但是,当我尝试在保持集上运行预测时,它会抛出以下错误:
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_train
和x_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)
答案 0 :(得分:3)
对于遇到此问题的其他任何人,即使看起来他们不应该这样,问题仍然是R sparse.model.matrix
。它将分离每个级别的因子并赋予其自己的列。因此,如果您的数据集不是特别大,那么您的训练数据和测试数据可能会有不同的列。
解决方案要么将额外的空白列添加到需要它们的矩阵中,要么删除两者都不共享的列。当然,如果您正在构建模型并期望获得新数据,那么前者更可取。但无论如何,整个问题表明您的数据集太小而无法完成工作。