如何在R语言中为LASSO逻辑回归绘制ROC曲线?
绘制LASSO逻辑回归的ROC曲线(glmnet包)
嗨,我来帮你搞定这个问题~首先得先把你的模型训练代码补全,然后一步步生成预测概率、计算ROC指标并绘制曲线。下面是具体步骤:
1. 补全并完成模型训练
你的cv.glmnet代码还没写完,先把它补全,同时加上随机种子保证结果可复现:
set.seed(123) # 固定随机种子,让交叉验证结果可重复 t1 <- Sys.time() glmnet_classifier <- cv.glmnet( x = dtm_train_tfidf, y = tweets_train[['sentiment']], family = 'binomial', # 二分类逻辑回归 alpha = 1, # 启用L1惩罚(LASSO) type.measure = "auc", # 用AUC作为交叉验证的评估指标 nfolds = 5 # 5折交叉验证 ) t2 <- Sys.time() cat("模型训练耗时:", round(difftime(t2, t1, units = "secs"), 2), "秒\n")
2. 获取最优Lambda值
cv.glmnet会自动计算两个实用的Lambda值:
lambda.min: 对应交叉验证误差最小的Lambdalambda.1se: 对应比最小误差大1个标准误差的Lambda,模型更简洁、泛化性可能更好
你可以根据需求选择,这里我们先以lambda.min为例。
3. 生成预测概率
要画ROC曲线,首先需要模型对样本的正类预测概率。假设你有测试集dtm_test_tfidf和对应的标签tweets_test[['sentiment']],生成概率的代码如下:
# 生成正类的预测概率(type="response"输出0-1之间的概率) pred_probs <- predict( glmnet_classifier, newx = dtm_test_tfidf, s = glmnet_classifier$lambda.min, # 使用最优Lambda type = "response" )
如果你想画训练集的ROC曲线,只需要把
newx换成dtm_train_tfidf,标签换成tweets_train[['sentiment']]即可,但更推荐看测试集的ROC,它能反映模型的真实泛化能力。
4. 绘制ROC曲线
这里给你两种常用的实现方式,选你顺手的就行:
方法一:使用pROC包(简洁直观)
pROC包是专门做ROC分析的工具,代码简单且自带AUC标注:
# 先安装包(如果没装过) # install.packages("pROC") library(pROC) # 计算ROC对象 roc_obj <- roc( response = tweets_test[['sentiment']], predictor = as.vector(pred_probs), levels = rev(levels(tweets_test[['sentiment']])) # 如果你的标签是因子,确保正类是第二个水平 ) # 绘制ROC曲线 plot(roc_obj, main = "LASSO逻辑回归的测试集ROC曲线", col = "darkblue", lwd = 2, print.auc = TRUE, # 在图上直接显示AUC值 auc.polygon = TRUE, auc.polygon.col = "lightblue", # 给AUC区域填色 xlab = "假阳性率(FPR)", ylab = "真阳性率(TPR)" )
方法二:使用ROCR包(灵活定制)
ROCR包提供更多自定义选项,适合需要调整细节的场景:
# 先安装包(如果没装过) # install.packages("ROCR") library(ROCR) # 创建预测对象 pred <- prediction(pred_probs, tweets_test[['sentiment']]) # 计算ROC曲线的真阳性率(TPR)和假阳性率(FPR) perf <- performance(pred, measure = "tpr", x.measure = "fpr") # 绘制ROC曲线 plot(perf, main = "LASSO逻辑回归的测试集ROC曲线", col = "darkred", lwd = 2, xlab = "假阳性率(FPR)", ylab = "真阳性率(TPR)") # 添加随机猜测的基准线(对角线) abline(a = 0, b = 1, lty = 2, col = "gray") # 添加AUC值到图中 auc_value <- performance(pred, measure = "auc")@y.values[[1]] text(0.6, 0.3, paste0("AUC = ", round(auc_value, 4)))
小提示:如果你的
sentiment是0/1的数值型(不是因子),那么roc()函数里的levels参数可以省略,包会自动识别正类。
内容的提问来源于stack exchange,提问作者Lucinho91




