9

我正在尝试使用glmnet. 我的代码如下:

bank <- read.table("http://www.stat.columbia.edu/~madigan/W2025/data/BankSortedMissing.TXT",header=TRUE)
bank$rich<-sample(c(0:1), 233, replace=TRUE)
    train=bank[1:200,];
    test=bank[201:233,]
    x=model.matrix(rich~., bank)[,-1]
    cv.out=cv.glmnet(x, train$rich, alpha=0, family="binomial")
ridge.mod=glmnet(x, train$rich, alpha=0, family="binomial")
    bank$rich <- NULL
newx = data.matrix(test$rich)
ridge.pred=predict(ridge.mod,newx=newx)

train = data[1:2500,];
test = data[2501:5088,];
x=model.matrix(Y~x1+x2+x3+x4+x5+x6, data)[,-1]
cv.out=cv.glmnet(x, data$Y, alpha=0, family="binomial")
    bestlam=cv.out$lambda.min
ridge.mod=glmnet(x, data$Y, alpha=0, family="binomial")
    test$Y <- NULL
newx = data.matrix(test)
ridge.pred = predict(ridge.mod,newx=newx, type="response")

使用预测时,我不断收到此错误消息:

as.matrix(cbind2(1, newx) %*% nbeta) 中的错误:在为函数“as.matrix”选择方法时评估参数“x”时出错:t(.Call(Csparse_dense_crossprod, y, t) 中的错误(x))):在为函数“t”选择方法时评估参数“x”时出错:错误:文件 ../MatrixOps/cholmod_sdmult.c 中的 Cholmod 错误“X 和/或 Y 尺寸错误”行90

我已经在“Hitters”数据集上尝试过这个,它工作得很好。

library(ISLR);
library(glmnet)
Hitters=na.omit(Hitters)

Hitters$Rich<-ifelse(Hitters$Salary>500,1,0)
Hitters.train = Hitters[1:200,]
Hitters.test = Hitters[201:dim(Hitters)[1],]
x=model.matrix(Rich~.,Hitters)[,-1]
cv.out=cv.glmnet(x, Hitters$Rich, alpha=0, family="binomial")
    bestlam=cv.out$lambda.min
ridge.mod=glmnet(x, Hitters$Rich, alpha=0,lambda=bestlam, family="binomial")
    Hitters.test$Rich <- NULL
newx = data.matrix(Hitters.test)
ridge.pred=predict(ridge.mod,newx=newx, type="response")
head(ridge.pred)
ridge.pred[1:10,]

有谁知道我该如何解决这个问题?

4

7 回答 7

6

我有同样的问题,我认为这是由于训练和测试集具有不同的因素,因此稀疏矩阵的维度不同。

我的解决方案是为组合数据集创建稀疏矩阵 X

traintest=rbind(training,testing)

X = sparse.model.matrix(as.formula(paste("y ~", paste(colnames(training[,-1]), sep = "", collapse=" +"))), data = traintest)
model = cv.glmnet(X[1:nrow(training),], training[,1], family = "binomial",type.measure = "auc",nfolds = 10)
plot(model)
model$lambda.min
#predict on test set
pred = predict(model, s='lambda.min', newx=X[-(1:nrow(training)),], type="response")

这只是为了确保测试集具有相同的维度。

于 2016-04-11T13:36:32.153 回答
2

看起来您只是将错误的东西分配给了 newx。代替:

bank$rich <- NULL newx = data.matrix(test$rich)

您想清空 test$rich 中的值,然后将 test 提供给 data.matrix。所以像: test$rich <- NULL newx = data.matrix(test) ridge.pred=predict(ridge.mod,newx=newx) 为我工作

此外,看起来您的原始数据框具有基于行的一些模式:200 之后的行NA具有newAccount. 您可能希望在回归之前解决缺失值和训练/测试拆分问题

于 2015-03-12T18:11:41.840 回答
0

我以前也看到过这个错误。我的数据集中的问题是我的训练和测试集中的因子变量具有不同的级别数。确保不是这种情况。

于 2016-03-18T23:43:30.953 回答
0

我遇到了同样的问题,并且遇到了同样的错误,最后上述方法对我不起作用,但我解决了问题!正如错误明确指出的那样,存在“尺寸错误”的问题。

关于我的数据

在我的例子中,我glmnet在一个尺寸为 36 x 895 的数据上训练了我的拟合,我的测试数据是 6 x 6。我的测试数据集中只有 6 列的原因是套索在s="lambda.min".

我的解决方案

我使用 Matrix 包中的稀疏矩阵来创建一个矩阵(你甚至可以使用普通矩阵):

sparsed_test_data <- Matrix(data=0,
                            nrow=nrow(test_data),
                            ncol=ncol(training_data),
                            dimnames=list(rownames(test_data),
                                          colnames(training_data)),
                            sparse = T)

然后我替换正确列中的值:

for(i in colnames(test_data)){
    sparsed_test_data[, i] <- test_data[, i]
}

现在预测功能工作正常。

于 2015-10-05T14:19:24.020 回答
0

我得到了同样的错误,因为训练和测试数据集由于不同的因素而具有不同的维度。问题是具有因子/分类数据的列被定义为字符列。因此,在将其拆分为训练和测试之前,我将这些列从字符列更改为因子列,并且成功了!

data$factor_column_a <- as.factor(data$factor_column_a)
于 2019-10-03T11:40:01.350 回答
0

我发布答案是因为这个问题仍然出现在搜索中。下面的代码运行。我在尝试复制该示例时遇到了几个问题。中缺少数据bank;我删除了这些意见。此外,生成的预测是常数 (0.4875),因为岭回归将除常数项之外的所有变量设置为(几乎)零(对于 的模拟值并不奇怪rich)。

library(caret) ## 6.0-81
library(glmnet) ## 2.0-16
url <- "http://www.stat.columbia.edu/~madigan/W2025/data/BankSortedMissing.TXT"
bank <- read.table(url, header=TRUE)
set.seed(1)
bank$rich <- sample(c(0:1), nrow(bank), replace=TRUE)
bank <- na.omit(bank)
trainbank <- bank[1:160, ]
testbank <- bank[161:200, ]
x <- model.matrix(rich~., trainbank)[,-1]
y <- trainbank$rich
cv.out <- cv.glmnet(x, y, alpha=0, family="binomial")
x.test <- model.matrix(rich ~ ., testbank)[,-1]
pred <- predict(cv.out, type='response', newx=x.test)
于 2018-12-24T05:43:13.990 回答
-2
ridge.mod_P@x  
coef(ridge.mod,s=cv.out$lambda.min)# coeffcience of lambda.min  
ridge.mod_P<-coef(ridge.mod,s=cv.out$lambda.min)  
ridge.mod_P  
matrix(ridge.mod_P@x)  
coe<-matrix(ridge.mod_P@x)  
coe2<-coe[-1,]#1  
newx16<-newx[,-17]  
newx16
newx16%*% matrix(coe2)# NA, This is reason of outputNA.
newx16<-newx[,-c(1,17)]  
coe2<-coe[-(1:2),]#16  
newx16%*% matrix(coe2)#yHat : coefficient and variable.
于 2018-01-30T11:54:04.093 回答