You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

随机森林模型ROC曲线坐标轴异常及建模方向咨询

解决随机森林ROC曲线坐标轴异常的问题

首先直接说核心问题:你用来绘制ROC曲线的输入是模型的硬分类结果(也就是直接预测的类别),但ROC曲线需要的是模型输出的连续概率得分——这就是为什么你的X轴起始值是1.0,完全不符合预期。

问题出在代码哪里?

看你的代码片段:

prediction <- NULL
prediction$status_prediction <- predict(fit, test)
prediction <- as.data.frame(prediction)
prediction$status_prediction_prob <- predict(fit, test, type = "prob")
# 然后用硬分类结果计算ROC
result.roc <- roc(test$status, prediction$status_prediction)

这里prediction$status_prediction是模型直接输出的离散类别(比如1或2),ROC曲线的本质是通过调整阈值观察假阳性率和真阳性率的变化——离散的分类结果只有一个阈值点,自然画不出正常的ROC曲线,甚至出现坐标轴异常。

修正步骤

1. 正确获取预测概率(关键!)

首先要拿到模型输出的正类概率,randomForest的predict(type="prob")会返回每个类别的概率矩阵,我们需要提取对应正类的那一列(比如假设你的status正类是1,就选第二列,具体看你的类别顺序):

# 一次性获取分类结果和概率,避免重复调用predict
prediction <- data.frame(
  status_prediction = predict(fit, test),
  # 提取正类的概率,这里假设第二列是你关注的类别(比如"1")
  status_pos_prob = predict(fit, test, type = "prob")[, 2]
)

2. 确保真实标签格式正确

pROC的roc函数需要真实标签和预测得分的类别对应,建议把真实标签转成因子或者数值型:

# 把真实标签转成因子(如果还不是的话)
test$status <- as.factor(test$status)

3. 用概率得分计算并绘制ROC曲线

现在用正类概率来计算ROC,而不是硬分类结果:

library(pROC)
# 用真实标签和正类概率计算ROC
result.roc <- roc(test$status, prediction$status_pos_prob)

# 绘制正常的ROC曲线
plot(result.roc, 
     print.thres="best", 
     print.thres.best.method="closest.topleft", 
     main = "ROC curve", 
     print.auc = TRUE)

# 计算AUC(直接用roc对象更准确)
auc(result.roc)

额外优化建议

  • 避免重复给prediction <- NULL赋值,这会清空之前的结果,造成冗余代码。
  • 可以用fit$classes查看随机森林模型的类别顺序,确保你提取的概率列是对应正类的。比如fit$classes返回["0", "1"],那么第二列就是1的概率。

这样调整后,你应该能得到正常的ROC曲线,X轴从0开始,Y轴从0到1,同时能看到完整的曲线和正确的AUC值。

内容的提问来源于stack exchange,提问作者user113156

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:38:04