3

Je travaille sur un problème de classification multiclasse en utilisant Keras et j'utilise la précision binaire et la précision catégorique comme métriques. Quand j'évalue mon modèle, j'obtiens une valeur vraiment élevée pour la précision binaire et une valeur très basse pour la précision catégorique. J'ai essayé de recréer la métrique de précision binaire dans mon propre code mais je n'ai pas beaucoup de chance. Je crois comprendre que c'est le processus que je dois recréer:La métrique de précision binaire de Keras donne une précision trop élevée

def binary_accuracy(y_true, y_pred): 
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1) 

Voici mon code:

from keras import backend as K 
preds = model.predict(X_test, batch_size = 128) 

print preds 
pos = 0.00 
neg = 0.00 

for i, val in enumerate(roundpreds): 

    if val.tolist() == y_test[i]: 
     pos += 1.0 

    else: 
     neg += 1.0 

print pos/(pos + neg) 

Mais cela donne une valeur beaucoup plus faible que celle donnée par la précision binaire. La précision binaire est-elle même une métrique appropriée à utiliser dans un problème multi-classes? Si oui, est-ce que quelqu'un sait où je vais mal?

+3

Vous ne devriez pas utiliser la précision binaire pour un problème multiclass, les résultats n'auraient pas de sens. –

Répondre

2

Vous devez donc comprendre ce qui se passe lorsque vous appliquez un binary_crossentropy à une prédiction multiclasse.

  1. Supposons que votre sortie de softmax est (0.1, 0.2, 0.3, 0.4) et une chaude vérité au sol est codé (1, 0, 0, 0).
  2. binary_crossentropy masque toutes les sorties qui sont supérieures à 0.5 donc hors de votre réseau est (0, 0, 0, 0) vecteur.
  3. (0, 0, 0, 0) matchs sur (1, 0, 0, 0) Ground Truth 3 sur 4 indices - ce qui rend la précision résultant soit au niveau de 75% pour une complètement mauvaise réponse!

Pour résoudre ce problème, vous pouvez utiliser une précision de classe unique, par ex. comme celui-ci:

def single_class_accuracy(interesting_class_id): 
    def fn(y_true, y_pred): 
     class_id_preds = K.argmax(y_pred, axis=-1) 
     # Replace class_id_preds with class_id_true for recall here 
     positive_mask = K.cast(K.equal(class_id_preds, interesting_class_id), 'int32') 
     true_mask = K.cast(K.equal(y_true, interesting_class_id), 'int32') 
     acc_mask = K.cast(K.equal(positive_mask, true_mask), 'float32') 
     class_acc = K.mean(acc_mask) 
     return class_acc 

    return fn 
+0

Est-ce que ma réponse vous a aidé? Si oui - je serais d'accord accepter et upvote :) –