预测Logistf

我正在使用一个名为logistf的R包来进行逻辑回归分析,发现这个包没有用于新数据的预测函数,而且predict包与之不兼容,所以我找到了一段代码,展示了如何对新数据进行预测:

fit<-logistf(Tax ~ L20+L24+L28+L29+L31+L32+L33+L36+S10+S15+S16+S17+S20, data=trainData) betas <- coef(fit)X <- model.matrix(fit, data=testData)probs <- 1 / (1 + exp(-X %*% betas))

我想使用fit$predictprobs生成的概率来创建一个交叉验证版本。是否有人之前做过类似的事情?

另外我想了解fit$predict,我正在进行二元逻辑回归,这个函数返回了多个值,这些值是属于类别0还是1?我如何判断这一点?谢谢


回答:

虽然你写的代码运行得很完美,但似乎有种更简洁的方法可以得到相同的结果:

    brglm_model <- brglm(formula = response ~ predictor , family = "binomial", data = train )brglm_pred <- predict(object = brglm_model, newdata = test , type = "response")

关于交叉验证,我想你需要写几行代码:

#设置折数和每折的实例数n_folds <- 5 fold_size <- nrow(dataset) %/% 5 residual <- nrow(dataset) %% 5#根据折数标记实例cv_labels <- c(rep(1,fold_size),rep(2,fold_size), rep(3,fold_size), rep(4,fold_size), rep(5,fold_size), rep(5,residual))#错误项会根据每个阈值不同而变化t_seq <- seq(0.1,0.9,by = 0.1)index_mat <- matrix(ncol = (n_folds+1) , nrow = length(t_seq))index_mat[,1] <- t_seq #计算每个折的CV错误的主要循环for (i in 1:5){        train <- dataset %>% filter(cv_labels != i)         test <- dataset %>% filter(cv_labels == i )        brglm_cv_model <- brglm(formula = response_var ~ . , family = "binomial", data = train )        brglm_cv_pred <- predict(object = brglm_model, newdata = test , type = "response")        #你想要的错误公式,例如分类错误        counter <- 0         for (treshold in t_seq ) {               counter <- counter + 1                conf_mat <- table( factor(test$response_var) , factor(brglm_cv_pred>treshold, levels = c("FALSE","TRUE") ))                sen <- conf_mat[2,2]/sum(conf_mat[2,])               #其他指标可以如下计算                #spec <- conf_mat[1,1]/sum(conf_mat[1,])               #prec <- conf_mat[2,2]/sum(conf_mat[,2])               #F1 <- (2*prec * sen)/(prec+sen)               #accuracy <- (conf_mat[1,1]+conf_mat[2,2])/sum(conf_mat)               #这里我只对敏感性感兴趣               index_mat[counter,(i+1)] <- sen         }}#最终数据框将是每个阈值敏感性的平均值 final_mat <- matrix(nrow = length(t_seq), ncol = 2 )final_mat[,1] <- t_seq final_mat[,2] <- apply(X = index_mat[,-1] , MARGIN = 1 , FUN = mean)final_mat <- data.frame(final_mat)colnames(final_mat) <- c("treshold","sensitivity")#为什么不看看模型在不同阈值下的CV敏感性呢?ggplot(data = final_mat) +         geom_line(aes(x = treshold, y = sensitivity ), color = "blue")

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注