web-dev-qa-db-fra.com

Quelle fonction de perte et les métriques à utiliser pour la classification multi-étiquettes avec un très élevé de négatifs aux positifs?

Je forme un modèle de classification multi-étiquettes pour détecter des attributs de vêtements. J'utilise l'apprentissage de transfert à Keras, en reconvoyant les dernières couches du modèle VGG-19.

Le nombre total d'attributs est de 1000 et environ 99% d'entre eux sont 0s. Les métriques telles que la précision, la précision, le rappel, etc., tout échec, car le modèle peut prédire tous les zéros et atteindre toujours un score très élevé. Entropie transversale binaire, perte de halogerie, etc., n'ont pas travaillé dans le cas des fonctions de perte.

J'utilise le jeu de données de mode profond.

Alors, quelles fonctions de métrique et de perte puis-je utiliser pour mesurer mon modèle correctement?

6
Mrinal Jain

Ce que Hassan a suggéré n'est pas correct - la perte de la perche croisée catégorique ou la perte softmax est une activation softmax plus une perte croisée. Si nous utilisons cette perte, nous formerons un CNN pour produire une probabilité sur les classes C pour chaque image. Il est utilisé pour classification multi-classes.

Ce que vous voulez, c'est une classification multi-étiquettes, vous allez donc utiliser perte transversale binaire ou perte croisée sigmoïde. C'est une activation sigmoïde plus une perte transversale. Contrairement à la perte Softmax, il est indépendant pour chaque composant de vecteur (classe), ce qui signifie que la perte calculée pour chaque composant vectoriel de sortie CNN n'est pas affectée par d'autres valeurs de composant. C'est pourquoi il est utilisé pour la classification multi-étiquettes, où la perspicacité d'un élément appartenant à une certaine classe ne devrait pas influencer la décision d'une autre classe.

Maintenant, pour la manipulation du déséquilibre de classe, vous pouvez utiliser une perte de l'entropie transversale sigmoïde pondérée. Vous allez donc pénaliser pour une mauvaise prédiction basée sur le nombre/le ratio d'exemples positifs.

1
Solaiman Salvi

La classification multi-classe et de classe binaire Déterminez le nombre d'unités de sortie, c'est-à-dire le nombre de neurones dans la couche finale. Multi-étiquette et une seule étiquette unique détermine le choix de la fonction d'activation pour la fonction finale et la fonction de perte que vous devez utiliser. Pour une seule étiquette, le choix standard est Softmax avec une interruption croisée catégorique; Pour les étiquettes multiples, passez à des activations sigmoïdes avec interrupopie binaire.

Entropie Catégorie:

enter image description here

Interstropie binaire:

enter image description here

C est le nombre de classes et m est le nombre d'exemples dans le mini-lot actuel. L est la fonction de perte et J est la fonction de coût. Vous pouvez également voir ici . Dans la fonction de perte, vous êtes itération sur différentes classes. Dans la fonction de coût, vous êtes itérant sur les exemples du mini-lot actuel.

0
Media

J'ai été dans une situation Simialr comme le vôtre

vous pouvez utiliser une fonction d'activation Softmax dans la couche de sortie avec Catégorical_crossentropy pour vérifier d'autres métriques telles que la précision, le rappel et la partition F1 Vous pouvez utiliser la bibliothèque Sklearn comme suit:

from sklearn.metrics import classification_report

y_pred = model.predict(x_test, batch_size=64, verbose=1)
y_pred_bool = np.argmax(y_pred, axis=1)

print(classification_report(y_test, y_pred_bool))

quant au stade de la formation en ce qui suit la précision de la précision comme suit

model.compile(loss='categorical_crossentropy'
              , metrics=['acc'], optimizer='adam')

si cela vous aide, vous pouvez tracer l'historique de formation pour la perte et la précision de votre stade de formation à l'aide de Matplotlib comme suit:

hist = model.fit(x_train, y_train, batch_size=24, epochs=1000, verbose=2,
                 callbacks=[checkpoint],
                 validation_data=(x_valid, y_valid)

                 )
# Plot training & validation accuracy values
plt.plot(hist.history['acc'])
plt.plot(hist.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

# Plot training & validation loss values
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
0
xxzozoxx1