我正在 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
函数,以便将缺失的结果视为零?
作为注释:由于我随机选择要测试的数据,有时候实际结果中也没有表示类别,而只是预测。我不相信这会改变解决方案。
答案 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
。但是,如果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
答案 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