Search code examples
pythontensorflowscikit-learntensorconfusion-matrix

Confusion matrix: ValueError: Classification metrics can't handle a mix of multiclass and continuous-multioutput targets


I'm working on a multiclass classification problem (12 classes), but I can't create the confusion matrix. What I'm trying to do is:

from sklearn.metrics import multilabel_confusion_matrix
pred = model_BiLSTM.predict(X_val)
y_unique = np.unique(y_val)
mcm =confusion_matrix(y_val, pred, labels = y_unique)

But as per the title, the returned error is: "ValueError: Classification metrics can't handle a mix of multiclass and continuous-multioutput targets", and the same happens when using confusion_matrix().

Instead, this is the output of

y_val, pred, y_val.shape, pred.shape
16/16 [==============================] - 0s 6ms/step
(array([11,  8,  3,  3,  9,  9,  9,  3,  3,  1,  3,  6,  6,  6,  2,  9,  1,
         3, 10,  6,  9,  2,  9,  4,  3,  9,  6,  9,  3,  3,  3,  3,  8,  1,
         9,  9,  9,  9,  2,  1,  9,  3,  9,  3,  9,  9,  2, 10,  3,  2,  9,
         3,  8,  6,  8,  9,  9,  6,  6,  9,  8,  7,  9,  2,  9,  9,  2,  3,
         9,  9,  2,  6,  3,  7, 11,  9,  9,  2, 11,  6,  7, 11,  6,  9,  2,
         6,  9,  2,  9,  9,  3,  6,  9,  1, 11,  4,  4,  2,  6,  2,  9,  3,
        10,  3,  2,  9,  9, 10,  6,  3,  9,  9,  6,  8,  6,  9,  4,  6,  5,
         9,  6,  6,  3,  3,  3,  9,  6,  2,  9, 11,  6,  9,  3,  9,  6,  9,
         2,  9,  3,  9,  6,  1,  6,  9,  9,  8,  3,  2,  9,  2,  8,  9,  9,
         3, 10,  2,  4,  9,  9,  2,  8,  3,  6,  9,  9,  9,  6,  2,  2,  9,
         7,  9,  3,  6,  7,  2,  9,  2,  9, 10,  9,  2,  9,  5,  7,  6,  5,
         6,  3,  9,  7,  9,  3, 11,  5,  3,  3,  0,  8,  3,  9,  5,  9, 10,
         9,  3,  3, 11,  2,  1,  8,  6,  2,  9,  3,  6,  2,  8,  9,  2,  8,
         3,  3,  9,  6,  2,  1,  9,  9,  2,  2, 10,  9,  1,  6,  9,  9,  2,
         9,  5,  6,  3,  9,  7,  6,  9,  9,  6,  3,  3,  2,  3,  9,  6,  9,
         9,  9,  9,  9,  9,  9,  2,  9,  9,  9,  9,  3,  1,  6,  6,  6, 10,
         9,  9,  9,  2,  9,  2,  3,  9,  9, 10,  6, 10,  6,  1,  1,  6,  1,
         6,  3,  4,  6,  1, 11,  3,  9,  9,  4,  9,  9,  5,  8,  3,  5,  9,
         6,  9,  9,  9,  3,  2,  5,  1,  9,  6,  1,  3,  9,  5,  3,  9,  6,
         7,  2,  9,  9,  3,  5,  9,  6,  6,  3,  1,  9,  3,  9,  7,  9,  9,
         7,  9, 10,  2,  9,  4,  9,  9,  9,  3,  9,  5,  3,  2,  9,  3,  8,
         2,  9,  3, 11,  3,  3,  9,  2, 10,  9,  3,  9,  1,  9, 10,  5,  1,
         2,  5,  9,  2,  3,  5,  9,  4,  8,  9,  5, 10,  3,  2,  6,  3,  6,
        10, 11,  3,  6,  9,  3,  3,  0,  6,  7,  8,  9,  6,  5,  3,  1,  9,
         2,  9,  9,  5,  2,  5,  3,  6, 11,  2,  9,  3,  6,  2,  9,  9,  3,
         3,  3,  5,  6,  4,  4,  9,  2,  2,  5,  1,  0,  9,  4,  3,  3,  9,
         9,  5,  2,  2,  2,  5,  7,  9,  3,  9,  9,  1,  2,  9,  6,  8,  2,
         3,  4,  2,  3,  3,  2,  6,  5,  9,  5,  2,  2,  2,  9,  9,  6,  2,
         9,  4,  9,  9,  2,  3,  8, 11,  9,  9], dtype=int32),
 array([[5.7949889e-03, 2.5301890e-03, 5.9659913e-05, ..., 2.7534673e-03,
         1.8798949e-03, 4.0977496e-01],
        [2.1629781e-04, 1.0219574e-02, 1.2285617e-03, ..., 4.0498661e-04,
         3.6948815e-04, 8.3618681e-04],
        [8.1547890e-03, 1.1354284e-04, 1.3678521e-04, ..., 3.6535120e-01,
         1.1546685e-03, 3.5349184e-03],
        ...,
        [1.1976730e-03, 6.8558909e-02, 8.7605380e-03, ..., 1.7384565e-01,
         5.4570078e-04, 2.0005915e-02],
        [2.1097453e-02, 7.7744485e-03, 2.5690982e-01, ..., 5.4854238e-01,
         3.9467164e-03, 1.6034273e-02],
        [2.0812787e-03, 1.6885218e-05, 4.7070305e-05, ..., 4.3611538e-01,
         3.6522493e-04, 1.4385413e-02]], dtype=float32),
 (486,),
 (486, 12))

If it helps, this is my model:

def build_BiLSTM_classifier(input_shape, classes):
    input_layer = tfkl.Input(shape=input_shape, name='Input')
    bilstm = tfkl.Bidirectional(tfkl.LSTM(128, return_sequences=True))(input_layer)
    bilstm = tfkl.Bidirectional(tfkl.LSTM(128))(bilstm)
    dropout = tfkl.Dropout(.5, seed=seed)(bilstm)

    classifier = tfkl.Dense(128, activation='tanh')(dropout)
    output_layer = tfkl.Dense(classes, activation='softmax')(classifier)

    model = tfk.Model(inputs=input_layer, outputs=output_layer, name='model')

    model.compile(loss=tfk.losses.SparseCategoricalCrossentropy(), optimizer=tfk.optimizers.Adam(), metrics='accuracy')
    return model

What could I try to do?


Solution

  • Your pred array appears to contain class scores rather than predictions. Try pred.argmax(axis=1) instead.