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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
(1)Es ist ok zu verwenden, Ihre Strategie. Ich arbeite mit unbalancierte Daten, die ich versuchen, verwenden Sie die down-sampling und sampling-Methoden, um die Ausbildung gesetzt, selbst verteilt. Oder mit ensemble-Methode zu trainieren, jeder Klassifizierer mit einer noch verteilt Teilmenge.
(2)ich habe nicht gesehen, eine Methode zur Maximierung der AUROC. Mein Gedanke ist, dass AUROC basiert auf tur-positive-rate und false-positive-rate, die nicht sagen, wie gut es funktioniert auf jeden Fall. Es kann daher nicht unbedingt, maximieren die Fähigkeit zur Trennung der Klassen.
(3)in Bezug auf die Gewichtung der Kosten durch das Verhältnis von Klassen-Instanzen, ähnlich wie Verlust-Funktion für die Klasse unausgewogen binären Klassifizierer in Tensor-flow
und die Antwort.
Bezüglich unausgewogene Datensätze, die ersten zwei Methoden in den Sinn kommen, sind (Auflastung positiven Proben, Probenahme, um eine ausgewogene batch-Distributionen).
Auflastung positiven Proben
Dies bezieht sich auf die Erhöhung der Verluste eines fehlerhaft positiven Proben beim training auf datasets, die haben viel weniger positive Proben. Dies schafft der ML-Algorithmus zum lernen von Parametern, die besser sind für positive Proben. Für binäre Klassifikation, gibt es eine einfache API in tensorflow, die dies erreicht. Siehe (weighted_cross_entropy), die weiter unten aufgeführt
Batch-Probenahme -
Dies beinhaltet die Probenahme die dataset, so dass jede charge von Trainingsdaten ist eine gleichmäßige Verteilung positive Proben negative Proben. Dies kann mit der Ablehnung die sampling-API zur Verfügung gestellt von tensorflow.
Ich bin derjenige, der kämpft mit dem Gleichgewicht, Daten. Was meine Strategie gegen unbalancierte Daten sind als unten.
1) Nutzen-Kosten-Funktion zur Berechnung 0 und 1 Etiketten zur gleichen Zeit wie unten.
2) Verwenden Sie SCHLUG, oversampling-Methode machen Anzahl von 0 und 1 Etiketten ähnlich. Siehe hier, http://comments.gmane.org/gmane.comp.python.scikit-learn/5278
Strategie funktioniert, wenn ich versucht, die Kredit-rating-Modell.
Logistischen regression ist die typische Methode, mit der unausgewogenen Daten und binäre Klassifikation wie die Vorhersage Standard-rate. AUROC ist eines der besten Metrik zu begegnen unbalancierte Daten.
1) ja. Dieser ist gut erhalten Strategie gegen unbalancierte Daten. Aber diese Strategie ist gut in der Neuronale-Netze nur, wenn Sie mit SGD.
Einen anderen einfachen Weg, um die balance der Trainingsdaten mit gewichteten Beispielen. Verstärken nur die pro-Instanz-Verlust durch ein größeres Gewicht/kleiner wenn man die einseitigen Beispiele. Wenn Sie online-gradient descent, es kann so einfach wie mit einer größeren/kleineren lernraten wenn man die einseitigen Beispiele.
Nicht sicher 2.