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

7 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")
Run Code Online (Sandbox Code Playgroud)

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

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,]
Run Code Online (Sandbox Code Playgroud)

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

小智 5

我遇到了同样的问题,我认为这是由于训练和测试集具有不同的因素而导致的,因此稀疏矩阵的维数不同。

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

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


jim*_*imu 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. 您可能需要在回归之前解决缺失值和训练/测试分割问题