#r #roc #proc-r-package
#r #ОКР #proc-r-package
Вопрос:
Я не могу заставить функцию 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
Комментарии:
1. Привет, просто взгляните на это. Я получаю ошибку — Ошибка в roc (response = ctrain $ diabetes, predictor = predict_qdatrain $ class, : не удалось найти функцию «roc». Из какого пакета эта функция?
Ответ №1:
Как объяснил Олли Перкинс в своем ответе, ошибка, которую вы получаете, указывает на то, что вы передаете что-то, что не имеет сортируемого характера и поэтому не может быть использовано для анализа 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)
Это даст вам более плавную кривую и больше пороговых значений классификации на выбор.
Ответ №2:
Итак, предполагая, что вы используете пакет pROC, я исправил это ниже. Сообщение об ошибке означает, что переменная-предиктор должна иметь либо числовой тип (число с плавающей запятой), либо упорядоченный множитель (категориальная переменная, где порядок уровней имеет значение). Поэтому, чтобы вычислить кривую ROC из вашего объекта predict, я преобразовал ее на лету ниже.
Во-вторых, в вашем исходном коде вы прогнозировали исходный обучающий набор. Я изменил это на тестовые данные ниже.
"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)
Комментарии:
1. Что такое «целое число с плавающей запятой»? Также вам действительно не следует преобразовывать двоичный класс в упорядоченный множитель; хотя это может иметь некоторый смысл здесь с 0 и 1 (вы могли бы преобразовать его и в целые числа), вы получите единственную точку ROC, которая не очень репрезентативна для базовой модели.
Ответ №3:
Я использовал: «as.numeric», и это работает для меня.
#ROC-AUC
set.seed(234)
"ROC curve and AUC"
rocX1 =roc(response=testing_FDI$ï..FDIInflow, predictor= as.numeric(FDI_test_pred2))
rocX1
control = 0
case = 1
plot.roc(rocX1, col="red", lwd=3, main="ROC curve fdi")