Berechnung der Genauigkeit und des Rückrufs in R.

8

Angenommen, ich erstelle einen logistischen Regressionsklassifikator, der vorhersagt, ob jemand verheiratet oder ledig ist. (1 = verheiratet, 0 = ledig) Ich möchte einen Punkt auf der Präzisionsrückrufkurve auswählen, der mir eine Genauigkeit von mindestens 75% gibt. möchte ich die Schwellenwerte und auswählen , damit:t1t2

  • Wenn die Ausgabe meines Klassifikators größer als , ich "verheiratet" aus.t1
  • Wenn der Ausgang unter , ich "single" aus.t2
  • Wenn die Ausgabe dazwischen liegt, gebe ich "Ich weiß nicht" aus.

Ein paar Fragen:

  1. Ich denke, unter der Standarddefinition von Präzision wird Präzision nur die Präzision der verheirateten Klasse messen (dh Präzision = # Mal, wenn ich die Ehe richtig vorhersage / Gesamt # Mal, wenn ich die Ehe vorhersage). Was ich jedoch wirklich tun möchte, ist die Gesamtgenauigkeit zu messen (dh die Gesamtanzahl der Zeiten, in denen ich verheiratet oder ledig voraussage, / die Gesamtanzahl, in der ich verheiratet oder ledig vorhersage). Ist das in Ordnung? Wenn nicht, was soll ich tun?
  2. Gibt es eine Möglichkeit, diese "Gesamt" -Präzisions- / Rückrufkurve in R zu berechnen (z. B. mithilfe des ROCR-Pakets oder einer anderen Bibliothek)? Ich verwende derzeit das ROCR-Paket, aber es scheint mir nur die Präzision / den Rückruf einer einzelnen Klasse zu geben.
raegtin
quelle

Antworten:

7

Zu diesem Zweck habe ich eine Funktion geschrieben, die auf der Übung im Buch Data Mining mit R basiert:

# Function: evaluation metrics
    ## True positives (TP) - Correctly idd as success
    ## True negatives (TN) - Correctly idd as failure
    ## False positives (FP) - success incorrectly idd as failure
    ## False negatives (FN) - failure incorrectly idd as success
    ## Precision - P = TP/(TP+FP) how many idd actually success/failure
    ## Recall - R = TP/(TP+FN) how many of the successes correctly idd
    ## F-score - F = (2 * P * R)/(P + R) harm mean of precision and recall
prf <- function(predAct){
    ## predAct is two col dataframe of pred,act
    preds = predAct[,1]
    trues = predAct[,2]
    xTab <- table(preds, trues)
    clss <- as.character(sort(unique(preds)))
    r <- matrix(NA, ncol = 7, nrow = 1, 
        dimnames = list(c(),c('Acc',
        paste("P",clss[1],sep='_'), 
        paste("R",clss[1],sep='_'), 
        paste("F",clss[1],sep='_'), 
        paste("P",clss[2],sep='_'), 
        paste("R",clss[2],sep='_'), 
        paste("F",clss[2],sep='_'))))
    r[1,1] <- sum(xTab[1,1],xTab[2,2])/sum(xTab) # Accuracy
    r[1,2] <- xTab[1,1]/sum(xTab[,1]) # Miss Precision
    r[1,3] <- xTab[1,1]/sum(xTab[1,]) # Miss Recall
    r[1,4] <- (2*r[1,2]*r[1,3])/sum(r[1,2],r[1,3]) # Miss F
    r[1,5] <- xTab[2,2]/sum(xTab[,2]) # Hit Precision
    r[1,6] <- xTab[2,2]/sum(xTab[2,]) # Hit Recall
    r[1,7] <- (2*r[1,5]*r[1,6])/sum(r[1,5],r[1,6]) # Hit F
    r}

Wenn für eine binäre Klassifizierungsaufgabe die Genauigkeit, der Rückruf und der F-Status für jede Klassifizierung und die Gesamtgenauigkeit wie folgt zurückgegeben werden:

> pred <- rbinom(100,1,.7)
> act <- rbinom(100,1,.7)
> predAct <- data.frame(pred,act)
> prf(predAct)
      Acc     P_0       R_0       F_0       P_1       R_1       F_1
[1,] 0.63 0.34375 0.4074074 0.3728814 0.7647059 0.7123288 0.7375887

Wenn Sie P, R und F für jede Klasse wie diese berechnen, können Sie sehen, ob die eine oder andere Ihnen mehr Schwierigkeiten bereitet, und es ist einfach, die gesamten P-, R-, F-Statistiken zu berechnen. Ich habe das ROCR-Paket nicht verwendet, aber Sie können leicht dieselben ROC-Kurven ableiten, indem Sie den Klassifizierer über den Bereich einiger Parameter trainieren und die Funktion für Klassifizierer an Punkten entlang des Bereichs aufrufen.

Robert E Mealey
quelle
Ich denke, Sie haben Präzision und Rückrufcode ausgetauscht. Es sollte r [1,5] <- xTab [2,2] / sum (xTab [2,])
danioyuan
6

Wie Robert es richtig ausdrückte, ist Genauigkeit der richtige Weg. Ich möchte nur hinzufügen, dass es möglich ist, es mit ROCR zu berechnen. Schauen Sie sich die Hilfe (Leistung) an, um verschiedene Maßnahmen auszuwählen.

Beispielsweise wird in ROCR nur eine Entscheidungsschwelle verwendet, die als Cutoff bezeichnet wird . Der folgende Code zeigt die Genauigkeit gegenüber dem Grenzwert und extrahiert den Grenzwert für maximale Genauigkeit.

require(ROCR)

# Prepare data for plotting
data(ROCR.simple)
pred <- with(ROCR.simple, prediction(predictions, labels))
perf <- performance(pred, measure="acc", x.measure="cutoff")

# Get the cutoff for the best accuracy
bestAccInd <- which.max(perf@"y.values"[[1]])
bestMsg <- paste("best accuracy=", perf@"y.values"[[1]][bestAccInd], 
              " at cutoff=", round(perf@"x.values"[[1]][bestAccInd], 4))

plot(perf, sub=bestMsg)

was in ... resultiert

Geben Sie hier die Bildbeschreibung ein

Um mit zwei Schwellenwerten zu arbeiten, um einen mittleren Unsicherheitsbereich zu erstellen (was ein gültiger Weg ist, wenn die Umstände / Zielanwendung dies zulassen), können mit ROCR zwei Leistungsobjekte erstellt werden

  1. Cutoff vs True Positive Rate (tpr), auch bekannt als Präzision für die positive Klasse
  2. Cutoff vs True Negative Rate (tnr), auch bekannt als Präzision für die negative Klasse

Wählen Sie einen geeigneten Cutoff aus den Leistungsvektoren (mit der R-Methode) und kombinieren Sie diese, um das gewünschte Gleichgewicht zu erreichen. Dies sollte unkompliziert sein, daher überlasse ich es dem Leser als Übung.

Ein letzter Hinweis: Was ist der Unterschied zwischen Genauigkeit und Berechnungsgenauigkeit für beide Klassen getrennt und z. B. kombinieren Sie sie in einem (gewichteten) Durchschnitt?

Die Genauigkeit berechnet einen gewichteten Durchschnitt, wobei das Gewicht für Klasse c der Anzahl der Instanzen mit Klasse c entspricht. Dies bedeutet, dass Sie bei einem starken Klassenversatz (z. B. 98% Negative) die Genauigkeit einfach "optimieren" können, indem Sie das negative Label für alle Instanzen vorhersagen. In einem solchen Fall verhindert ein nicht gewichteter einfacher Durchschnitt beider Klassenpräzisionen das Spielen der Metrik. Bei ausgeglichenen Klassen führen beide Berechnungsmethoden natürlich zum gleichen Ergebnis.

steffen
quelle