web-dev-qa-db-fra.com

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é au sol) a été configuré à l'aide de MultilabelBinarizer () de scikit-learn.

Par conséquent, pour donner un exemple aléatoire, une ligne de ma colonne y est codée à chaud comme tel: [0,0,0,1,0,1,0,0,0,0,1].

Donc, j'ai 11 classes qui pourraient être prédites, et plus d'un peut être vrai; D'où le caractère multi-label du problème. Il y a trois étiquettes pour cet échantillon particulier.

Je forme le modèle comme je le ferais pour un problème non multilabel (comme d'habitude) 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 s'agit d'un code "multi" codé à chaud, ce qui signifie qu'il y a plus d'un "un" dans chaque rangée de y_train? Fondamentalement, Keras effectue-t-il automatiquement la classification multilabel? Des différences dans l'interprétation des métriques de scoring?

55
user798719

En bref

N'utilisez pas softmax.

Utilisez sigmoid pour activer votre couche de sortie.

Utilisation binary_crossentropy pour la fonction de perte.

Utilisez predict pour l'évaluation.

Pourquoi

Dans softmax lorsque vous augmentez le score d'une étiquette, toutes les autres sont abaissées (c'est une distribution de probabilité). Vous ne voulez pas que lorsque vous avez 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
84
frankyjuang