2017-05-31 2 views
2

Also trainierte ich ein tiefes neuronales Netzwerk auf einem Multi-Label-Dataset, das ich erstellt habe (ca. 20000 Samples). Ich softmax für sigmoid geschaltet und versuchen zu minimieren (Adam Optimierer verwenden):Imbalanced Dataset für Multi-Label-Klassifizierung

tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y_, logits=y_pred) 

Und ich mit diesem König der Vorhersage am Ende (ziemlich „Konstante“):

Prediction for Im1 : [ 0.59275776 0.08751075 0.37567005 0.1636796 0.42361438 0.08701646 0.38991812 0.54468459 0.34593087 0.82790571] 

Prediction for Im2 : [ 0.52609032 0.07885984 0.45780018 0.04995904 0.32828355 0.07349177 0.35400775 0.36479294 0.30002621 0.84438241] 

Prediction for Im3 : [ 0.58714485 0.03258472 0.3349618 0.03199361 0.54665488 0.02271551 0.43719986 0.54638696 0.20344526 0.88144571] 

Zuerst dachte ich, Ich brauchte nur einen Schwellenwert für jede Klasse zu finden.

Aber ich bemerkte, dass zum Beispiel, unter meinen 20000 Proben, die 1. Klasse etwa 10800 erscheint, also ein 0,54 Verhältnis und es ist der Wert um den herum meine Vorhersage ist. Also denke ich, dass ich einen Weg finden muss, um das Thema "unausgeglichenes Dataset" anzugehen.

Ich dachte über die Reduzierung meiner Datenmenge (Undersampling) auf etwa die gleiche Häufigkeit für jede Klasse, aber nur 26 Proben entsprechen einer meiner Klassen ... Das würde mich viele Proben verlieren ...

Ich las über Oversampling oder darüber, noch mehr Klassen zu bestrafen, die selten sind, aber nicht wirklich verstanden, wie es funktioniert.

Kann jemand bitte einige Erläuterungen zu diesen Methoden teilen?

In der Praxis gibt es bei Tensorflow Funktionen, die dabei helfen?

Haben Sie noch weitere Vorschläge?

Danke :)

PS: Neural Network for Imbalanced Multi-Class Multi-Label Classification Dieser Beitrag das gleiche Problem stellt sich, hatte aber keine Antwort!

+0

Warum verwenden Sie nicht alle Proben, die Sie haben, und verwenden Sie diese Unwuchtdaten, um stattdessen einen Anomalie-Erkennungsalgorithmus zu verwenden? – Gabriel

+0

Wenn ich es gut verstehe, schlagen Sie vor, mein Netzwerk auf meine (9) Klassen zu trainieren (die "gut" in meinem Datensatz vertreten sind) und dann ein anderes Netzwerk auf meiner "schlecht repräsentierten" Klasse zu trainieren (wie bei der Binärklassifizierung) Klasse)? –

+1

Nein. Ich empfehle die Verwendung von Algorithmen, die zur Erkennung sehr kleiner Minoritäten, Differenzen für die große Mehrheit Ihrer Daten verwendet werden. Sie werden oft als Anomalie-Erkennungsalgorithmus bezeichnet, denn normalerweise, wenn Sie versuchen, eine Anomalie zu entdecken, haben Sie viele "gute" Proben, aber sehr wenige "abnormale". Diese Algorithmen werden jedoch häufig dazu verwendet, zwischen zwei Klassen zu klassifizieren. Vielleicht ist es nicht gut für dich, aber vielleicht ist es ein Teil eines komplexeren Klassifizierungsvorgangs. – Gabriel

Antwort

1

Gut, 10000 Proben in einer Klasse und nur 26 in einer seltenen Klasse zu haben, wird in der Tat ein Problem sein.

Allerdings, was Sie erleben, scheint mir eher wie "Ausgänge sehen nicht einmal die Eingänge" und damit das Netz lernt nur Ihre Ausgangsverteilung.

Um dies zu debuggen, würde ich einen reduzierten Satz (nur für diesen Debugging-Zweck) mit sagen wir 26 Proben pro Klasse erstellen und dann versuchen, stark überzupassen. Wenn Sie richtige Vorhersagen bekommen, ist mein Gedanke falsch. Aber wenn das Netz diese unterabgetasteten Overfit-Samples nicht einmal erkennen kann, dann ist es in der Tat ein Architektur-/Implementierungsproblem und nicht aufgrund der verschachtelten Verteilung (die Sie dann reparieren müssen. Aber es wird nicht so schlecht wie Ihre aktuellen Ergebnisse sein).

+0

Ich dachte, es könnte ein Problem von meinem Netzwerk auf den ersten sein, aber es funktioniert gut für Single-Label-Klassifizierung wie MNIST (wenn ich Softmax hatte). Aber ich werde noch versuchen, mit 26 Proben pro Klasse überzufüllen! Vielen Dank für Ihre Antwort ! –

+1

Ok, auf jeden Fall hast du Recht gehabt ... leider für mich! Aber, wie ich schon sagte, die exakt gleiche Architektur wurde verwendet, um auf dem MNIST-Dataset und einem von mir erstellten Dataset (Multi-Class-Single-Label) wirklich gut zu lernen und zu spielen! Das einzige, was sich geändert hat, ist, dass ich Softmax durch Sigmoid ersetzt habe .. –

1

Ihr Problem ist nicht die Klassenungleichheit, sondern nur die fehlende Daten. 26 Samples gelten als ein sehr kleiner Datensatz für praktisch jede reale Lernaufgabe. Ein Klassenungleichgewicht könnte leicht bewältigt werden, indem sichergestellt wird, dass jedes Minibatch mindestens eine Stichprobe aus jeder Klasse hat (dies führt zu Situationen, in denen einige Stichproben viel häufiger verwendet werden als andere, aber wen interessiert das?).

Wenn jedoch nur 26 Proben vorhanden sind, führt dieser Ansatz (und alle anderen) schnell zu Überanpassungen. Dieses Problem könnte teilweise mit einer Form der Datenerhöhung gelöst werden, aber es gibt immer noch zu wenige Beispiele, um etwas Vernünftiges zu konstruieren.

Also, mein Vorschlag wird sein, mehr Daten zu sammeln.

+0

26 ist nicht die Größe meines Datensatzes, sondern nur die Anzahl des Auftretens einer Klasse in dem gesamten Datensatz (also 20000 Samples). Vielen Dank für die Idee "sicherzustellen, dass jedes Minibatch mindestens eine Stichprobe aus jeder Klasse hat". Es ist die gleiche Idee wie Oersampling richtig? :) –