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