多标签分类混淆矩阵的标签数量错误

时间:2018-09-26 00:40:16

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

我正在将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吗?

2 个答案:

答案 0 :(得分: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个类别

答案 1 :(得分:0)

所有这些意味着未使用某些标签。

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)