Comment Keras gère-t-il la classification multilabel?
Je ne sais pas comment interpréter le comportement par défaut de Keras dans la situation suivante:
Mon Y (vérité terrain) a été mis en place à l'aide de scikit-learn MultilabelBinarizer().
Donc, pour donner un hasard, une ligne de mon y la colonne est codée une seule fois comme telle:
[0,0,0,1,0,1,0,0,0,0,1].
donc j'ai 11 classes qui pourraient être prédites, et plus d'une peut être vraie; d'où la nature multicabel du problème. Il y a trois étiquettes pour cette échantillon.
je forme le modèle comme je le ferais pour un problème non multilabel (business as usual) et je ne reçois aucune erreur.
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
model = Sequential()
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.1))
model.add(Dense(600, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(y_train.shape[1], activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy',])
model.fit(X_train, y_train,epochs=5,batch_size=2000)
score = model.evaluate(X_test, y_test, batch_size=2000)
score
Que fait Keras quand il rencontre mon y_train et voit qu'il est" multi " one-hot encoded, ce qui signifie qu'il y a plus d'un 'one' présent dans chaque rangée de <!--4? Fondamentalement, Est-ce que Keras effectue automatiquement la classification multicabel? Les différences dans l'interprétation des paramètres de notation?
1 réponses
En bref
Ne pas utiliser softmax.
Utiliser sigmoid pour l'activation de votre couche de sortie.
Utiliser binary_crossentropy pour la fonction de perte.
Utiliser predict pour l'évaluation.
Pourquoi
softmax lorsque le score augmente pour un label, tous les autres sont abaissés (c'est une distribution de probabilité). Tu ne veux pas de ça quand tu as plusieurs étiquettes.
Code Complet
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
model = Sequential()
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.1))
model.add(Dense(600, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(y_train.shape[1], activation='sigmoid'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy',
optimizer=sgd)
model.fit(X_train, y_train, epochs=5, batch_size=2000)
preds = model.predict(X_test)
preds[preds>=0.5] = 1
preds[preds<0.5] = 0
# score = compare preds and y_test