Ich habe ein Klassifizierungsproblem mit stark unausgeglichenen Daten. Ich habe gelesen, dass Über- und Unterabtastung sowie die Änderung der Kosten für unterrepräsentierte kategoriale Ausgaben zu einer besseren Anpassung führen. Bevor dies durchgeführt wurde, kategorisierte Tensorflow jede Eingabe als Mehrheitsgruppe (und gewann eine Genauigkeit von über 90%, so bedeutungslos das auch ist).
Ich habe festgestellt, dass das Protokoll des inversen Prozentsatzes jeder Gruppe den besten Multiplikator ergibt, den ich versucht habe. Gibt es eine Standardmanipulation für die Kostenfunktion? Ist das richtig implementiert?
from collections import Counter
counts = Counter(category_train)
weightsArray =[]
for i in range(n_classes):
weightsArray.append(math.log(category_train.shape[0]/max(counts[i],1))+1)
class_weight = tf.constant(weightsArray)
weighted_logits = tf.mul(pred, class_weight)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(weighted_logits, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
Antworten:
Dies scheint eine gute Lösung für die Verlustfunktion zu sein. Ich hatte kürzlich Erfolg mit einem ähnlichen Ansatz, aber ich denke, Sie möchten neu ordnen, wo Sie sich in der multiplizieren
class_weight
.class_weight
Wenn man logisch darüber nachdenkt , wird dies eine Konstante für die Ausgabe sein, so dass es mitgeführt und auf den Gradienten angewendet wird, genauso wie es auf die Kostenfunktion angewendet wird. Es gibt jedoch ein Problem.Die Art und Weise, wie Sie es haben,
class_weight
würde den Vorhersagewert beeinflussen. Sie möchten jedoch, dass sich dies auf die Skalierung des Verlaufs auswirkt. Wenn ich mich nicht irre, sollten Sie die Reihenfolge der Operationen umkehren:Es würde mich sehr interessieren, wie sich dies im Vergleich zu einer einfachen Überabtastung der unterrepräsentierten Klasse verhält, was typischer ist. Wenn du also einen Einblick bekommst, poste darüber! :) :)
Interessanterweise habe ich erst kürzlich erfolgreich eine sehr ähnliche Technik in einem anderen Problembereich angewendet (was mich zu diesem Beitrag geführt hat):
Multitasking-Lernen, Finden einer Verlustfunktion, die bestimmte Proben "ignoriert"
quelle
Kasse
tf.nn.weighted_cross_entropy_with_logits()
:So sollten Sie tun können, was Sie wollen.
quelle
Ich habe 2 verschiedene Implementierungen:
Wo das class_weight ein Platzhalter ist, fülle ich es bei jeder Batch-Iteration aus.
Wo ich die implementierte Tensorflow-Funktion verwende, aber die Gewichte für die Charge berechnen muss. Die Dokumente sind etwas verwirrend. Es gibt zwei Möglichkeiten, dies mit tf.gather oder ähnlichem zu tun:
Hier gibt es eine nette Diskussion darüber
Und schließlich, da ich nicht dauerhaft mit einer der Implementierungen heiraten wollte, fügte ich einen kleinen Fall hinzu und gab die Trainingszeit an die Strategie weiter, die ich verwenden möchte.
quelle