Como lidar com rótulos de string na classificação de várias classes com keras?

18

Eu sou novato em aprendizado de máquina e keras e agora estou trabalhando em um problema de classificação de imagem com várias classes usando keras. A entrada é marcada como imagem. Após algum pré-processamento, os dados de treinamento são representados na lista Python como:

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

o "cachorro", "gato" e "pássaro" são os rótulos da classe. Eu acho que a codificação one-hot deve ser usada para esse problema, mas não sou muito claro sobre como lidar com esses rótulos de string. Eu tentei LabelEncoder () do sklearn desta maneira:

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

E a saída é [2 1 0], que é diferente da minha expectativa de algo como [[1,0,0], [0,1,0], [0,0,1]]. Isso pode ser feito com alguma codificação, mas eu gostaria de saber se existe alguma maneira "padrão" ou "tradicional" de lidar com isso?

Dracarys
fonte

Respostas:

14

O LabelEncodermódulo do Sklearn encontra todas as classes e atribui a cada um um ID numérico a partir de 0. Isso significa que quaisquer que sejam suas representações de classe no conjunto de dados original, agora você tem uma maneira simples e consistente de representar cada uma. Ele não usa codificação one-hot, embora, como você identifique corretamente, esteja bem próximo e você possa usar esses IDs para gerar rapidamente codificações one-hot em outro código.

Se você deseja uma codificação hot-hot, pode usar LabelBinarizer. Isso funciona de maneira muito semelhante:

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

Resultado:

[[0 0 1]
 [0 1 0]
 [1 0 0]]
Neil Slater
fonte
Mas como a hotencoding pode ajudá-lo quando você tenta prever uma nova cor? Talvez no seu caso você precise treinar novamente o modelo. Você tem alguma solução ?
Gtzinos
@ gtzinos: Parece uma pergunta diferente. Talvez pergunte no site. Em caso afirmativo, deixe claro se você está preocupado com a NN prever um item totalmente novo (não visto nos dados de treinamento, mas logicamente deve ocorrer em novas entradas) ou adicionar novas classes dinamicamente quando encontradas nos dados de treinamento on-line.
Neil Slater