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

ROC函数报错‘Predictor must be numeric or ordered’求解决,需绘制ROC曲线与AUC

解决ROC函数报错“Predictor must be numeric or ordered”的问题

我看到你在使用QDA模型绘制ROC曲线时遇到了这个报错,核心原因是ROC曲线需要的是模型输出的概率/置信度得分(数值型),而不是直接用分类后的类别标签(因子型)。下面是具体的解决步骤和修改后的代码:

问题根源

你当前调用roc()时用的是predict_qdatrain$class,这是模型预测出的离散分类结果(比如是/否这类因子),不符合ROC函数对predictor参数的要求——它需要的是能反映模型对样本属于某一类别的置信度的数值(比如概率),这样才能通过调整阈值来计算不同的真阳性率和假阳性率。

解决步骤 & 修改代码

  1. 获取预测概率:在调用predict()时一定要加上probability=TRUE参数,这样才能得到每个样本属于各类别的后验概率。
  2. 提取目标类别概率:对于二分类问题,选择其中一类(比如阳性类)的概率作为predictor输入到roc()函数中。
  3. 重新绘制ROC曲线:用提取出的概率值替代原有的class结果。

修改后的完整代码如下:

# 获取数据
flying=dget("https://www.math.ntnu.no/emner/TMA4268/2019v/data/flying.dd")
ctrain=flying$ctrain
ctest=flying$ctest

library(MASS)
library(pROC) # 确保你加载了pROC包

# 训练QDA模型
fly_qda=qda(diabetes~., data=ctrain)

# 测试集误差计算(这部分保留你的原有代码即可)
predict_qda=predict(fly_qda, newdata=ctest, probability=TRUE)
table_qda<-table(ctest$diabetes, predict_qda$class)
error_qda<-1-sum(diag(table_qda))/sum(table_qda)
error_qda

# ROC曲线和AUC计算(修改后的部分)
# 关键:加上probability=TRUE获取概率
predict_qdatrain<-predict(fly_qda, newdata=ctrain, probability=TRUE)

# 查看diabetes的类别水平,确认阳性类名称(比如假设是"1"或者"yes")
levels(ctrain$diabetes)
# 提取阳性类的概率,这里替换成你实际的阳性类别名称,比如如果levels是c("0","1"),就取"1"列
prob_positive <- predict_qdatrain$posterior[, "1"] 

# 绘制ROC曲线并计算AUC
roc_qda=roc(response=ctrain$diabetes, predictor= prob_positive, plot=TRUE)
plot(roc_qda, col="red", lwd=3, main="ROC curve QDA")
auc_qda<-auc(roc_qda)
auc_qda

额外提示

  • 如果你不确定阳性类是哪个,可以先运行levels(ctrain$diabetes)查看类别顺序,选择你关注的那一类的概率即可。
  • 确保你已经安装并加载了pROC包(ROC曲线的常用包),如果没安装可以先运行install.packages("pROC")。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:18:35