R包插入符号混乱矩阵缺少类别

时间:2013-11-09 00:49:44

标签: r missing-data r-caret confusion-matrix

我正在 R confusionMatrix中使用函数caret来计算我拥有的某些数据的某些统计信息。我一直把我的预测和实际值放到table函数中,以便在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函数,以便将缺失的结果视为零?

作为注释:由于我随机选择要测试的数据,有时候实际结果中也没有表示类别,而只是预测。我不相信这会改变解决方案。

3 个答案:

答案 0 :(得分:21)

您可以使用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)

答案 1 :(得分:5)

首先请注意,confusionMatrix除了使用confusionMatrix(predicted, actual)个对象调用外,还可以调用table。但是,如果predictedactual(均视为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

答案 2 :(得分: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