Comment calculer la précision / rappel pour la classification multiclass-multilabel?

72

Je me demande comment calculer les mesures de précision et de rappel pour la classification multiclass à étiquettes multiples, c'est-à-dire une classification dans laquelle il existe plus de deux étiquettes et où chaque instance peut avoir plusieurs étiquettes?

Vam
la source
1
la partie multilabel rend la tâche beaucoup plus difficile et cela aussi m'intéresse. Je pense que ce n'est pas applicable aux problèmes multi-labels mais ne me faites pas confiance du tout.
user798719
1
En fait, tous les problèmes multilabel sont multiclassables, vous pouvez donc utiliser le package utiml dans R par exemple ou Mulan en Java.
Adriano Rivolli

Réponses:

19

Le ROC / AUC est un autre outil populaire pour mesurer les performances du classifieur . celui-ci aussi a une extension multi-classe / multi-label: voir [Hand 2001]

[Hand 2001]: Une simple généralisation de l'aire sous la courbe ROC à des problèmes de classification de classes multiples

ODDsKooL
la source
C'est populaire, mais ça peut être un buggy. Je ne lui fais pas entièrement confiance. stats.stackexchange.com/questions/93901/…
EngrStudent
3
Ne changez jamais le débordement de pile! Guy pose un problème, la réponse la plus votée ne répond pas vraiment à sa question, mais indique un autre outil / bibliothèque qui serait meilleur
ragvri
Oui, comment cette réponse peut-elle avoir +20? Il ne contient même pas les mots précision et rappel.
Simon Dirmeier le
Si vous réfléchissez bien, vous réaliserez que la précision et le rappel sont réellement capturés par l'AUC.
ODDsKooL
16

Voici quelques discussions sur le fil de discussion de coursera sur la matrice de confusion et la mesure de précision / rappel multi-classes.

L'idée de base est de calculer toute la précision et le rappel de toutes les classes, puis de les calculer en moyenne pour obtenir une mesure de nombre réel unique.

La matrice de confusion facilite le calcul de la précision et du rappel d'une classe.

Vous trouverez ci-dessous quelques explications de base sur la matrice de confusion, copiées à partir de ce fil de discussion:

Une matrice de confusion est un moyen de classer les vrais positifs, les vrais négatifs, les faux positifs et les faux négatifs lorsqu'il existe plus de 2 classes. Il est utilisé pour calculer la précision et le rappel, et donc le score f1 pour des problèmes à plusieurs classes.

Les valeurs réelles sont représentées par des colonnes. Les valeurs prédites sont représentées par des lignes.

Exemples:

10 exemples de formation qui sont en réalité 8, sont classés (prédits) incorrectement comme 5
13 exemples de formation qui sont en réalité 4, sont classés incorrectement comme 9

Matrice de confusion

cm =
     0 1 2 3 4 5 6 7 8 9 10
     1 298 2 1 0 1 1 3 1 1 0
     2 0 293 7 4 1 0 5 2 0 0
     3 1 3 263 0 8 0 0 3 0 2
     4 1 5 0 261 4 0 3 2 0 1
     5 0 0 10 0 254 3 0 10 2 1
     6 0 4 1 1 4 300 0 1 0 0
     7 1 3 2 0 0 0 264 0 7 1
     8 3 5 3 1 7 1 0 289 1 0
     9 0 1 3 13 1 0 11 1 289 0
    10 0 6 0 1 6 1 2 1 4 304

Pour la classe x:

  • Vrai positif: position diagonale, cm (x, x).

  • Faux positif: somme de la colonne x (sans la diagonale principale), somme (cm (:, x)) - cm (x, x).

  • Faux négatif: somme de la ligne x (sans la diagonale principale), somme (cm (x, :), 2) - cm (x, x).

Vous pouvez calculer la précision, le rappel et le score F1 en suivant la formule du cours.

La moyenne de toutes les classes (avec ou sans pondération) donne des valeurs pour l'ensemble du modèle.

Bob Yang
la source
2
Vous avez retourné vos axes. En fonction de ce que vous avez écrit, votre MC devrait être transposé.
Spacey
@Tarantula Pourquoi pensez-vous cela? Je pense qu'il a raison.
Shahensha
@ Shahensha Essayez-le pour une colonne, c'est faux.
Spacey
1
Le lien vers le fil de Coursera est rompu
shark8me
8
Je ne crois pas que cette réponse règle le problème des étiquettes multiples. cela s'applique aux problèmes multi-classes. Quelle est la notion de faux positif ou de faux négatif dans des problèmes multilabel?
user798719
13

Pour la classification multi-étiquettes, vous avez deux possibilités. Commencez par examiner les points suivants.

  • n
  • Yiith
  • xiith
  • h(xi)ith

Exemple basé

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

  • 1ni=1n|Yih(xi)||h(xi)|
  • 1ni=1n|Yih(xi)||Yi|

Il existe également d'autres mesures.

Basé sur les étiquettes

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

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

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

  • 1qj=1qB(TPj,FPj,TNj,FNj)

  • B(j=1qTPj,j=1qFPj,j=1qTNj,j=1qFNj)

TPj,FPj,TNj,FNjjth

B

Vous pourriez être intéressé d'avoir un coup d' oeil dans le code pour les mesures mult-étiquette ici , dont une partie du paquet mldr dans R . Vous pouvez également être intéressé par la bibliothèque multi-étiquettes Java MULAN .

C’est un article intéressant pour entrer dans les différentes mesures: Examen des algorithmes d’apprentissage multi-étiquettes

phoxis
la source
Cela aurait été bien si vous auriez pu donner des références concernant l'authenticité des métriques que vous avez écrites comme une référence wikipedia. Les références que vous avez mentionnées sont la partie codage des métriques ou du document de recherche ..
hacker315
2
Un article de synthèse est déjà lié à la fin de la réponse (Examen des algorithmes d’apprentissage multi-étiquettes) ieeexplore.ieee.org/document/6471714 . Ce sont des métriques bien connues dans la littérature sur la base desquelles les implémentations sont effectuées. Je ne sais pas comment je peux démontrer l'authenticité.
Phoxis
8

Je ne connais pas la partie multi-étiquettes, mais pour la classification multi-classe, ces liens vous aideront

Ce lien explique comment créer la matrice de confusion que vous pouvez utiliser pour calculer la précision et le rappel de chaque catégorie.

Et ce lien explique comment calculer des mesures micro-f1 et macro-f1 pour évaluer le classifieur dans son ensemble.

J'espère que vous avez trouvé cela utile.

Ahmed Kotb
la source
4
Le point clé est le suivant: il existe plusieurs manières valides possibles de calculer ces mesures (par exemple, micro-F1 vs macro-F1) car il existe plusieurs façons de définir ce qui est correct. Cela dépend de votre application et de vos critères de validité.
Jack Tanner
Ahmed: Merci pour les liens! @JackTanner Auriez-vous peut-être une référence pour cela (dans le cas d'une classification multi-étiquettes multi-classes)?
Vam le
1
@MaVe, désolé, pas de liens. C'est juste de l'expérience personnelle. Vous y arriverez simplement en pensant à ce qui constitue, par exemple, un vrai positif et un faux positif pour vos objectifs.
Jack Tanner
4
Premier lien mort
Nikana Reklawyks
1

ce lien m'a aidé .. https://www.youtube.com/watch?v=HBi-P5j0Kec J'espère que cela vous aidera aussi

dites la distribution comme ci-dessous

    A   B   C   D
A   100 80  10  10
B   0    9   0   1
C   0    1   8   1
D   0    1   0   9

la précision pour A serait

P (A) = 100/100 + 0 + 0 +0 = 100

P (B) = 9/9 + 80 + 1 + 1 = 9/91 psst ... essentiellement, prenez le vrai positif de la classe et divisez-le par les données de colonne sur les lignes

rappel pour un serait

R (A) = 100 / 100+ 80 + 10 + 10 = 0,5

R (B) = 9 / 9+ 0 + 0 + 1 = 0,9

psst ... prend essentiellement le vrai positif de la classe et se divise par les données de ligne dans les colonnes

une fois que vous obtenez toutes les valeurs, prenez la moyenne macro

avg (P) = P (A) + P (B) + P (C) + P (D) / 4

avg (R) = R (A) + R (B) + R (C) + R (D) / 4

F1 = 2 * moyen (P) * moyen (R) / moyen (P) + moyen (R)

utilisateur1906450
la source
0

Découvrez ces diapositives de cs205.org à Harvard . Une fois que vous arrivez à la section sur les mesures d'erreur, vous discuterez de la précision et du rappel dans les paramètres multi-classes (par exemple, un-contre-tout ou un-contre-un) et les matrices de confusion. Les matrices de confusion sont ce que vous voulez vraiment ici.

Pour votre information, dans le progiciel Python scikits.learn , il existe des méthodes intégrées permettant de calculer automatiquement des éléments tels que la matrice de confusion à partir de classificateurs formés à partir de données multi-classes. Il peut probablement aussi calculer directement des tracés de rappel de précision pour vous aussi. Ça vaut le coup d'oeil.

ely
la source
4
Malheureusement, le lien vers les diapositives est mort et j'ai pu trouver les diapositives ailleurs.
F3lix
Il se reconstituera quand ils auront cette conférence du cours de cette année. Si je pouvais copier le fichier PDF vers un emplacement de lien permanent, je le ferais, mais je ne le peux pas. Il est donc inévitable de le rompre périodiquement et il n'y aura pas d'autre endroit pour trouver les notes, elles sont spécifiques à ce cours.
ely
sklearn ne prend pas en charge les étiquettes multiples pour la matrice de confusion github.com/scikit-learn/scikit-learn/issues/3452
Franck Dernoncourt
0

D'après Ozgur et al (2005), il est possible de calculer les valeurs de précision et de rappel en suivant les expressions normales, mais au lieu de calculer la moyenne sur le nombre total d'instances N dans votre jeu de données, vous devez utiliser les instances N = [avec au moins une étiquette classe en question assignée à].

voici la référence mentionnée: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.8244&rep=rep1&type=pdf

MachLearn
la source
0

Exactement de la même manière que vous le feriez dans le cas général, avec les ensembles:

http://en.wikipedia.org/wiki/F1_score

http://en.wikipedia.org/wiki/Precision_and_recall

Voici de simples fonctions Python qui font exactement cela:

def precision(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    len1 = len(y_pred)
    if len1 == 0:
        return 0
    else:
        return len(i) / len1


def recall(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    return len(i) / len(y_true)


def f1(y_true, y_pred):
    p = precision(y_true, y_pred)
    r = recall(y_true, y_pred)
    if p + r == 0:
        return 0
    else:
        return 2 * (p * r) / (p + r)


if __name__ == '__main__':
    print(f1(['A', 'B', 'C'], ['A', 'B']))
Adel Nizamutdinov
la source