当前位置: 首页 > 知识库问答 >
问题:

多标签混淆矩阵

谢清野
2023-03-14

我正在对实际数据和来自分类器的预测数据进行多标签分类。实际数据包括三类(c1、c2和c3),同样,预测数据也包括三类(c1、c2和c3)。数据如下

Actual_data     Predicted_data
c1 c2 c3         c1 c2 c3
1  1  0          1  1  1
1  1  0          1  0  1
1  0  1          0  1  1
0  1  1          1  0  0
1  0  0          1  1  0
1  1  1          1  0  1

在多标签分类中,文档可能属于多个类别。在上述数据中,1表示文档属于特定类,0表示文档不属于特定类。

第一行Actual\u数据表示文档属于c1类和c2类,不属于c3类。类似地,第一行predicted\u数据表示文档属于类别c1、c2和c3。

最初我使用R编程来寻找实际数据和预测数据之间的混淆矩阵。我将这些数据帧保存在y_actual和y_predict中。

y_actual<-as.matrix(Actual_data)
y_predict<-as.matrix(Predicted_data)
xtab<-table(y_actual,y_predict)

输出xtab是

            y_predict
 y_actual     0 1
            0 1 5
            1 5 7

然后,我使用R的插入符号包创建了混淆矩阵,如下所示

library(caret) 
confusionMatrix(xtab)
Confusion Matrix and Statistics
                   y_predict
           y_actual 0 1
                  0 1 5
                  1 5 7

               Accuracy : 0.4444          
                 95% CI : (0.2153, 0.6924)
     No Information Rate : 0.6667          
     P-Value [Acc > NIR] : 0.9856          

              Kappa : -0.25           
 Mcnemar's Test P-Value : 1.0000          

            Sensitivity : 0.16667         
            Specificity : 0.58333         
         Pos Pred Value : 0.16667         
         Neg Pred Value : 0.58333         
             Prevalence : 0.33333         
         Detection Rate : 0.05556         
   Detection Prevalence : 0.33333         
      Balanced Accuracy : 0.37500         

       'Positive' Class : 0  

在这种情况下,我没有得到多标签混淆矩阵,而是得到了二进制标签混淆矩阵。我想要一个混淆矩阵,其中c1、c2、c3在y-实际中,而y-预测代替0、1在y-实际和y-预测中。

然后我在互联网上搜索到,utiml包用于R中的多标签分类,但没有提供所需的输出。然后我尝试了python的scikit包进行多标签分类,下面给出了代码。

import numpy as np
from sklearn.metrics import multilabel_confusion_matrix
y_actual = np.array([[1, 1, 0],
                     [1, 1, 0],
                     [1, 0, 1],
                     [0, 1, 1],
                     [1, 0, 0],
                     [1, 1, 1]])
y_predict = np.array([[1, 1, 1],
                      [1, 0, 1],
                      [0, 1, 1],
                      [1, 0, 0],
                      [1, 1, 0],
                      [1, 0, 1]])
matrix = multilabel_confusion_matrix(y_actual, y_predict)
print(matrix)
print(classification_report(y_actual,y_predict))

程序的输出是

    [[[0 1]
      [1 4]]

    [[0 2]
      [3 1]]

    [[1 2]
      [1 2]]]
              precision    recall  f1-score   support

           0       0.80      0.80      0.80         5
           1       0.33      0.25      0.29         4
           2       0.50      0.67      0.57         3

   micro avg       0.58      0.58      0.58        12
   macro avg       0.54      0.57      0.55        12
weighted avg       0.57      0.58      0.57        12
 samples avg       0.53      0.61      0.54        12

在这种情况下,我也没有得到输出标签。有谁能帮助我在任何平台(R-programming、python或weka)中获得上述实际和预测数据的多标签混淆矩阵需要使用什么样的包。在输出中,混淆矩阵需要是y\u actual和y\u predict的c1、c2和c3的3×3矩阵。

                    y_predict
    y_actual       c1 c2 c3
                c1 4
                c2    1
                c3       2

这里对角线元素表明它实际上属于c1,分类器预测它属于c1。c2和c3也是如此。我的问题是如何获得混淆矩阵的其他值,因为它是多标签分类。这个问题不是多类分类问题,而是多标签分类问题。

共有1个答案

公羊俭
2023-03-14

一种解决方案是改变数据的表示方式,使其与混淆矩阵方面的插入符号或sklearn期望的内容相匹配。如果您认为混淆矩阵中的每个单元格表示离散类预测(即,“对于这个类,我们预测它,但我们实际看到了它”),那么您可以看到,对于您的示例,没有办法实际构建这样一个矩阵,其中类可以具有相同的值。

考虑到这一点,在你的例子中,你实际上没有三个离散的类别——你有8个。

这意味着对于每一行观察,给定存在的三个分类值,您的数据点可以采用:

none of the categories
only c1
c1&c2
c1&c3
only c2
c2&c3
only c3
all categories

您所需要做的就是向数据帧中添加一个新列,该列重新编码现有的三个目标列,以便新列采用1或8个值来指示这些组合中的每一个。

以下是解决方案的一个示例:

#Recreating your data

Actual_data <- cbind(c(1, 1, 1, 0, 1, 1),
                     c(1, 1, 0, 1, 0, 1),
                     c(0, 0, 1, 1, 0, 1)
)

colnames(Actual_data) <- c("c1", "c2", "c3")

Predicted_data <- cbind(c(1, 1, 0, 1, 1, 1),
                        c(1, 0, 1, 0, 1, 0),
                        c(1, 1, 1, 0, 0, 1)
)

colnames(Predicted_data) <- c("c1", "c2", "c3")

#To make it easy to recode everything, we can convert these two objects into dataframes:

Predicted_data <-as.data.frame(Predicted_data)
Actual_data <- as.data.frame(Actual_data)

#Next, we make a simple function that goes through each row and recodes the class 
#combinations to a distinct category

set_class_combinations <- function(df){
    df$target <- 0
    for (i in nrow(df)){
        df$target[df$c1 == 0 & df$c2 == 0 & df$c3 == 0] <- 1
        df$target[df$c1 == 1 & df$c2 == 0 & df$c3 == 0] <- 2
        df$target[df$c1 == 1 & df$c2 == 1 & df$c3 == 0] <- 3
        df$target[df$c1 == 1 & df$c2 == 0 & df$c3 == 1] <- 4
        df$target[df$c1 == 0 & df$c2 == 1 & df$c3 == 0] <- 5
        df$target[df$c1 == 0 & df$c2 == 1 & df$c3 == 1] <- 6
        df$target[df$c1 == 0 & df$c2 == 0 & df$c3 == 1] <- 7
        df$target[df$c1 == 1 & df$c2 == 1 & df$c3 == 1] <- 8
    }
    return(df)
}

#With the function, we can add a new "target" column to our respective dataframes

Predicted_data <- set_class_combinations(Predicted_data)
Actual_data <- set_class_combinations(Actual_data)

#As your example does not include all available combinations, we just need to ensure that we 
#account for this when we set the factor levels (1 through 8) and call the `confusionMatrix` function

cm <- confusionMatrix(factor(Predicted_data$target, levels = 1:8), factor(Actual_data$target, levels = 1:8))

print(cm)
 类似资料:
  • 我试图弄清楚如何使用神经网络为多标签分类任务生成混淆矩阵。我之前设法使用函数“交集”计算准确性,因为对此我不关心任何排序。 然而,为了计算混淆矩阵,我确实关心预测/标签的索引顺序。由于标签的值始终相同(

  • 我正在使用分类器的多类多标签输出。类的总数为14,实例可以关联多个类。例如: 我现在制作混淆矩阵的方式: 输出如下: 现在,我不确定sklearn的混淆矩阵是否能够处理多标签多类数据。谁能帮我一下吗?

  • 我正在y_test并y_pred混淆矩阵。我的数据用于多标签分类,因此行值是一种热编码。 我的数据有30个标签,但在输入混淆矩阵后,输出只有11行和列,这让我很困惑。我想我应该有一辆30X30的。 它们的格式是numpy数组。(y\u test和y\u pred是我使用dataframe.values将其转换为numpy数组的数据帧) y\U测试。形状 y_test y\u预测。形状 y\u预测

  • 我需要计算表示为多个热向量的标签和预测的混淆矩阵。sklearn似乎不支持这种情况。 这是我所拥有的一个例子。假设有三个类,和;目标/标签为: 因此,我们有标签矩阵: 预测是: 预测矩阵为: 我希望输出是一个混淆矩阵,大致如下所示: 我使用来估计分类精度。然而,尽管正在为此类标签的准确性而工作,但混淆矩阵不支持上述场景。是否有任何替代? 另一个问题似乎给出了三个混淆矩阵,这不是我要寻找的情况。

  • 我得到了混淆矩阵,但是因为我的实际数据集有很多分类类别,所以很难理解。 范例- 但是如何打印标签/列名以便更好地理解呢? 我甚至试过这个- 需要帮忙吗?

  • 假设我有一个具有n个级别的因子变量y,我有预测和实际结果。如何构造混淆矩阵? 对于n=2的情况,这个问题已经得到了回答。看见 R:如何为预测模型制作混淆矩阵? 我试过的 这就是我能走多远 现在这必须以矩阵的形式呈现。 出身背景 混淆矩阵具有水平标签“实际类别”和垂直标签“预测类别”。矩阵元素的计数如下所示: 元素(1,1)=实际类的计数数为A,预测类的计数数为A 元素(1,2)=实际类别为A,预测