it-swarm.com.de

Keras: Wie wird die Genauigkeit für die Multi-Label-Klassifizierung berechnet?

Ich mache die Toxic Comment Text Classification Kaggle Challenge. Es gibt 6 Klassen: ['threat', 'severe_toxic', 'obscene', 'insult', 'identity_hate', 'toxic']. Ein Kommentar kann aus mehreren dieser Klassen bestehen, daher handelt es sich um ein Klassifizierungsproblem mit mehreren Labels.

Ich habe ein grundlegendes neuronales Netzwerk mit Keras wie folgt aufgebaut:

model = Sequential()
model.add(Embedding(10000, 128, input_length=250))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(len(classes), activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

Ich führe diese Zeile aus:

model.fit(X_train, train_y, validation_split=0.5, epochs=3)

und erhalten nach 3 Epochen eine Genauigkeit von 99,11%.

Die Genauigkeit von 99,11% ist jedoch ein gutes Stück höher als die beste Einreichung von Kaggle. Dies lässt mich denken, dass ich entweder (möglicherweise beide) a) überanpasse oder b) die Genauigkeit von Keras missbrauche.

1) Es scheint ein bisschen schwer zu überladen zu sein, wenn ich 50% meiner Daten als Validierungssplit und nur 3 Epochen verwende.

2) Ist die Genauigkeit hier nur der Prozentsatz der Zeit, zu der das Modell jede Klasse richtig erhält?

Wenn ich also [0, 0, 0, 0, 0, 1] ausgab und die korrekte Ausgabe [0, 0, 0, 0, 0, 0] war, wäre meine Genauigkeit 5/6?

Nach einigem Nachdenken denke ich, dass die accuracy-Metrik hier nur die Klasse betrachtet, die mein Modell mit höchster Sicherheit vorhersagt und die Wahrheit im Vergleich zum Hintergrund vergleicht. 

Wenn mein Modell also [0, 0, 0.9, 0, 0, 0] ausgibt, vergleicht es die Klasse an Index 2 ('obszön') mit dem wahren Wert. Glaubst du, das ist, was passiert?

Vielen Dank für jede Hilfe, die Sie anbieten können!

7
bclayman

Für die Multi-Label-Klassifizierung halte ich es für richtig, sigmoid als Aktivierung und binary_crossentropy als Verlust zu verwenden.

Wenn es sich bei der Ausgabe um spärliche Multi-Labels handelt, was bedeutet, dass einige positive Labels und eine Mehrheit negative Labels sind, wird die Keras-Variable accuracy von den korrekt vorhergesagten negativen Labels überflattert. Wenn ich mich recht erinnere, wählt Keras das Etikett nicht mit der höchsten Wahrscheinlichkeit. Bei der binären Klassifizierung liegt der Schwellenwert dagegen bei 50%. Die Vorhersage wäre also [0, 0, 0, 0, 0, 1]. Wenn die tatsächlichen Etiketten [0, 0, 0, 0, 0, 0] wären, wäre die Genauigkeit 5/6. Sie können diese Hypothese testen, indem Sie ein Modell erstellen, das immer eine negative Kennzeichnung vorhersagt und die Genauigkeit überprüft.

Wenn dies tatsächlich der Fall ist, können Sie eine andere Metrik verwenden, z. B. top_k_categorical_accuracy .

Eine andere entfernte Möglichkeit, an die ich denken kann, sind Ihre Trainingsdaten. Sind die Etiketten in x irgendwie "durchgesickert"? Nur eine wilde Vermutung.

3
neurite

In der Dokumentation zu Keras Metrics finden Sie alle verfügbaren Metriken (z. B. binary_accuracy). Sie können auch Ihre eigene benutzerdefinierte Metrik erstellen (und sicherstellen, dass sie genau das tut, was Sie erwarten). Ich wollte sicherstellen, dass neurite richtig war, wie die Genauigkeit berechnet wird, also habe ich Folgendes getan (Anmerkung: activation="sigmoid"):

from keras.metrics import binary_accuracy
def custom_acc(y_true, y_pred):
    return binary_accuracy(y_true, y_pred)

# ...

model.compile(loss="binary_crossentropy", optimizer=optimizer, metrics=[
    "accuracy",
    "binary_accuracy",
    "categorical_accuracy",
    "sparse_categorical_accuracy",
    custom_acc
])

Während des Trainings sehen Sie, dass der custom_acc immer gleich dem binary_accuracy ist (und somit dem custom_acc). 

Nun können Sie auf den Keras-Code in Github zugreifen, um zu sehen, wie er berechnet wird: 

K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)

Welche bestätigen, was neurite gesagt hat (d. H. Wenn die Vorhersage [0, 0, 0, 0, 0, 1] ist und die tatsächlichen Labels [0, 0, 0, 0, 0, 0] wären, wäre die Genauigkeit 5/6). 

2
smichaud