r语言 - cv.glmnet() 预测与使用 "class" 和 "response" 相反



我正试图根据lasso逻辑回归结果绘制roc曲线。所以我使用predict((,使用type="response"来获得概率。然而,结果与我输入type="class"时相反

首先,这是我的数据集。我的预测器有两级

selected_data$danger <- factor(selected_data$danger, levels = c(1,0))
lasso_data<-selected_data
str(lasso_data$danger)
# Factor w/ 2 levels "1","0": 1 1 1 1 1 1 1 1 1 1 ...
# partition
input_train <- createDataPartition(y=lasso_data$danger, p=0.8, list=FALSE)
train_dataset <- lasso_data[input_train,]
test_dataset <- lasso_data[-input_train,]
dim(train_dataset)
# [1] 768  62
dim(test_dataset)
# [1] 192  62

我确实运行了两个案例(类型=类,响应(进行比较。

lasso_model <- cv.glmnet( x=data.matrix(train_dataset[,-length(train_dataset)]), y = train_dataset[,length(train_dataset)],
family = "binomial" , type.measure = "auc",alpha=1, nfolds=5)

lasso_pred <- predict(lasso_model, newx=data.matrix(test_dataset[,-length(test_dataset)]),
s=lasso_model$lambda.min, type= "class", levels=c(1,0))
lasso_pred_resp <- predict(lasso_model, s="lambda.1se", newx=data.matrix(test_dataset[,-length(test_dataset)]), type="response", levels=c(1,0))

threshold <- 0.5 # or whatever threshold you use
pred <- ifelse(lasso_pred_resp>threshold, 1, 0)

table(lasso_pred, pred)
#           pred
# lasso_pred  0  1
#          0 11 95
#          1 76 10

我不知道为什么会发生这种事。。。如有任何帮助,我们将不胜感激。

对于R中的逻辑回归,概率或"响应"总是指第二级的概率,在您的情况下是"0"。

所以你的预测应该是:

pred <- ifelse(lasso_pred_resp>threshold, 0, 1)

为了避免混淆,你也可以做:

lvl <- levels(lasso_data$danger)
pred <- ifelse(lasso_pred_resp>threshold,lvl[2],lvl[1])

最新更新