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 (оба считаются factors) не имеют одинаковое число уровней.

этот (и тот факт, что 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