Как бороться с строковыми метками в мультиклассовой классификации с керасом?

18

Я новичок в области машинного обучения и кера, и сейчас я занимаюсь многоклассовой классификацией изображений с помощью кера. На входе помечено изображение. После некоторой предварительной обработки данные обучения представлены в списке Python как:

[["dog", "path/to/dog/imageX.jpg"],["cat", "path/to/cat/imageX.jpg"], ["bird", "path/to/cat/imageX.jpg"]]

«собака», «кошка» и «птица» являются метками класса. Я думаю, что для этой проблемы следует использовать горячее кодирование, но я не очень понимаю, как с этим справляться, используя эти строковые метки. Я попробовал LabelEncoder () в sklearn следующим образом:

encoder = LabelEncoder()
trafomed_label = encoder.fit_transform(["dog", "cat", "bird"])
print(trafomed_label)

И результат равен [2 1 0], который отличается от того, что я ожидал от чего-то подобного [[1,0,0], [0,1,0], [0,0,1]]. Это можно сделать с помощью некоторого кодирования, но я хотел бы знать, существует ли какой-то «стандартный» или «традиционный» способ справиться с этим?

Dracarys
источник

Ответы:

14

Модуль Sklearn LabelEncoderнаходит все классы и присваивает каждому числовой идентификатор, начиная с 0. Это означает, что независимо от того, какие представления ваших классов находятся в исходном наборе данных, у вас теперь есть простой последовательный способ представления каждого из них. Он не выполняет горячее кодирование, хотя, как вы правильно идентифицируете, он довольно близок, и вы можете использовать эти идентификаторы для быстрой генерации горячего кодирования в другом коде.

Если вы хотите использовать горячее кодирование, вы можете использовать LabelBinarizerвместо этого. Это работает очень похоже:

 from sklearn.preprocessing import LabelBinarizer
 encoder = LabelBinarizer()
 transfomed_label = encoder.fit_transform(["dog", "cat", "bird"])
 print(transfomed_label)

Выход:

[[0 0 1]
 [0 1 0]
 [1 0 0]]
Нил Слэйтер
источник
Но как может помочь кодирование, когда вы попытаетесь предсказать новый цвет? Возможно, в вашем случае вам придется переучить модель. У вас есть какое-нибудь решение?
gtzinos
@ gtzinos: это похоже на другой вопрос. Возможно, спросите об этом на сайте. Если вы это сделаете, уточните, беспокоитесь ли вы о том, что NN предсказывает новый элемент (не замеченный в данных обучения, но логически должен происходить на новых входах), или добавляя новые классы на лету, когда они встречаются в данных онлайн-обучения.
Нил Слэйтер