You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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: 对应交叉验证误差最小的Lambda
  • lambda.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

火山引擎 最新活动