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?
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.
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.
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