这个
caret
confusionMatrix
函数返回一个n x n表,无论参考和/或预测向量中是否缺少某些级别。我想知道您是如何得到一个缺少一些参考数据列的混淆矩阵的。例如,使用内置
iris
数据框:
library(caret)
set.seed(2)
dat = data.frame(ref=iris$Species, pred=sample(iris$Species))
# Remove two levels from the reference data
dat1 = dat[dat$ref=="setosa", ]
# Get the confusion matrix
cm1 = confusionMatrix(dat1$pred, dat1$ref)
cm1$table
Reference
Prediction setosa versicolor virginica
setosa 15 0 0
versicolor 15 0 0
virginica 20 0 0
dat2 = dat[dat$ref=="setosa" & dat$pred=="versicolor", ]
cm2 = confusionMatrix(dat2$pred, dat2$ref)
cm2$table
Reference
Prediction setosa versicolor virginica
setosa 0 0 0
versicolor 15 0 0
virginica 0 0 0
在上述示例中
ref
和
pred
列都被编码为因子,原始的三个级别
Species
. 我们可以对其重新编码以降低空级别:
dat2$ref = droplevels(dat2$ref)
dat2$pred = droplevels(dat2$pred)
您可以看到,每列中只存在一个因子级别:
lapply(dat2, levels)
$ref [1] "setosa"
$pred [1] "versicolor"
但如果你跑
混淆矩阵
它现在抛出一个错误,因为两个向量的级别之间没有重叠:
cm3 = confusionMatrix(dat2$pred, dat2$ref)
confusionMatrix中出错。默认值(dat2$pred,dat2$ref):数据
必须包含与引用重叠的某些级别。
更新:
如果在参考向量和预测向量中设置相同的因子级别,
混淆矩阵
将起作用。您已经更新了该问题,但它仍然不可复制,因此很难确定您的工作流程中哪里出了问题。现在,这里有一个与您在问题中所展示的类似的示例,在设置公共因子水平后,该示例按预期工作。
library(caret)
set.seed(2)
mask.vals = sample(c(0,2,4), 100, replace=TRUE)
ref.data = rep(4,100)
cm = confusionMatrix(mask.vals, ref.data)
Error in confusionMatrix.default(mask.vals, ref.data) :
the data cannot have more levels than the reference
mask.vals = factor(mask.vals, levels=c(0,2,4))
ref.data = factor(ref.data, levels=c(0,2,4))
cm = confusionMatrix(mask.vals, ref.data)
cm$table
Reference
Prediction 0 2 4
0 0 0 35
2 0 0 31
4 0 0 34