Wie gehe ich mit String-Labels in der Mehrklassenklassifikation mit Keras um?

18

Ich bin Neuling in maschinellem Lernen und Keras und arbeite jetzt an einem Problem der Klassifizierung von Bildern mit Keras. Die Eingabe ist Bild markiert. Nach einer gewissen Vorverarbeitung werden die Trainingsdaten in der Python-Liste wie folgt dargestellt:

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

Die Klassenbezeichnungen lauten "Hund", "Katze" und "Vogel". Ich denke, dass One-Hot-Codierung für dieses Problem verwendet werden sollte, aber ich bin nicht sehr klar, wie es mit diesen Zeichenfolgenbezeichnungen umgeht. Ich habe sklearns LabelEncoder () folgendermaßen ausprobiert:

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

Die Ausgabe ist [2 1 0], was sich von der erwarteten Ausgabe von [[1,0,0], [0,1,0], [0,0,1]] unterscheidet. Es kann mit einigem Programmieren gemacht werden, aber ich würde gerne wissen, ob es einen "Standard" oder "traditionellen" Weg gibt, damit umzugehen?

Dracarys
quelle

Antworten:

14

Das LabelEncoderModul von Sklearn findet alle Klassen und weist jeder eine numerische ID ab 0 zu. Dies bedeutet, dass Sie unabhängig davon, welche Klassendarstellungen sich im ursprünglichen Datensatz befinden, nun eine einfache konsistente Möglichkeit haben, jede darzustellen. Es wird keine One-Hot-Codierung durchgeführt, obwohl es, wie Sie richtig erkennen, ziemlich nahe ist und Sie diese IDs verwenden können, um schnell One-Hot-Codierungen in anderem Code zu generieren.

Wenn Sie One-Hot-Codierung möchten, können Sie LabelBinarizerstattdessen verwenden. Das funktioniert sehr ähnlich:

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

Ausgabe:

[[0 0 1]
 [0 1 0]
 [1 0 0]]
Neil Slater
quelle
Aber wie könnte Hotencoding Ihnen helfen, wenn Sie versuchen, eine neue Farbe vorherzusagen? Vielleicht müssen Sie in Ihrem Fall das Modell neu trainieren. Haben Sie eine Lösung?
Gtzinos
@gtzinos: Das sieht nach einer anderen Frage aus. Vielleicht fragen Sie es auf der Website. Wenn Sie dies tun, machen Sie sich klar, ob Sie besorgt sind, wenn NN ein brandneues Element vorhersagt (das in Trainingsdaten nicht angezeigt wird, aber logischerweise bei neuen Eingaben auftreten sollte), oder ob Sie spontan neue Klassen hinzufügen, wenn diese in Online-Trainingsdaten angetroffen werden.
Neil Slater