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

时间:2015-03-12 15:14:35

标签: r probability prediction glmnet

我正在尝试使用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)出错:     评估论证的错误&#39; x&#39;在选择函数的方法时,as.matrix&#39;:t中的错误(.Call(Csparse_dense_crossprod,y,t(x))):     评估论证的错误&#39; x&#39;选择功能方法&#39;:错误:Cholmod错误&#39; X和/或Y的尺寸错误&#39;在文件../MatrixOps/cholmod_sdmult.c,第90行

我已经在&#34; Hitters&#34;数据集,它工作得非常好。

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,]

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

7 个答案:

答案 0 :(得分: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")

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

答案 1 :(得分:2)

看起来你只是将错误的东西分配给newx。而不是:

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

您希望将测试$ rich中的值清空,然后将测试反馈到data.matrix。所以类似于: test$rich <- NULL newx = data.matrix(test) ridge.pred=predict(ridge.mod,newx=newx) 为我工作

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

答案 2 :(得分:0)

我遇到了同样的问题而且我得到了同样的确切错误,最后我没有为我工作,但我解决了这个问题!由于错误清楚地表明,存在&#34;错误的维度&#34; 问题。

关于我的数据

在我的情况下,我训练glmnet适合尺寸为36 x 895的数据,我的测试数据为6 x 6.我的测试数据集中只有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]
}

现在预测功能正常。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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)

答案 5 :(得分:0)

由于训练和测试数据集由于不同的因素而具有不同的维度,因此我遇到了相同的错误。问题是将具有因子/类别数据的列定义为字符列。因此,在将其分为训练和测试之前,我将这些列从字符列更改为因子列,并且可以正常工作!

data$factor_column_a <- as.factor(data$factor_column_a)

答案 6 :(得分:-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.