我想使用逻辑回归(我的输出是分类的)来执行套索回归,以从我的数据集中选择重要变量"数据"然后选择这些重要变量"变量"并在validationset x.test上测试它们并比较实际值的预测值,但是我得到了这个错误: cbind2(1,newx)%*%nbeta出错: Erreur Cholmod' X和/或Y的尺寸错误' dans le fichier ../MatrixOps/cholmod_sdmult.c,ligne 90
library(glmnet)
library(caret)
# class label must be factor 0 noevent, 1:anomalous
iris$Species<-ifelse(iris$Species=="setosa",0,1)
#data$Cardio1M=factor(data$Cardio1M)
#split data into train and test
trainIndex <- createDataPartition(iris$Species, p=0.7, list=FALSE)
data_train <- iris[ trainIndex,]
data_test <- iris[-trainIndex,]
x.train <- data.matrix (data_train [ ,1:ncol(data_train)-1])
y.train <- data.matrix (data_train$Species)
x.test <- data.matrix (data_test [,1:(ncol(data_test))-1])
y.test <- data.matrix(data_test$Species)
#fitting generalized linear modelalpha=0 then ridge regression is used, while if alpha=1 then the lasso
# of ?? values (the shrinkage coefficient)
#Associated with each value of ?? is a vector of regression coefficients. For example, the 100th value of ??, a very small one, is closer to perform least squares:
Lasso.mod <- glmnet(x.train, y.train, alpha=1, nlambda=100, lambda.min.ratio=0.0001,family="binomial")
#use 10 fold cross-validation to choose optimal ??.
set.seed(1)
#cv.out <- cv.glmnet(x, y, alpha=1,family="binomial", nlambda=100, lambda.min.ratio=0.0001,type.measure = "class")
cv.out <- cv.glmnet(x.train, y.train, alpha=1,family="binomial", nlambda=100, type.measure = "class")
#Ploting the misclassification error and the diferent values of lambda
plot(cv.out)
best.lambda <- cv.out$lambda.min
best.lambda
co<-coef(cv.out, s = "lambda.min")
#Once we have the best lambda, we can use predict to obtain the coefficients.
p<-predict(Lasso.mod, s=best.lambda, type="coefficients")[1:6, ]
p
我想测试所选功能是否有助于减少测试集上的错误,但即使使用虹膜数据集也出现错误
#Selection of the significant features(predictors)
inds<-which(co!=0)
variables<-row.names(co)[inds]
variables<-variables[!(variables %in% '(Intercept)')];
#predict output values based on selected predictors
p <- predict(cv.out, s=best.lambda, newx=x.test,type="class")
# Calculate accuracy
Accuracy<- mean(p==y.test)
答案 0 :(得分:1)
我试着留下一条评论说明出了什么问题,但是时间太长了,所以我必须发一个答案。此外,我知道以下是您收到错误的原因,但没有可重现的示例,我不能保证也没有其他问题。
主要问题是您使用的是x.test[, variables]
而不是x.test
。对象cv.out
包含所有变量名称,包括减少为0的变量名称,因此predict
命令不知道在哪里找到这些变量名称,因为您将x.test
分组为仅包括具有显着系数的变量。
即使是这种情况,它仍然无效。原因是您使用s = "lambda.min"
获得了重要的系数,但之后您尝试使用s=cv.out$lambda.1se
进行预测。问题是,如果有一些变量,例如X2在lambda.min
模型中归零,在lambda.1se
模型中可能仍然很重要。因此,当predict
命令尝试在x.test
中找到它时,它不能,因为它不在variables
中。
所以最后,你应该做的是:
p <- predict(Lasso.mod, s=best.lambda, newx=x.test, type="class")
您的代码也存在其他问题,但我不相信它们会导致错误消息。我希望这有帮助!
你还应该解决的问题是:
x.test
和x.train
时,请将length
更改为ncol
。实际上,在这两种情况下,您都需要data_test [,1:(ncol(data_test))-1]
。即使length
和ncol
在这种情况下会给出相同的数字,但如果它是矩阵而不是data.frame
则不会。此外,您还需要-1
部分,因为否则您将y
包含在x
中。type="response"
时将type=class"
更改为p
,否则您的Accuracy
将为0.(我在上面的代码中对其进行了更改)