2013-11-09 2 views
7

Я использую функцию confusionMatrix в R package caret для расчета некоторых статистических данных для некоторых данных. Я помещал свои предсказания, а также мои фактические значения в функции table получить таблицу для использования в функции confusionMatrix, как так:R package caret confusionMatrix с недостающими категориями

table(predicted,actual) 

Однако, существует несколько возможных исходов (например, A, B, C, D), и мои прогнозы не всегда представляют все возможности (например, только A, B, D). Результирующее выходная функция 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 

Есть Кстати, я могу использовать функцию table по-разному, чтобы получить недостающие строки с нулями или использовать функцию confusionMatrix по-разному, чтобы просмотреть отсутствующие результаты как ноль?

В качестве примечания: Поскольку я случайно выбираю свои данные для тестирования, бывают случаи, когда категория также не представлена ​​в фактическом результате, а не только в предсказании. Я не верю, что это изменит решение.

ответ

14

Вы можете использовать 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) 
+0

Для меня, потому что мои уровни факторов не являются непрерывными, метод fotNelton не применим. Но это работает, спасибо. – Joonhwan

5

Прежде всего обратите внимание, что confusionMatrix можно назвать confusionMatrix(predicted, actual) в дополнение к вызову с table объектов. Однако функция выдает ошибку, если predicted и actual (оба считаются factor с) не имеют одинакового количества уровней.

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

Это правильно. Вы должны иметь одинаковые уровни в наблюдаемых и прогнозируемых, чтобы была показана полная таблица. Как еще «таблица» знает, что возможны другие уровни факторов? Большинство функций в «каретке» подходят для того, чтобы предсказания всегда имели те же уровни, что и исходные классы. Макс. – topepo

+0

«таблица» могла бы рассказать об объединении фактического и прогнозируемого уровней. Тем не менее, я могу принять (что еще я могу сделать в любом случае :-)), что 'table' работает таким образом, я просто подумал, что должен упомянуть тот факт, что для этой конкретной проблемы он не будет работать, как хочет OP. – fotNelton

+1

Большое вам спасибо, это была огромная помощь !. Я добавил некоторый код для создания матрицы, если «act» не имеет всех возможных значений, а также способен маркировать строки и столбцы, и он отлично работает. Также как примечание для других, вам нужно использовать «как».table ', чтобы заставить его работать в функции confusionMatrix. – Barker

0

Я была такая же проблема, и вот мое решение:

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