model.predict() не создает ожидаемые метки?

#python #keras #classification

#python #keras #классификация

Вопрос:

Я выполняю простую классификацию двоичного текста. Шаги идут примерно так:

  1. предварительная обработка обучающих данных с помощью CountVectorizer()
  2. постройте модель keras Sequential()
  3. model.fit(x_train, y_train)
  4. model.evaluate(x_val, y_val)
  5. model.predict(x_test)

Я застрял на шаге 5 — когда я печатаю прогнозируемые значения, я получаю массив numpy из:

  [0.9434484 ]
 [0.3787447 ]
 ...
 [0.87870705]
 [0.7575223 ]
 [0.39714795]]
  

Поскольку я выполняю двоичную классификацию, и мои метки равны 0 и 1, я ожидал, что результат прогнозирования будет таким же? Теперь кажется, что он предсказывает вероятность между метками 0 и 1, чего я не хотел. Нужно ли мне каким-то образом кодировать вывод прогноза, чтобы он возвращал правильные метки, или я сделал что-то не так в предыдущих шагах??

Комментарии:

1. Какую функцию потерь вы используете? Это будет иметь значение. В идеале это должно быть binary_crossentropy для двоичной классификации.

2. @AkankshaAtrey Я действительно уже использую binary_crossentropy

3. Возвращаемые значения представлены в масштабе 0-1, представляющем вероятность того, что 1 будет меткой

4. @Ruli я это понимаю. Мой вопрос был в том, есть ли какой-либо способ, которым модель напрямую предсказывает метки? Или я должен обработать их впоследствии, как предложил другой пользователь с помощью round()?

5. @kluster я предоставил такой ответ

Ответ №1:

Одним из решений является использование простой статистической интерпретации, где мы будем использовать отсечение 0,5. Таким образом, все, что выше 0.5, будет обрабатываться как 1, а ниже — как 0.

 import numpy as np

pred =  np.array([[0.9434484 ]
 ,[0.3787447 ]
 ,[0.87870705]
 ,[0.7575223 ]
 ,[0.39714795]])

np.round(pred)
Out[37]: 
array([[1.],
       [0.],
       [1.],
       [1.],
       [0.]])
  

Если результаты не являются вероятностями, то что-то вроде :

 def sigmoid(x):
  return 1 / (1   math.exp(-x))
  

необходимо использовать для масштабирования до 0-1.

Ответ №2:

Шаг 5 model.predict(x_test) можно заменить на:

 model.predict_classes(x_test)
  

для прогнозирования классов в последовательной модели. На случай, если вам когда-нибудь понадобится это в функциональной модели в будущем, это решение:

 y_prob = model.predict(x_test) 
y_classes = y_prob.argmax(axis=-1)