0

J'essaie de calculer le f1_score mais je reçois des avertissements dans certains cas lorsque j'utilise la méthode sklearn f1_score.Comment calculer F1-Score pour la classification Multilabel?

J'ai un problème de classe 5 multilabel pour une prédiction.

import numpy as np 
from sklearn.metrics import f1_score 

y_true = np.zeros((1,5)) 
y_true[0,0] = 1 # => label = [[1, 0, 0, 0, 0]] 

y_pred = np.zeros((1,5)) 
y_pred[:] = 1 # => prediction = [[1, 1, 1, 1, 1]] 

result_1 = f1_score(y_true=y_true, y_pred=y_pred, labels=None, average="weighted") 

print(result_1) # prints 1.0 

result_2 = f1_score(y_true=y_ture, y_pred=y_pred, labels=None, average="weighted") 

print(result_2) # prints: (1.0, 1.0, 1.0, None) for precision/recall/fbeta_score/support 

Lorsque j'utilise average="samples" au lieu de "weighted" I get (0.1, 1.0, 0,1818 ..., Aucun). L'option "weighted" n'est-elle pas utile pour un problème multilabel ou comment utiliser la méthode f1_score correctement?

Je reçois aussi un avertissement lors de l'utilisation average="weighted":

« UndefinedMetricWarning:. Rappel et F-score sont mal définis et être mis à 0,0 dans les étiquettes sans véritables échantillons »

Répondre

1

Il fonctionne si vous ajoutez des données légèrement:

y_true = np.array([[1,0,0,0], [1,1,0,0], [1,1,1,1]]) 
y_pred = np.array([[1,0,0,0], [1,1,1,0], [1,1,1,1]]) 

recall_score(y_true=y_true, y_pred=y_pred, average='weighted') 
>>> 1.0 
precision_score(y_true=y_true, y_pred=y_pred, average='weighted') 
>>> 0.9285714285714286 

f1_score(y_true=y_true, y_pred=y_pred, average='weighted') 
>>> 0.95238095238095244 

Les données suggèrent que nous avons manqué aucun des vrais positifs et n'a pas prévu de faux négatifs (recall_score est égal à 1). Cependant, nous avons prédit un faux positif dans la seconde observation qui a conduit à precision_score égal ~ 0,93.

Comme les deux precision_score et recall_score ne sont pas nuls avec le paramètre weighted, f1_score, donc, existe. Je crois que votre cas est invalide en raison du manque d'information dans l'exemple.

+0

Salut mon tableau avec np.zeros ((1,5)) a la forme (1,5) je viens d'écrire un commentaire pour donner un exemple à quoi ressemble un échantillon mais il est réel la forme comme ceci [[1 , 0,0,0,0] ...]. Le problème est que f1_score fonctionne avec average = "micro"/"macro" mais pas avec "pondéré". Donc ma question est de savoir si l'option "pondérée" ne fonctionne pas avec multilabel ou si je dois définir d'autres options comme labels/pos_label dans la fonction f1_score. –

+0

Lire la réponse, s'il vous plaît. Vous ne pouvez pas travailler avec une variable cible dont la forme est (1, 5). Dans ce cas, votre 'f1_score' ne fonctionne pas même avec une moyenne 'micro' ou 'macro'. –

+0

Lorsque j'utilise le ravel pour obtenir la forme (5,), il utilise une valeur comme un échantillon, donc cela ne fonctionne pas pour multilabel, par ex. quand j'essaie cette forme avec average = "samples", j'obtiens l'erreur "précision basée sur l'échantillon, rappel, fscore n'a pas de sens en dehors de la classification multilabel." Je reçois des résultats de travail pour la forme (1,5) pour micro et macro (et ils sont corrects) le seul problème est pour l'option moyenne = "pondérée" –