预测glmnet中概率的函数错误?

问题描述 投票:6回答:6

我试图使用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'时出错:错误:文件中的Cholmod错误'X和/或Y有错误的维'../MatrixOps/cholmod_sdmult.c,line 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,]

有谁知道我怎么解决这个问题?

r probability prediction glmnet
6个回答
4
投票

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

我的解决方案是为组合数据集创建稀疏矩阵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")

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


2
投票

看起来你只是把错误的东西分配给newx。代替:

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

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

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


0
投票

我有同样的问题,我得到了同样的确切错误,最后非上述工作对我来说,但我解决了这个问题!由于错误清楚地表明,存在“错误的维度”问题。

About my data

在我的情况下,我训练我的glmnet适合尺寸为36 x 895的数据,我的测试数据是6 x 6.我的测试数据集中只有6列的原因是当s="lambda.min"时套索选择了这6个特征。

My solution

我使用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]
}

现在预测功能正常。


0
投票

我之前也见过这个错误。我的数据集中的问题是我的训练和测试集中的因子变量具有不同的级别数。确保情况并非如此。


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)

-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.
© www.soinside.com 2019 - 2024. All rights reserved.