Как я могу рассчитать F1-меру и ROC в задаче мультиклассовой классификации в R? - PullRequest
0 голосов
/ 01 мая 2019

У меня есть этот код для задачи классификации мультикласса:

data$Class = as.factor(data$Class)
levels(data$Class) <- make.names(levels(factor(data$Class)))
trainIndex <- createDataPartition(data$Class, p = 0.6, list = FALSE, times=1)
trainingSet <- data[ trainIndex,]
testingSet  <- data[-trainIndex,]
train_x <- trainingSet[, -ncol(trainingSet)]
train_y <- trainingSet$Class

testing_x <- testingSet[, -ncol(testingSet)]
testing_y <- testingSet$Class

oneRM <- OneR(trainingSet, verbose = TRUE)
oneRM
summary(oneRM)
plot(oneRM)    

oneRM_pred <- predict(oneRM, testing_x)
oneRM_pred

eval_model(oneRM_pred, testing_y)


AUC_oneRM_pred <- auc(roc(oneRM_pred,testing_y))
cat ("AUC=", oneRM_pred)

# Recall-Precision curve    
oneRM_prediction <- prediction(oneRM_pred, testing_y)
RP.perf <- performance(oneRM_prediction, "tpr", "fpr")

plot (RP.perf)

plot(roc(oneRM_pred,testing_y))

Но код не работает, после этой строки:

oneRM_prediction <- прогноз (oneRM_pred, testing_y) </p>

Я получаю эту ошибку:

Ошибка в прогнозировании (oneRM_pred, testing_y): формат прогнозов недействительный.

Кроме того, я не знаю, как легко получить меру F1.

Наконец, вопрос, имеет ли смысл рассчитывать AUC в задаче классификации нескольких классов?

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Если я использую уровни (oneRM_pred) <- уровни (testing_y) </strong> таким образом:

...
oneRM <- OneR(trainingSet, verbose = TRUE)
oneRM
summary(oneRM)
plot(oneRM)    

oneRM_pred <- predict(oneRM, testing_x)
levels(oneRM_pred) <- levels(testing_y)
...

Точность намного ниже, чем раньше.Поэтому я не уверен, является ли применение тех же уровней хорошим решением.

0 голосов
/ 01 мая 2019

Давайте начнем с F1.

Предполагая, что вы используете набор данных радужной оболочки, сначала нам нужно загрузить все, обучить модель и выполнить прогнозы, как вы это сделали.

library(datasets)
library(caret)
library(OneR)
library(pROC)

trainIndex <- createDataPartition(iris$Species, p = 0.6, list = FALSE, times=1)
trainingSet <- iris[ trainIndex,]
testingSet  <- iris[-trainIndex,]
train_x <- trainingSet[, -ncol(trainingSet)]
train_y <- trainingSet$Species

testing_x <- testingSet[, -ncol(testingSet)]
testing_y <- testingSet$Species

oneRM <- OneR(trainingSet, verbose = TRUE)
oneRM_pred <- predict(oneRM, testing_x)

Затем вы должны вычислить точность, отзыв и F1 для каждого класса.

cm <- as.matrix(confusionMatrix(oneRM_pred, testing_y))
n = sum(cm) # number of instances
nc = nrow(cm) # number of classes
rowsums = apply(cm, 1, sum) # number of instances per class
colsums = apply(cm, 2, sum) # number of predictions per class
diag = diag(cm)  # number of correctly classified instances per class 

precision = diag / colsums 
recall = diag / rowsums 
f1 = 2 * precision * recall / (precision + recall) 

print(" ************ Confusion Matrix ************")
print(cm)
print(" ************ Diag ************")
print(diag)
print(" ************ Precision/Recall/F1 ************")
print(data.frame(precision, recall, f1)) 

После этого вы сможете найти макрос F1.

macroPrecision = mean(precision)
macroRecall = mean(recall)
macroF1 = mean(f1)

print(" ************ Macro Precision/Recall/F1 ************")
print(data.frame(macroPrecision, macroRecall, macroF1)) 

Чтобы найтиROC (именно AUC), лучше использовать библиотеку pROC.

print(" ************ AUC ************")
roc.multi <- multiclass.roc(testing_y, as.numeric(oneRM_pred))
print(auc(roc.multi))

Надеюсь, что это вам поможет.

Найдите подробности по этой ссылке для F1 и для для AUC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...