R пакет caret confusionMatrix с отсутствующими категориями
Я использую функцию confusionMatrix
на R пакета caret
чтобы вычислить некоторую статистику для некоторых данных, которые у меня есть. Я помещал свои прогнозы, а также мои фактические значения в а так:
table(predicted,actual)
однако существует несколько возможных результатов (например, A, B, C, D), и мои прогнозы не всегда представляют все возможности (например, только A, B, D). Результирующий выход the table
функция не включает отсутствующий результат и выглядит следующим образом:
A B C D
A n1 n2 n2 n4
B n5 n6 n7 n8
D n9 n10 n11 n12
# Note how there is no corresponding row for `C`.
на confusionMatrix
функция не может обрабатывать отсутствующий результат и дает ошибку:
Error in !all.equal(nrow(data), ncol(data)) : invalid argument type
есть ли способ я могу использовать - разному, так это посмотреть, отсутствующие результаты, как ноль?
как Примечание: поскольку я случайным образом выбираю свои данные для тестирования, бывают случаи, когда категория также не представлена в фактическом результате в отличие от только прогнозируемого. Я не верю, что это изменит решение.
3 ответов
можно использовать union
чтобы обеспечить аналогичные уровни:
library(caret)
# Sample Data
predicted <- c(1,2,1,2,1,2,1,2,3,4,3,4,6,5) # Levels 1,2,3,4,5,6
reference <- c(1,2,1,2,1,2,1,2,1,2,1,3,3,4) # Levels 1,2,3,4
u <- union(predicted, reference)
t <- table(factor(predicted, u), factor(reference, u))
confusionMatrix(t)
во-первых, обратите внимание, что confusionMatrix
можно назвать confusionMatrix(predicted, actual)
В дополнение к вызову с table
объекты. Однако функция выдает ошибку, если predicted
и actual
(оба считаются factor
s) не имеют одинаковое число уровней.
этот (и тот факт, что caret
пакет плюет на меня ошибку, потому что они не получают зависимости прямо в первую очередь), поэтому я бы предложил создать свою собственную функцию:
# Create a confusion matrix from the given outcomes, whose rows correspond
# to the actual and the columns to the predicated classes.
createConfusionMatrix <- function(act, pred) {
# You've mentioned that neither actual nor predicted may give a complete
# picture of the available classes, hence:
numClasses <- max(act, pred)
# Sort predicted and actual as it simplifies what's next. You can make this
# faster by storing `order(act)` in a temporary variable.
pred <- pred[order(act)]
act <- act[order(act)]
sapply(split(pred, act), tabulate, nbins=numClasses)
}
# Generate random data since you've not provided an actual example.
actual <- sample(1:4, 1000, replace=TRUE)
predicted <- sample(c(1L,2L,4L), 1000, replace=TRUE)
print( createConfusionMatrix(actual, predicted) )
что даст ты:
1 2 3 4
[1,] 85 87 90 77
[2,] 78 78 79 95
[3,] 0 0 0 0
[4,] 89 77 82 83
У меня была та же проблема, и вот мое решение:
tab <- table(my_prediction, my_real_label)
if(nrow(tab)!=ncol(tab)){
missings <- setdiff(colnames(tab),rownames(tab))
missing_mat <- mat.or.vec(nr = length(missings), nc = ncol(tab))
tab <- as.table(rbind(as.matrix(tab), missing_mat))
rownames(tab) <- colnames(tab)
}
my_conf <- confusionMatrix(tab)
Ура Cankut