强制 `table` 函数在 R 中包含两个数组的所有因子

我使用以下 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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注