#python #keras #classification
#python #keras #классификация
Вопрос:
Я выполняю простую классификацию двоичного текста. Шаги идут примерно так:
- предварительная обработка обучающих данных с помощью CountVectorizer()
- постройте модель keras Sequential()
- model.fit(x_train, y_train)
- model.evaluate(x_val, y_val)
- 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)