Ich weiß, dass es in Keras eine Möglichkeit gibt, das class_weights
Parameterwörterbuch anzupassen, aber ich konnte kein Beispiel finden. Würde jemand so freundlich sein, einen zur Verfügung zu stellen?
Übrigens ist es in diesem Fall die angemessene Praxis, die Minderheitenklasse proportional zu ihrer Unterrepräsentation zu gewichten?
classification
keras
weighted-data
Hendrik
quelle
quelle
Antworten:
Wenn Sie über den regulären Fall sprechen, in dem Ihr Netzwerk nur eine Ausgabe erzeugt, ist Ihre Annahme korrekt. Um Ihren Algorithmus zu zwingen, jede Instanz von Klasse 1 als 50 Instanzen von Klasse 0 zu behandeln , müssen Sie:
Definieren Sie ein Wörterbuch mit Ihren Bezeichnungen und den dazugehörigen Gewichten
Füttere das Wörterbuch als Parameter:
BEARBEITEN: "Behandle jede Instanz von Klasse 1 als 50 Instanzen von Klasse 0 " bedeutet, dass Sie in Ihrer Verlustfunktion diesen Instanzen einen höheren Wert zuweisen. Daher wird der Verlust zu einem gewichteten Durchschnitt, wobei das Gewicht jeder Stichprobe durch class_weight und die entsprechende Klasse angegeben wird.
Aus Keras-Dokumenten: class_weight : Optionales Wörterbuch, das Klassenindizes (Ganzzahlen) einem Gewichtungswert (float) , der zur Gewichtung der Verlustfunktion verwendet wird (nur während des Trainings).
quelle
Sie könnten einfach implementieren die
class_weight
aussklearn
:Lassen Sie uns zuerst das Modul importieren
Um das Klassengewicht zu berechnen, gehen Sie wie folgt vor
Drittens und zuletzt zum Modellfitting hinzufügen
Achtung : Ich habe diesen Beitrag bearbeitet und den Variablennamen von class_weight in class_weight s geändert, um das importierte Modul nicht zu überschreiben. Passen Sie dies an, wenn Sie den Code aus den Kommentaren kopieren.
quelle
class_weight.compute_class_weight
Produziert für mich ein Array, muss ich es in ein Diktat ändern, um mit Keras zu arbeiten. Verwendenclass_weight_dict = dict(enumerate(class_weight))
y_train
ist(300096, 3)
Numpy Array. Dieclass_weight=
Zeile gibt mir also TypeError: unhashable type: 'numpy.ndarray'y_ints = [y.argmax() for y in y_train]
.Ich benutze diese Art von Regel für
class_weight
:math.log
glättet die Gewichte für sehr unausgeglichene Klassen! Dies ergibt:quelle
n_total_samples / n_class_samples
für jede Klasse verwendet.HINWEIS: Siehe Kommentare, diese Antwort ist veraltet.
Um alle Klassen gleich zu gewichten, können Sie class_weight jetzt einfach wie folgt auf "auto" setzen:
quelle
class_weight='auto'
in der Keras-Dokumentation noch im Quellcode einen Verweis auf finden . Können Sie uns zeigen, wo Sie das gefunden haben?class_weight
, ohne dass dies Auswirkungen hat. Diese Antwort ist daher nicht richtig.class_weight ist in Ordnung, aber wie @Aalok sagte, funktioniert dies nicht, wenn Sie mehrfach beschriftete Klassen mit One-Hot-Codierung verwenden. In diesem Fall verwenden Sie sample_weight :
sample_weights wird verwendet, um ein Gewicht für jede Trainingsprobe bereitzustellen . Das bedeutet, dass Sie ein 1D-Array mit der gleichen Anzahl von Elementen wie Ihre Trainingsmuster übergeben sollten (wobei das Gewicht für jedes dieser Muster angegeben wird).
class_weights wird verwendet, um eine Gewichtung oder eine Verzerrung für jede Ausgabeklasse bereitzustellen . Das bedeutet, dass Sie für jede Klasse, die Sie klassifizieren möchten, eine Gewichtung übergeben sollten.
sample_weight muss ein numpy-Array zugewiesen werden, da seine Form ausgewertet wird.
Siehe auch diese Antwort: https://stackoverflow.com/questions/48315094/using-sample-weight-in-keras-for-sequence-labelling
quelle
Hinzufügen zur Lösung unter https://github.com/keras-team/keras/issues/2115 . Wenn Sie mehr als eine Klassengewichtung benötigen, bei der Sie unterschiedliche Kosten für falsch-positive und falsch-negative Ergebnisse wünschen. Mit der neuen Keras-Version können Sie nun die unten angegebene Verlustfunktion überschreiben. Beachten Sie, dass dies
weights
eine quadratische Matrix ist.quelle
Ich habe das folgende Beispiel für die Codierung von Klassengewichten in der Verlustfunktion mithilfe des Minist-Datasets gefunden. Siehe Link hier: https://github.com/keras-team/keras/issues/2115
quelle
Dies funktioniert mit einem Generator oder Standard. Ihre größte Klasse hat eine Gewichtung von 1, während die anderen Werte größer als 1 in Bezug auf die größte Klasse haben.
Klassengewichte akzeptieren eine Eingabe vom Typ Wörterbuch
quelle