【问题标题】:multi label classification confusion matrix have wrong number of labels多标签分类混淆矩阵的标签数量错误
【发布时间】:2019-03-01 16:17:19
【问题描述】:

我将 y_test 和 y_pred 输入到混淆矩阵中。我的数据用于多标签分类,因此行值是一种热门编码。

我的数据有 30 个标签,但在输入混淆矩阵后,输出只有 11 行和列,这让我很困惑。我想我应该有一个 30X30。

它们的格式是 numpy 数组。 (y_test 和 y_pred 是我使用 dataframe.values 将其转换为 numpy 数组的数据帧)

y_test.shape

(8680, 30)

y_test

array([[1, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       ..., 
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]])

y_pred.shape

(8680, 30)

y_pred

array([[1, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       ..., 
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]])

我将它们转换为混淆矩阵可用格式:

y_test2 = y_test.argmax(axis=1)
y_pred2 = y_pred.argmax(axis=1)
conf_mat = confusion_matrix(y_test2, y_pred2)

这是我的混淆矩阵的样子:

conf_mat.shape

(11, 11)

conf_mat

array([[4246,   77,   13,   72,   81,    4,    6,    3,    0,    0,    4],
       [ 106, 2010,   20,   23,   21,    0,    5,    2,    0,    0,    0],
       [ 143,   41,   95,   32,   10,    3,   14,    1,    1,    1,    2],
       [ 101,    1,    0,  351,   36,    0,    0,    0,    0,    0,    0],
       [ 346,   23,    7,   10,  746,    5,    6,    4,    3,    3,    2],
       [   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0],
       [   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0],
       [   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0],
       [   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0],
       [   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0],
       [   0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0]])

为什么我的混淆矩阵只有 11 X 11 的形状?不应该是 30X30 吗?

【问题讨论】:

    标签: python pandas numpy confusion-matrix multilabel-classification


    【解决方案1】:

    我觉得你还没有明确confusion_matrix的定义

    y_true = [2, 0, 2, 2, 0, 1]
    y_pred = [0, 0, 2, 2, 0, 2]
    confusion_matrix(y_true, y_pred)
    array([[2, 0, 0],
           [0, 0, 1],
           [1, 0, 2]])
    

    数据框中的哪个是

    pd.DataFrame(confusion_matrix(y_true, y_pred),columns=[0,1,2],index=[0,1,2])
    Out[245]: 
       0  1  2
    0  2  0  0
    1  0  0  1
    2  1  0  2
    

    列和索引是输入的类别。

    您有(11,11),这意味着您的数据中只有 11 个类别

    【讨论】:

      【解决方案2】:

      这意味着有些标签没有被使用。

      y_test.any(axis=0)
      y_pred.any(axis=0)
      

      应该显示只有 11 个列中有任何 1。

      如果不是这种情况,它会是什么样子:

      from sklearn.metrics import confusion_matrix
      
      y_test = np.zeros((8680, 30))
      y_pred = np.zeros((8680, 30))
      
      y_test[np.arange(8680), np.random.randint(0, 30, 8680)] = 1
      y_pred[np.arange(8680), np.random.randint(0, 30, 8680)] = 1
      
      y_test2 = y_test.argmax(axis=1)
      y_pred2 = y_pred.argmax(axis=1)
      
      confusion_matrix(y_test2, y_pred2).shape  # (30, 30)
      

      【讨论】:

        猜你喜欢
        • 2021-11-11
        • 2020-01-22
        • 2018-11-06
        • 2014-10-19
        • 2020-10-24
        • 2019-01-20
        • 2021-05-14
        • 2019-05-22
        相关资源
        最近更新 更多