web-dev-qa-db-fra.com

Précision / rappel pour la classification multiclasse-multilabel

Je me demande comment calculer les mesures de précision et de rappel pour la classification multiclasse multi-étiquettes, c'est-à-dire la classification où il y a plus de deux étiquettes et où chaque instance peut avoir plusieurs étiquettes?

28
MaVe

Pour la classification multi-étiquettes, vous pouvez procéder de deux manières. Considérez d'abord ce qui suit.

  • $n$ est le nombre d'exemples.
  • $Y_i$ est l'affectation d'étiquette de vérité terrain de $i^{th}$ exemple ..
  • $x_i$ est le $i^{th}$ exemple.
  • $h(x_i)$ est les étiquettes prédites pour $i^{th}$ exemple.

Basé sur un exemple

Les métriques sont calculées par point de données. Pour chaque étiquette prédite, son seul score est calculé, puis ces scores sont agrégés sur tous les points de données.

  • Précision = $\frac{1}{n}\sum_{i=1}^{n}\frac{|Y_{i}\cap h(x_{i})|}{|h(x_{i})|}$ , Le ratio de la proportion de la valeur prédite correcte. Le numérateur trouve combien d'étiquettes dans le vecteur prédit ont en commun avec la vérité terrain, et le rapport calcule combien d'étiquettes vraies prédites se trouvent réellement dans la vérité terrain.
  • Rappel = $\frac{1}{n}\sum_{i=1}^{n}\frac{|Y_{i}\cap h(x_{i})|}{|Y_{i}|}$ , Le ratio du nombre d'étiquettes réelles prévues. Le numérateur trouve combien d'étiquettes dans le vecteur prédit a en commun avec la vérité terrain (comme ci-dessus), puis trouve le rapport au nombre d'étiquettes réelles, obtenant ainsi la fraction des étiquettes réelles prédites.

Il existe également d'autres paramètres.

Basé sur l'étiquette

Ici, les choses sont faites au niveau des étiquettes. Pour chaque étiquette, les métriques (par exemple, précision, rappel) sont calculées, puis ces métriques par étiquette sont agrégées. Par conséquent, dans ce cas, vous finissez par calculer la précision/le rappel pour chaque étiquette sur l'ensemble de données, comme vous le faites pour une classification binaire (car chaque étiquette a une affectation binaire), puis l'agréger.

Le moyen le plus simple est de présenter la forme générale.

Ceci est juste une extension de l'équivalent multi-classes standard.

  • Macro moyennée $\frac{1}{q}\sum_{j=1}^{q}B(TP_{j},FP_{j},TN_{j},FN_{j})$

  • Micro en moyenne $B(\sum_{j=1}^{q}TP_{j},\sum_{j=1}^{q}FP_{j},\sum_{j=1}^{q}TN_{j},\sum_{j=1}^{q}FN_{j})$

Ici le $TP_{j},FP_{j},TN_{j},FN_{j}$ sont respectivement les nombres vrais positifs, faux positifs, vrais négatifs et faux négatifs pour seulement $j^{th}$ étiquette .

Ici, $ B $ représente n'importe quelle métrique basée sur la matrice de confusion. Dans votre cas, vous insérez les formules standard de précision et de rappel. Pour la moyenne macro, vous passez le nombre par étiquette, puis la somme, pour la moyenne micro, vous faites d'abord la moyenne des comptages, puis appliquez votre fonction métrique.

Vous pourriez être intéressé par le code des métriques multi-étiquettes ici , qui fait partie du package mldr in R . Vous pourriez également être intéressé par la bibliothèque Java multi-label library MULAN .

Ceci est un bon article pour entrer dans les différentes métriques: ne revue sur les algorithmes d'apprentissage multi-étiquettes

16
phoxis

La réponse est que vous devez calculer la précision et le rappel pour chaque classe, puis les faire la moyenne ensemble. Par exemple. si vous classez A, B et C, votre précision est:

(precision(A) + precision(B) + precision(C)) / 3

Idem pour le rappel.

Je ne suis pas un expert, mais c'est ce que j'ai déterminé sur la base des sources suivantes:

https://list.scms.waikato.ac.nz/pipermail/wekalist/2011-March/051575.html http://stats.stackexchange.com/questions/21551/how-to- calcul-précision-rappel-pour-classification-multiclasse-multilabel

7
Mark E. Haase
  • Supposons que nous ayons un problème de classification multiple à 3 classes avec les étiquettes A, B et C.
  • La première chose à faire est de générer une matrice de confusion. Notez que les valeurs dans la diagonale sont toujours les vrais positifs (TP).
  • Maintenant, pour calculer rappeler pour l'étiquette A, vous pouvez lire les valeurs de la matrice de confusion et calculer:

    = TP_A/(TP_A+FN_A)
    = TP_A/(Total gold labels for A)
    
  • Maintenant, calculons précision pour l'étiquette A, vous pouvez lire les valeurs de la matrice de confusion et calculer:

    = TP_A/(TP_A+FP_A)
    = TP_A/(Total predicted as A)
    
  • Il vous suffit de faire de même pour les autres étiquettes B et C. Cela s'applique à tout problème de classification multi-classe.

Ici est l'article complet qui explique comment calculer la précision et le rappel pour tout problème de classification multi-classe, y compris des exemples.

5
kavgan

Dans python en utilisant sklearn et numpy:

from sklearn.metrics import confusion_matrix
import numpy as np

labels = ...
predictions = ...

cm = confusion_matrix(labels, predictions)
recall = np.diag(cm) / np.sum(cm, axis = 1)
precision = np.diag(cm) / np.sum(cm, axis = 0)
1
Cristian Garcia

Une moyenne simple fera l'affaire si les classes sont équilibrées.

Sinon, le rappel pour chaque classe réelle doit être pondéré par la prévalence de la classe, et la précision de chaque étiquette prévue doit être pondérée par le biais (probabilité) pour chaque étiquette. Dans tous les cas, vous obtenez une précision aléatoire.

Un moyen plus direct est de créer un tableau de contingence normalisé (diviser par N pour que le tableau ajoute jusqu'à 1 pour chaque combinaison d'étiquette et de classe) et d'ajouter la diagonale pour obtenir la précision Rand.

Mais si les classes ne sont pas équilibrées, le biais demeure et une méthode corrigée au hasard telle que kappa est plus appropriée, ou mieux encore une analyse ROC ou une mesure correcte au hasard telle que l'information (hauteur au-dessus de la ligne de hasard en ROC).

1
David M W Powers