我使用以下 R 代码来生成一个混淆矩阵,用于比较某些数据的真实标签与神经网络的输出结果。
t <- table(as.factor(test.labels), as.factor(nnetpredict))
然而,有时神经网络不会预测某个特定类别,因此表格不是方形的(例如,test.labels 因子有 5 个层次,而 nnetpredict 因子只有 3 个层次)。我想通过添加必要的因子层次并将它们的计数设置为零,使表格变成方形。
我应该如何操作呢?
示例:
> table(as.factor(a), as.factor(b)) 1 2 3 4 5 6 7 8 9 10 1 1 0 0 0 0 0 0 1 0 0 2 0 1 0 0 0 0 0 0 1 0 3 0 0 1 0 0 0 0 0 0 1 4 0 0 0 1 0 0 0 0 0 0 5 0 0 0 0 1 0 0 0 0 0 6 0 0 0 0 0 1 0 0 0 0 7 0 0 0 0 0 0 1 0 0 0
从上面的表格中可以看到,有 7 行但 10 列,因为 a
因子只有 7 个层次,而 b
因子有 10 个层次。我希望通过用零填充表格,使行标签和列标签相同,使矩阵变成方形。从上面的示例来看,这将产生:
1 2 3 4 5 6 7 8 9 10 1 1 0 0 0 0 0 0 1 0 0 2 0 1 0 0 0 0 0 0 1 0 3 0 0 1 0 0 0 0 0 0 1 4 0 0 0 1 0 0 0 0 0 0 5 0 0 0 0 1 0 0 0 0 0 6 0 0 0 0 0 1 0 0 0 0 7 0 0 0 0 0 0 1 0 0 0 8 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0
我需要这样做的原因有两个:
- 用于向用户展示/报告中
- 以便我可以使用一个函数来计算 Kappa 统计量,该函数需要这样格式化的表格(方形,相同行和列标签)
回答:
编辑 – 第二轮修改以解决问题中的额外细节。我删除了我的第一个答案,因为它不再相关。
这已经为我提供的测试案例产生了所需的输出,但我强烈建议使用你的真实数据进行彻底测试。这里的方法是找到输入到表格中的两个因子的完整层次列表,并在生成表格之前将该完整列表设置为层次。
squareTable <- function(x,y) { x <- factor(x) y <- factor(y) commonLevels <- sort(unique(c(levels(x), levels(y)))) x <- factor(x, levels = commonLevels) y <- factor(y, levels = commonLevels) table(x,y)}
两个测试案例:
> #测试案例 1> set.seed(1)> x <- factor(sample(0:9, 100, TRUE))> y <- factor(sample(3:7, 100, TRUE))> > table(x,y) yx 3 4 5 6 7 0 2 1 3 1 0 1 1 0 2 3 0 2 1 0 3 4 3 3 0 3 6 3 2 4 4 4 3 2 1 5 2 2 0 1 0 6 1 2 3 2 3 7 3 3 3 4 2 8 0 4 1 2 4 9 2 1 0 0 3> squareTable(x,y) yx 0 1 2 3 4 5 6 7 8 9 0 0 0 0 2 1 3 1 0 0 0 1 0 0 0 1 0 2 3 0 0 0 2 0 0 0 1 0 3 4 3 0 0 3 0 0 0 0 3 6 3 2 0 0 4 0 0 0 4 4 3 2 1 0 0 5 0 0 0 2 2 0 1 0 0 0 6 0 0 0 1 2 3 2 3 0 0 7 0 0 0 3 3 3 4 2 0 0 8 0 0 0 0 4 1 2 4 0 0 9 0 0 0 2 1 0 0 3 0 0> squareTable(y,x) yx 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 3 2 1 1 0 4 2 1 3 0 2 4 1 0 0 3 4 2 2 3 4 1 5 3 2 3 6 3 0 3 3 1 0 6 1 3 4 3 2 1 2 4 2 0 7 0 0 3 2 1 0 3 2 4 3 8 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0> > #测试案例 2> set.seed(1)> xx <- factor(sample(0:2, 100, TRUE))> yy <- factor(sample(3:5, 100, TRUE))> > table(xx,yy) yyxx 3 4 5 0 4 14 9 1 14 15 9 2 11 11 13> squareTable(xx,yy) yx 0 1 2 3 4 5 0 0 0 0 4 14 9 1 0 0 0 14 15 9 2 0 0 0 11 11 13 3 0 0 0 0 0 0 4 0 0 0 0 0 0 5 0 0 0 0 0 0> squareTable(yy,xx) yx 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 3 4 14 11 0 0 0 4 14 15 11 0 0 0 5 9 9 13 0 0 0