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)
这只是为了确保测试集具有相同的尺寸。
看起来你只是把错误的东西分配给了 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. 您可能需要在回归之前解决缺失值和训练/测试分割问题
| 归档时间: |
|
| 查看次数: |
16316 次 |
| 最近记录: |