ошибка матрицы путаницы "Метрики классификации не могут обрабатывать сочетание целей с несколькими метками и мультиклассами" - PullRequest
0 голосов
/ 08 февраля 2019

Я получаю Классификационные метрики не могут обработать смесь целей с несколькими метками и мультиклассами Ошибка, когда я пытаюсь использовать путаницу.

Я делаю свое первое глубокое обучениепроект.Я новичок в этом.Я использую набор данных mnist, предоставленный keras.Я успешно обучил и протестировал свою модель.

Однако, когда я пытаюсь использовать матрицу путаницы в scikit learn, я получаю ошибку, указанную выше.Я искал ответ, и хотя есть ответы на эту ошибку, ни один из них не помог мне.Из того, что я нашел в Интернете, это, вероятно, связано с функцией потерь (я использую categoryorical_crossentropy в моем коде).Я попытался изменить его на sparse_categorical_crossentropy , но это просто дало мне ошибку при проверке цели: ожидалось, что плотность_2 будет иметь форму (1,), но при запуске я получил массив с формой (10,) функция fit() на модели.

Это код.(Я упустил импорт для краткости)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(28 * 28,)))
model.add(Dense(10, activation='softmax')) 

model.compile(optimizer='Adam', loss='categorical_crossentropy', metrics=['accuracy'])

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

model.fit(train_images, train_labels, epochs=10, batch_size=128)

rounded_predictions = model.predict_classes(test_images, batch_size=128, verbose=0)

cm = confusion_matrix(test_labels, rounded_predictions)

Как я могу это исправить?Заранее спасибо, если решите помочь.

1 Ответ

0 голосов
/ 08 февраля 2019

Матрица путаницы нуждается как в метках, так и в предсказаниях в виде однозначных цифр, а не в виде закодированных векторов с одним «горячим» кодированием;хотя вы сделали это с вашими предсказаниями, используя model.predict_classes(), то есть

rounded_predictions = model.predict_classes(test_images, batch_size=128, verbose=0)
rounded_predictions[1]
# 2

ваши test_labels все еще закодированы в горячем виде:

test_labels[1]
# array([0., 0., 1., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)

Итак, вы должны преобразовать их тожек однозначным, следующим образом:

import numpy as np
rounded_labels=np.argmax(test_labels, axis=1)
rounded_labels[1]
# 2

После чего должна появиться матрица путаницы ОК:

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(rounded_labels, rounded_predictions)
cm
# result:
array([[ 971,    0,    0,    2,    1,    0,    2,    1,    3,    0],
       [   0, 1121,    2,    1,    0,    1,    3,    0,    7,    0],
       [   5,    4,  990,    7,    5,    3,    2,    7,    9,    0],
       [   0,    0,    0,  992,    0,    2,    0,    7,    7,    2],
       [   2,    0,    2,    0,  956,    0,    3,    3,    2,   14],
       [   3,    0,    0,   10,    1,  872,    3,    0,    1,    2],
       [   5,    3,    1,    1,    9,   10,  926,    0,    3,    0],
       [   0,    7,   10,    1,    0,    2,    0,  997,    1,   10],
       [   5,    0,    3,    7,    5,    7,    3,    4,  937,    3],
       [   5,    5,    0,    9,   10,    3,    0,    8,    3,  966]])

PS В будущем, пожалуйста, обратите внимание, что ожидаются вопросы SOвключить код в сам вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...