Ошибка функции ROC. Предиктор должен быть числовым или упорядоченным.

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


person MJ O    schedule 19.04.2019    source источник
comment
Привет, только взгляни на это. Я получаю сообщение об ошибке - Ошибка в roc (response = ctrain $ diab, predictor = predic_qdatrain $ class,: could not find function roc. Из какого пакета эта функция?   -  person Ollie Perkins    schedule 19.04.2019


Ответы (2)


Как объяснил Олли Перкинс в своем ответе, полученная вами ошибка указывает на то, что вы передаете что-то, что не имеет сортируемого характера и, следовательно, не может использоваться для анализа 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)

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

Кривая ROC QDA

person Calimo    schedule 20.04.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)
person Ollie Perkins    schedule 19.04.2019
comment
Что такое целое число с плавающей запятой? Также вам действительно не следует преобразовывать двоичный класс в упорядоченный коэффициент; хотя здесь может быть какой-то смысл с 0 и 1 (вы тоже могли преобразовать его в целые числа), вы получите одну точку ROC, которая не очень репрезентативна для базовой модели. - person Calimo; 20.04.2019