【发布时间】:2018-06-22 09:58:51
【问题描述】:
我正在为大量样本点数据集创建混淆矩阵,并且需要通过 R 包 caret 使用 confusionMatrix 函数循环遍历它们(我正在使用输出中的准确度指标,即我可以'不要只使用table)。每组样本点应该有 三个 类/因子,即我应该有 3x3 表,但是一些参考和预测数据包含少于两个类或不重叠的类,例如:
Class A B Class C
A 8 2 A 3
B 1 0
C 1 7
* columns = reference data, rows = predicted data
我需要相同数量的类/因子来运行confusionMatrix,所以我想做的是有条件地用零替换缺失的因子,如下所示:
Class A B C Class A B C
A 8 2 0 A 0 0 3
B 1 0 0 B 0 0 0
C 1 7 0 C 0 0 0
我使用的预测/参考数据是数值的数字列表,所以我不会在这里复制它们;对于我上面提供的示例,您可以将其视为一个向量,例如:
predicted.data[1] = A A A A A A A A A A B C C C C C C C C
reference.data[1] = A A A A A A A A A A B B B B B B B B B
predicted.data[2] = A A A
reference.data[2] = C C C
我尝试按照以下方式创建某种条件if 语句:
tab <- table(predicted.data, reference.data)
if(nrow(tab) != ncol(tab){
classes <- c("A","B","C")
missing <- setdiff(classes,names(tab))
...
...
}
# would put in a loop/index actual data obviously
但我似乎无法让它按我想要的方式工作。有什么想法吗?
编辑:我正在使用的实际数据示例(通过栅格/形状文件)和错误消息;数据长度相同,但没有参考数据被归类为“2”:
> mask.vals[[4]]
[1] 0 4 0 0 0 2 4 0 4 0 4 0 0 0 0 0 4 0 4 2 0 0 0 0 0 0 0 4 0 0 0 0 0 0 4 0
0 0 0 0 0 0 0 2 2 0 2 0 4 0 0 4 2 0 0 4 0 0 0 0 0 0 0 2 0 2 0 2 4 0 4
[72] 4 0 0 0 0 4 4 0 0 0 0 0 0 0 4 0 0 0 0 4 4 4 4 0 4 4 4 4 4 0 4 4 4 0 4 0
0 4 4 4 4 4 4
> ref.data[[4]]@data$CLASS_ID
[1] 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
[72] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4
> confusionMatrix(data = mask.vals[[4]], reference = ref.data[[4]]@data$CLASS_ID)
Error in confusionMatrix.default(data = mask.vals[[4]], reference = ref.data[[4]]@data$CLASS_ID) :
the data cannot have more levels than the reference
即需要从这里开始:
> table(mask.vals[[4]], ref.data[[4]]@data$CLASS_ID)
0 4
0 2 67
2 0 9
4 0 36
到这里:
0 2 4
0 2 0 67
2 0 0 9
4 0 0 36
即使我为数据定义了三个级别(例如levels(ref.data[[4]]@data$CLASS_ID) <- c("0","2","4") 或factor(ref.data[[4]]@data$CLASS_ID, levels = c("0","2","4")),此错误仍然存在...
【问题讨论】:
-
raster包没有confusionMatrix函数。你在用caret::confusionMatrix吗?如果您有三个类,那么混淆矩阵不是 3x3 表吗?如果您发布一个可重现的示例(即我们可以用来重现并希望能解决您的问题的数据示例和代码),将会更容易为您提供帮助。
标签: r matrix machine-learning classification confusion-matrix