【问题标题】:ROC function error "Predictor must be numeric or ordered."ROC 函数错误“预测变量必须是数字或有序的。”
【发布时间】:2019-09-09 15:43:40
【问题描述】:

我无法让 ROC 函数工作,我收到错误“预测器必须是数字或有序”。

我浏览了其他帖子,但没有解决我的问题。非常感谢任何帮助。

"Get data"
flying=dget("https://www.math.ntnu.no/emner/TMA4268/2019v/data/flying.dd")
ctrain=flying$ctrain
ctest=flying$ctest


library(MASS)
fly_qda=qda(diabetes~., data=ctrain)


#Test error is given below:
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 curve and AUC"
predict_qdatrain<-predict(fly_qda, newdata=ctrain)
roc_qda=roc(response=ctrain$diabetes, predictor= predict_qdatrain$class, plot=TRUE)
plot(roc_qda, col="red", lwd=3, main="ROC curve QDA")
auc_qda<-auc(roc_qda)

我想要绘制的 ROC 曲线和 AUC

【问题讨论】:

  • 您好,看看这个。我收到错误 - roc 中的错误(响应 = ctrain$diabetes, predictor = predict_qdatrain$class, : 找不到函数“roc”。这个函数来自哪个包?

标签: r roc proc-r-package


【解决方案1】:

因此,假设您使用的是 pROC 包,我已在下面修复了此问题。错误消息意味着预测变量必须是数字类型(浮点数)或有序因子(级别顺序很重要的分类变量)。因此,为了从您的预测对象计算 ROC 曲线,我在下面动态转换了它。

其次,在您的原始代码中,您是在对原始训练集进行预测。我已经把这个改成下面的测试数据了。

"Get data"

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


library(MASS)
library(pROC)
fly_qda=qda(diabetes~., data=ctrain)


#Test error is given below:
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 curve and AUC"
predict_qdatrain<-predict(fly_qda, newdata=ctrain)
roc_qda=roc(response=ctrain$diabetes, predictor= factor(predict_qdatrain$class, 
ordered = TRUE), plot=TRUE)
plot(roc_qda, col="red", lwd=3, main="ROC curve QDA")
auc_qda<-auc(roc_qda)

【讨论】:

  • 什么是“浮点整数”?此外,您真的不应该将二进制类转换为有序因子;尽管在这里使用 0 和 1 可能有意义(您也可以将其转换为整数),但您会得到一个 ROC 点,它不能很好地代表底层模型。
【解决方案2】:

正如 Ollie Perkins 在他的回答中解释的那样,您收到的错误表明您正在传递一些不可排序的东西,因此不能用于 ROC 分析。 在predict.qda 的情况下,class 项是一个因子,1s 和0s 表示类。

与其将类转换为有序预测器,不如使用后验概率代替。让我们使用属于1类的概率:

roc_qda <- roc(response = ctrain$diabetes, predictor = predict_qdatrain$posterior[,"1"])
plot(roc_qda, col="red", lwd=3, main="ROC curve QDA")
auc(roc_qda)

这将为您提供更平滑的曲线和更多的分类阈值可供选择。

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 2015-02-12
    • 2021-02-28
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多