Невозможно получить правильную кривую ROC для нескольких классов, используя библиотеку pROC в R - PullRequest
0 голосов
/ 14 мая 2018

В моем столбце прогноза есть спам, а не спам, который невозможно определить.Я использовал метод объединения методов ансамбля, чтобы предсказать его. Мне удалось получить точность около 77%. Я могу построить кривую ROC, но я просто не думаю, что это правильно.

Ensemle Technique code:

# Generate level-one dataset for training the ensemble metalearner
predDF <- data.frame(dataTest.pred, NB_Predictions, RF_Predictions,SVM_Predictions, spam = validation$spam, stringsAsFactors = F)

# Train the ensemble

# define training control
set.seed(1958)
# Train the ensemble
modelStack <- caret::train(spam ~ ., data = predDF, method = "rf")

Вот мой код для ROC:

#ROC Curve
pre<-predict(modelStack, testPredLevelOne,type='prob')
# AUC measure
modelroc = mean(
  c(as.numeric(multiclass.roc(testPredLevelOne$spam, pre[,1])$auc),
    as.numeric(multiclass.roc(testPredLevelOne$spam, pre[,2])$auc),
    as.numeric(multiclass.roc(testPredLevelOne$spam, pre[,3])$auc)
  )
)

Я не думаю, что мера AUC также правильная.

> modelroc
[1] 0.500903

Вот еще один метод, который я попытался построить кривую ROC.Я не думаю, что это тоже работает.

#Method 2 ROC
predictions<-as.numeric(predict(modelStack, testPredLevelOne))
roc.multi<-multiclass.roc(testPredLevelOne$spam,predictions)
auc(roc.multi)
rs <- roc.multi[['rocs']]
plot.roc(rs[[1]])

sapply(2:length(rs),function(i) lines.roc(rs[[i]],col=i))

Вот график:

enter image description here

Может кто-нибудь, пожалуйста, помогите мнес этим?Большое спасибо.

1 Ответ

0 голосов
/ 14 мая 2018

Усреднение между классами производится непосредственно в pROC.Поэтому вы хотите запустить multiclass.roc только один раз с одним вектором прогнозов.Обычно вы хотите использовать type="response" вместо probs, хотя это может варьироваться в зависимости от функции predict, доступной для вашей модели:

pre<-predict(modelStack, testPredLevelOne, type='response')

После этого pROC выполнит усреднение для вас, чтобы вы моглиможно получить среднее значение AUC напрямую:

multiclass.roc(testPredLevelOne$spam, pre)$auc

Обратите внимание, что в вашем случае это будет среднее значение по 3 AUC: спам против спама, не спам, неопределенный и не спам против неопределимый.Это может не отражать значение точности, которое вы рассчитали.

Что касается графика, вы получили предсказанный класс по методу predict.train из каретки.Обычно для построения кривой ROC требуется количественное количественное измерение.Качественное измерение приводит к получению кривой ROC, содержащей одну точку, которая обычно не является оптимальной.К сожалению, опция type="probs" из каретки возвращает 3 вектора вероятностей, что не поддерживается форматом pROC.

В качестве альтернативы можно было бы выполнить вычисления более вручную, выбрав правильный столбец вероятности и нужные уровни.для тестирования:

pre<-predict(modelStack, testPredLevelOne,type='prob')
roc(testPredLevelOne$spam, pre[,X], levels = c("not spam", "spam"), plot = TRUE)
roc(testPredLevelOne$spam, pre[,X], levels = c("undefined", " spam"), plot = TRUE, add = TRUE)

В конечном счете, вы должны тщательно проанализировать актуальность мультиклассового анализа ROC.ROC был разработан для бинарной классификации, и актуальность различных существующих мультиклассовых расширений несколько сомнительна в моем опыте.

...