Ошибка функции ROC «Предиктор должен быть числовым или упорядоченным». - PullRequest
1 голос
/ 19 апреля 2019

Я не могу заставить работать функцию 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

Ответы [ 2 ]

2 голосов
/ 20 апреля 2019

Как объяснил Олли Перкинс в своем ответе, ошибка, которую вы получаете, указывает на то, что вы передаете что-то, что не имеет сортируемой природы и, следовательно, не может использоваться для анализа ROC. В случае predict.qda элемент class является фактором с 1 s и 0 s, указывающими класс.

Вместо преобразования класса в упорядоченный предиктор лучше использовать апостериорные вероятности. Давайте использовать вероятность принадлежать к классу 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)

Это даст вам более плавную кривую и большее количество порогов классификации на выбор.

ROC curve QDA

1 голос
/ 19 апреля 2019

Итак, если вы используете пакет 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)
...