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参数的要求——它需要的是能反映模型对样本属于某一类别的置信度的数值(比如概率),这样才能通过调整阈值来计算不同的真阳性率和假阳性率。
解决步骤 & 修改代码
- 获取预测概率:在调用
predict()时一定要加上probability=TRUE参数,这样才能得到每个样本属于各类别的后验概率。 - 提取目标类别概率:对于二分类问题,选择其中一类(比如阳性类)的概率作为
predictor输入到roc()函数中。 - 重新绘制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
相关产品推荐
相关产品推荐

