Comment déterminer la qualité d'un classificateur multiclasse

30

Donné

  • un ensemble de données avec des instances avec classes où chaque instance appartient exactement à une classe N x i y iXjeNXjeyje
  • un classificateur multiclasse

Après la formation et les tests, j'ai essentiellement une table avec la vraie classe et la classe prédite pour chaque instance dans l'ensemble de test. Donc, pour chaque instance, j'ai soit une correspondance ( ), soit un ( ).a i x i y i = a i y i ia iyjeunejeXjeyje=unejeyjeuneje

Comment puis-je évaluer la qualité du match? Le problème est que certaines classes peuvent avoir de nombreux membres, c'est-à-dire que de nombreuses instances lui appartiennent. Évidemment, si 50% de tous les points de données appartiennent à une classe et que mon classificateur final est globalement correct à 50%, je n'ai rien gagné. J'aurais tout aussi bien pu faire un classifieur trivial qui produit la plus grande classe, quelle que soit l'entrée.

Existe-t-il une méthode standard pour estimer la qualité d'un classifieur sur la base des résultats connus des ensembles de tests des correspondances et des hits pour chaque classe? Peut-être est-il même important de distinguer les taux de correspondance pour chaque classe particulière?

L'approche la plus simple à laquelle je peux penser est d'exclure les correspondances correctes de la plus grande classe. Quoi d'autre?

Gerenuk
la source
Je ne sais pas si je comprends bien la question. Connaissez-vous la matrice de confusion et les mesures dérivées ? Est-ce la réponse à votre question? Ou vous référez-vous à quelque chose de plus compliqué?
steffen
Je pense que c'est la source de ma confusion: dans le premier paragraphe vous dites .. où yi sont les vraies classes et ... : Voulez-vous dire qu'une instance Xje peut appartenir à / a plus d'une classe? Ou chaque Xje appartient-il / a-t-il exactement une classe? Pouvez-vous clarifier s'il vous plait ?
steffen
@steffen: J'ai vu la matrice de confusion. Dans mon cas particulier, j'ai 4 classes. Je ne sais donc pas quelles mesures dérivées peuvent être utilisées et auraient un sens. Chaque appartient à une seule classe. Cependant, il existe plus de deux classes possibles dans l'ensemble i [ 1 , , N ] . Xjeje[1,,N]
Gerenuk
@steffen Ces mesures dérivées sont principalement applicables à la classification binaire , alors que cette question concerne explicitement plus de deux classes. Cela nécessite alors une compréhension modifiée de termes comme «vrai positif».
Michael McGowan
@MichaelMcGowan J'ai demandé des éclaircissements au PO et j'ai ensuite effectué une modification pour refléter explicitement le problème des multiclasses, ce qui n'était pas évident avant la modification (à mon humble avis).
steffen

Réponses:

16

Comme la classification binaire, vous pouvez utiliser le taux d' erreur empirique pour estimer la qualité de votre classificateur. Soit un classificateur, et x i et y i respectivement un exemple dans votre base de données et sa classe. e r r ( g ) = 1gXjeyje Comme vous l'avez dit, lorsque les classes sont déséquilibrées, la ligne de base n'est pas 50% mais la proportion de la classe la plus grande. Vous pouvez ajouter un poids à chaque classe pour équilibrer l'erreur. SoitWyle poids de la classey. Réglez les poids de telle sorte que1

err(g)=1njen1g(Xje)yje
Wyyet définir l'erreur empirique pondéréeerrW(g)=11Wy1njen1yje=y
errW(g)=1njenWyje1g(Xje)yje

Comme l'a dit Steffen, la matrice de confusion pourrait être un bon moyen d'estimer la qualité d'un classificateur. Dans le cas binaire, vous pouvez dériver une mesure de cette matrice telle que la sensibilité et la spécificité, en estimant la capacité d'un classificateur à détecter une classe particulière. La source d'erreur d'un classificateur peut être d'une manière particulière. Par exemple, un classificateur peut être trop confiant lors de la prédiction d'un 1, mais ne jamais se tromper lors de la prédiction d'un 0. De nombreux classificateurs peuvent être paramétrés pour contrôler ce taux (faux positifs vs faux négatifs), et vous êtes alors intéressé par la qualité du toute la famille du classificateur, pas seulement un. À partir de cela, vous pouvez tracer la courbe ROC et mesurer la zone sous la courbe ROC vous donne la qualité de ces classificateurs.

Les courbes ROC peuvent être étendues pour votre problème multiclasse. Je vous suggère de lire la réponse de ce fil .

Emile
la source
1
N'est-il pas nécessaire de diviser l'erreur empirique pondérée par le nombre de classes, pour être à la même échelle que l'erreur empirique? Sinon, ce serait beaucoup plus gros ...
PhilippPro
17

Pour évaluer les systèmes de classification de texte multi-voies, j'utilise F1 à micro-et macro-moyenne (mesure F). La mesure F est essentiellement une combinaison pondérée de précision et rappelons-le. Pour la classification binaire, les approches micro et macro sont les mêmes, mais, pour le cas multi-voies, je pense qu'elles pourraient vous aider. Vous pouvez considérer Micro F1 comme une combinaison pondérée de précision et de rappel qui donne un poids égal à chaque document, tandis que Macro F1 donne un poids égal à chaque classe. Pour chacun, l'équation de la mesure F est la même, mais vous calculez la précision et vous rappelez différemment:

F=(β2+1)PRβ2P+R,

β

Pmjecro=je=1|C|TPjeje=1|C|TPje+FPje,Rmjecro=je=1|C|TPjeje=1|C|TPje+FNje

Pmunecro=1|C|je=1|C|TPjeTPje+FPje,Rmunecro=1|C|je=1|C|TPjeTPje+FNje

TPFPFNC

Kyle.
la source
1
# Function in R, using precision, recall and F statistics

check.model.accuracy <- function(predicted.class, actual.class){

  result.tbl <- as.data.frame(table(predicted.class,actual.class ) ) 

  result.tbl$Var1 <- as.character(result.tbl$predicted.class)
  result.tbl$Var2 <- as.character(result.tbl$actual.class)

  colnames(result.tbl)[1:2] <- c("Pred","Act")

  cntr <- 0  
  for (pred.class in unique(result.tbl$Pred) ){
    cntr <- cntr+ 1
    tp <- sum(result.tbl[result.tbl$Pred==pred.class & result.tbl$Act==pred.class, "Freq"])
    tp.fp <- sum(result.tbl[result.tbl$Pred == pred.class , "Freq" ])
    tp.fn <- sum(result.tbl[result.tbl$Act == pred.class , "Freq" ])
    presi <- tp/tp.fp 
    rec <- tp/tp.fn
    F.score <- 2*presi*rec/(presi+rec)
    if (cntr == 1 ) F.score.row <- cbind(pred.class, presi,rec,F.score)
    if (cntr > 1 ) F.score.row <- rbind(F.score.row,cbind(pred.class,presi,rec,F.score))
  }

  F.score.row <- as.data.frame(F.score.row) 
  return(F.score.row)
}

check.model.accuracy(predicted.df,actual.df) 
# For multiclass, average across all classes 
Ashish Markanday
la source
5
Pouvez-vous ajouter du texte pour expliquer cela?
gung - Rétablir Monica