Training auf unausgeglichenen Daten mit TensorFlow

Die Situation:

Frage ich mich, wie zu verwenden TensorFlow optimal, wenn meine Trainingsdaten ist unausgewogen in der label distribution zwischen 2 Etiketten. Nehmen wir zum Beispiel an die MNIST-tutorial ist vereinfacht, um nur unterscheiden zwischen 1 und 0 ist, wo alle Bilder zur Verfügung, die uns entweder 1 oder 0 ist. Dies ist einfach zu trainieren mit dem mitgelieferten TensorFlow tutorials, wenn wir etwa 50% von jeder Art von Bild-zu trainieren und zu testen auf. Aber was ist mit dem Fall, wo 90% der Bilder in unseren Daten sind 0 und nur 10% sind 1? Ich beobachte, dass in diesem Fall TensorFlow routinemäßig prognostiziert meine gesamte test-set, um die 0 sein, die Erreichung einer Genauigkeit von einer bedeutungslosen 90%.

Einer Strategie, die ich verwendet haben, zu einigen Erfolg ist die Auswahl random batches für die Ausbildung, für die eine gleichmäßige Verteilung von 0 und 1 ist. Dieser Ansatz sorgt dafür, dass ich noch alle meine Trainings-Daten und erzeugt gute Ergebnisse, die mit weniger als 90% Genauigkeit, sondern viel mehr nützlich Klassifizierer. Da die Genauigkeit ist etwas nutzlos für mich in diesem Fall, meine Metrik der Wahl ist in der Regel die Fläche unter der ROC-Kurve (AUROC), und dies führt zu einem Ergebnis anständig höher als .50.

Fragen:

(1) Ist die Strategie, die ich beschrieben habe, eine angenommene oder optimalen Weg der Ausbildung auf unausgeglichenen Daten, oder gibt es eine, die vielleicht besser funktionieren?

(2) Da die Genauigkeit Metrik ist nicht so nützlich im Falle von unausgeglichenen Daten, ist es eine andere Metrik, die maximiert werden können durch Veränderung der Kostenfunktion? Ich kann sicherlich berechnen AUROC nach dem training, aber kann ich auch trainieren, in einer Weise zu maximieren AUROC?

(3) gibt es eine weitere änderung, die ich machen kann, um meine Kosten zu Funktion zu verbessern meine Ergebnisse für unbalancierte Daten? Derzeit bin ich mit einer Standard-Vorschlag in TensorFlow tutorials:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

Ich habe gehört, dass dies möglich sein kann, die durch Gewichtung der Kosten von miscategorizing die kleiner label-Klasse, aber ich bin nicht sicher, wie dies zu tun.

  • Hast du dein problem gelöst? Ich habe ein ähnliches problem, und ich bin derzeit am Experimentieren mit einer) Dropout-50% bei hidden1, b) L2-Regularisierung auf den Verlust und c) entfernen der prominentesten 90% der Klasse und der Berechnung mit den 10% gleichmäßig verteilten Klassen.
  • Ich habe Sie auch nie finden, eine bessere Lösung als die Einnahme von random batches. Für Geschäftstüchtigkeit, beendete ich aufgegeben neuronalen Netze insgesamt zu Gunsten der Baum-basierten Methoden implementiert, die in scikit-learn. Hier gibt es built-in cross-Validierung Methoden Optimierung auf AUROC das löst das Ungleichgewicht problem schön. Sie führen auch viel schneller als TensorFlow da ich viel von CPUs aber keine GPU.
InformationsquelleAutor MJoseph | 2016-01-27
Schreibe einen Kommentar