So bestimmen Sie die Qualität eines Klassifikators für mehrere Klassen

30

Gegeben

  • ein Datensatz mit Instanzen zusammen mit N Klassen, wobei jede Instanz x i genau zu einer Klasse y i gehörtxiNxiyi
  • ein Klassifikator für mehrere Klassen

Nach dem Training und Testen habe ich grundsätzlich eine Tabelle mit der wahren Klasse und der vorhergesagten Klasse a i für jede Instanz x i im Testsatz. Also habe ich für jede Instanz entweder eine Übereinstimmung ( y i = a i ) oder eine Verfehlung ( y ia i ).yiaixiyi=aiyiai

Wie kann ich die Qualität des Spiels bewerten? Das Problem ist, dass einige Klassen viele Mitglieder haben können, dh viele Instanzen gehören dazu. Wenn 50% aller Datenpunkte zu einer Klasse gehören und mein Endklassifikator zu 50% korrekt ist, habe ich offensichtlich nichts gewonnen. Ich hätte genauso gut einen trivialen Klassifikator erstellen können, der die größte Klasse ausgibt, unabhängig von der Eingabe.

Gibt es eine Standardmethode, um die Qualität eines Klassifikators basierend auf den bekannten Testergebnissen von Übereinstimmungen und Treffern für jede Klasse zu schätzen? Vielleicht ist es sogar wichtig, Übereinstimmungsraten für jede bestimmte Klasse zu unterscheiden?

Der einfachste Ansatz, den ich mir vorstellen kann, ist es, die richtigen Matches der größten Klasse auszuschließen. Was sonst?

Gerenuk
quelle
Ich bin mir nicht sicher, ob ich die Frage richtig verstehe. Kennen Sie die Verwirrungsmatrix und abgeleitete Maßnahmen ? Ist das die Antwort auf Ihre Frage? Oder beziehen Sie sich auf etwas Komplizierteres?
Steffen
Ich denke, das ist die Quelle meiner Verwirrung: Im ersten Absatz geben Sie an, wo yi die wirklichen Klassen sind und ... : Meinen Sie, dass eine Instanz gehören kann, mehr als eine Klasse hat? Oder gehört / hat jedes x i genau einer Klasse? Können Sie bitte klarstellen ? xixi
steffen
@steffen: Ich habe die Verwirrungsmatrix gesehen. In meinem speziellen Fall habe ich 4 Klassen. Ich bin mir also nicht sicher, welche abgeleiteten Maßnahmen verwendet werden können und Sinn machen würden. Jedes gehört nur einer Klasse an. Insgesamt gibt es jedoch mehr als zwei mögliche Klassen i [ 1 , , N ] . xii[1,,N]
Gerenuk
@steffen Diese abgeleiteten Kennzahlen gelten in erster Linie für die binäre Klassifizierung, wobei es sich bei dieser Frage explizit um mehr als zwei Klassen handelt. Dies erfordert dann ein modifiziertes Verständnis von Begriffen wie "wahres Positiv".
Michael McGowan
@MichaelMcGowan Ich habe das OP um Klärung gebeten und anschließend eine Bearbeitung durchgeführt, um das Problem der Mehrfachklassen zu reflektieren, das vor der Bearbeitung nicht offensichtlich war (IMHO).
Steffen

Antworten:

16

Wie bei der binären Klassifizierung können Sie die empirische Fehlerrate zur Abschätzung der Qualität Ihres Klassifikators verwenden. Sei ein Klassifikator und x i und y i jeweils ein Beispiel in Ihrer Datenbank und ihrer Klasse. e r r ( g ) = 1Gxichyich Wie Sie gesagt, wenn die Klassen unausgeglichen sind, die Basislinie nicht50%, aber der Anteil der größeren Klasse. Sie können jeder Klasse eine Gewichtung hinzufügen, um den Fehler auszugleichen. SeiWydas Gewicht der Klassey. Stellen Sie die Gewichte so ein, dass1

err(G)=1nichn1G(xich)yich
Wyyund definieren diegewichteten empirischen FehlererrW(g)=11Wy1nichn1yich=y
errW(G)=1nichnWyich1G(xich)yich

Wie Steffen sagte, könnte die Verwirrungsmatrix eine gute Möglichkeit sein, die Qualität eines Klassifikators einzuschätzen. Im binären Fall können Sie aus dieser Matrix ein Maß ableiten, z. B. die Sensitivität und Spezifität, und so die Fähigkeit eines Klassifikators abschätzen, eine bestimmte Klasse zu erkennen. Die Fehlerquelle eines Klassifikators kann auf eine bestimmte Art und Weise sein. Zum Beispiel kann ein Klassifikator bei der Vorhersage einer 1 zu sicher sein, aber bei der Vorhersage einer 0 niemals falsch sagen. Viele Klassifikatoren können so parametrisiert werden, dass sie diese Rate steuern (falsch-positive vs. falsch-negative), und Sie interessieren sich dann für die Qualität der ganze Familie von Klassifikatoren, nicht nur eine. Daraus können Sie die ROC- Kurve zeichnen , und die Messung der Fläche unter der ROC-Kurve gibt Ihnen die Qualität dieser Klassifikatoren.

ROC-Kurven können für Ihr Mehrklassenproblem erweitert werden. Ich schlage vor, die Antwort dieses Threads zu lesen .

Emile
quelle
1
Ist es nicht notwendig, den gewichteten empirischen Fehler durch die Anzahl der Klassen zu dividieren, um auf der gleichen Skala wie der empirische Fehler zu liegen? Sonst wäre es viel größer ...
PhilippPro
17

Um mehrwegige Textklassifizierungssysteme zu bewerten, verwende ich mikro- und makromitteltes F1 (F-Measure). Das F-Maß ist im Wesentlichen eine gewichtete Kombination aus Präzision und Erinnerung daran. Für die binäre Klassifizierung sind die Mikro- und Makroansätze gleich, aber für den Mehrwegefall denke ich, dass sie Ihnen helfen könnten. Sie können sich Micro F1 als eine gewichtete Kombination aus Präzision und Erinnerung vorstellen, die jedem Dokument das gleiche Gewicht verleiht, während Macro F1 jeder Klasse das gleiche Gewicht verleiht. Die F-Measure-Gleichung ist für jede Gleichung gleich, aber Sie berechnen die Genauigkeit und rufen sie anders ab:

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

β

PmichcrO=ich=1|C|TPichich=1|C|TPich+FPich,RmichcrO=ich=1|C|TPichich=1|C|TPich+FNich

PmeincrO=1|C|ich=1|C|TPichTPich+FPich,RmeincrO=1|C|ich=1|C|TPichTPich+FNich

woher TP ist wahr positiv, FP ist falsch positiv, FN ist falsch negativ und C ist klasse.

Kyle.
quelle
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
quelle
5
Können Sie Text hinzufügen, um dies zu erläutern?
gung - Wiedereinsetzung von Monica