Ich habe ein neuronales Netzwerk eingerichtet, um etwas vorherzusagen, bei dem die Ausgabevariable ordinal ist. Ich werde im Folgenden drei mögliche Ausgänge A <B <C beschreiben.
Es ist ziemlich offensichtlich, wie ein neuronales Netzwerk zur Ausgabe kategorialer Daten verwendet wird: Die Ausgabe ist nur ein Softmax der letzten (normalerweise vollständig verbundenen) Schicht, eine pro Kategorie, und die vorhergesagte Kategorie ist die mit dem größten Ausgabewert (dies ist die Standardeinstellung in vielen gängigen Modellen). Ich habe das gleiche Setup für Ordnungswerte verwendet. In diesem Fall sind die Ausgaben jedoch oftmals nicht sinnvoll. Beispielsweise sind die Netzwerkausgaben für A und C hoch, aber B ist niedrig: Dies ist für Ordnungswerte nicht plausibel.
Ich habe eine Idee dafür, nämlich den Verlust zu berechnen, indem die Ausgaben mit 1 0 0 für A, 1 1 0 für B und 1 1 1 für C verglichen werden. Die genauen Schwellenwerte können später mit einem anderen Klassifikator (z. B. Bayesian) eingestellt werden ), aber dies scheint die Grundidee einer Reihenfolge der Eingaben zu erfassen, ohne eine bestimmte Intervallskala vorzuschreiben.
Was ist die Standardmethode zur Lösung dieses Problems? Gibt es Forschungsergebnisse oder Referenzen, die die Vor- und Nachteile verschiedener Ansätze beschreiben?
quelle
Antworten:
Ich glaube, die meisten Leute behandeln die ordinale Klassifikation einfach als generische Klassifikation mit mehreren Klassen. Wenn sie also Klassen haben, haben sie Ausgänge und verwenden einfach eine Sigmoid-Aktivierungsfunktion (nicht offensichtlich Softmax) und binäre Kreuzentropie als Verlust.K K
Einige Leute haben es jedoch geschafft, eine clevere Kodierung für Ihre Ordinalklassen zu erfinden (siehe diese Stackoverflow-Antwort ). Es ist eine Art One-Hot-Codierung,
Klasse 1 wird dargestellt als [0 0 0 0 ...]
Klasse 2 wird dargestellt als [1 0 0 0 ...]
Klasse 3 wird dargestellt als [1 1 0 0 ...]
dh jedes Neuron sagt die Wahrscheinlichkeit voraus . Sie müssen immer noch ein Sigmoid als Aktivierungsfunktion verwenden, aber ich denke, dies hilft dem Netzwerk, eine gewisse Kontinuität zwischen den Klassen zu verstehen, ich weiß es nicht. Anschließend führen Sie eine Nachbearbeitung ( ) durch, um die Binärausgabe in Ihre Klassen zu konvertieren.P(y^<k)
np.sum
Diese Strategie ähnelt dem Ensemble von Frank und Hall , und ich denke, dies ist die erste Veröffentlichung von solchen.
quelle