ROC-Kurve für diskrete Klassifikatoren wie SVM: Warum nennen wir es immer noch eine "Kurve"? Ist es nicht nur ein "Punkt"?


24

In der Diskussion: Wie man eine ROC-Kurve für die binäre Klassifikation erzeugt , war meiner Meinung nach die Verwirrung, dass ein "binärer Klassifikator" (ein Klassifikator, der zwei Klassen trennt) für Yang ein so genannter "diskreter Klassifikator" war (der erzeugt) diskrete Ausgänge (0/1 wie ein SVM) und keine kontinuierlichen Ausgänge wie ANN- oder Bayes-Klassifizierer ... usw. Die Diskussion drehte sich also darum, wie der ROC für "binäre kontinuierliche Klassifizierer" aufgezeichnet wird, und die Antwort lautet, dass die Ausgänge sortiert sind nach ihren Bewertungen, da die Ausgaben kontinuierlich sind und ein Schwellenwert verwendet wird, um jeden Punkt auf der ROC-Kurve zu erzeugen.

Meine Frage ist für "binäre diskrete Klassifizierer" wie SVM, die Ausgabewerte sind 0 oder 1. Der ROC erzeugt also nur einen Punkt und keine Kurve. Ich bin verwirrt, warum wir es immer noch eine Kurve nennen? !! Können wir noch über Schwellen sprechen? Wie kann man Schwellenwerte insbesondere in SVM verwenden? Wie kann man die AUC berechnen ?, spielt hier die Kreuzvalidierung eine Rolle?


9
Ein SVM gibt einen realen Entscheidungswert aus, nämlich den vorzeichenbehafteten Abstand zur Trennhyperebene im Merkmalsraum. Bei der Klassifizierung wird das Etikett anhand des Vorzeichens dieses Entscheidungswerts zugewiesen. Als solche SVM tun mehr Leistung als ein Binärwert, ist ihre Ausgabe als ein Nachbearbeitungsschritt in Klassifizierung binarisiert nur.
Marc Claesen

Antworten:


14
  • Ja, es gibt Situationen, in denen die normale Betriebskurve des Empfängers nicht erhalten werden kann und nur ein Punkt vorhanden ist.

  • SVMs können so eingerichtet werden, dass sie Klassenmitgliedschaftswahrscheinlichkeiten ausgeben. Dies wäre der übliche Wert , für den ein Schwellenwert Betreiben eines Empfängers zu erzeugen , variiert werden würde Kurve .
    Ist es das wonach du suchst?

  • Schritte im ROC erfolgen normalerweise mit einer geringen Anzahl von Testfällen, anstatt mit diskreten Variationen in der Kovariate zu tun zu haben (insbesondere erhalten Sie dieselben Punkte, wenn Sie Ihre diskreten Schwellenwerte so wählen, dass sich für jeden neuen Punkt nur eine Stichprobe ändert seine Zuordnung).

  • Das kontinuierliche Variieren anderer (Hyper-) Parameter des Modells erzeugt natürlich Sätze von Spezifitäts- / Empfindlichkeitspaaren, die andere Kurven im FPR; TPR-Koordinatensystem ergeben.
    Die Interpretation einer Kurve hängt natürlich davon ab, durch welche Variation die Kurve erzeugt wurde.

Hier ist ein üblicher ROC (dh Anfordern von Wahrscheinlichkeiten als Ausgabe) für die "Versicolor" -Klasse des Iris-Datensatzes:

  • FPR; TPR (γ = 1, C = 1, Wahrscheinlichkeitsschwelle):
    ROC

Gleiches Koordinatensystem, jedoch TPR und FPR als Funktion der Abstimmparameter γ und C:

  • FPR; TPR (γ, C = 1, Wahrscheinlichkeitsschwelle = 0,5):
    Gamma

  • FPR; TPR (γ = 1, C, Wahrscheinlichkeitsschwelle = 0,5):
    Kosten

Diese Diagramme haben zwar eine Bedeutung, aber die Bedeutung unterscheidet sich deutlich von der des üblichen ROC!

Hier ist der R-Code, den ich verwendet habe:

svmperf <- function (cost = 1, gamma = 1) {
    model <- svm (Species ~ ., data = iris, probability=TRUE, 
                  cost = cost, gamma = gamma)
    pred <- predict (model, iris, probability=TRUE, decision.values=TRUE)
    prob.versicolor <- attr (pred, "probabilities")[, "versicolor"]

    roc.pred <- prediction (prob.versicolor, iris$Species == "versicolor")
    perf <- performance (roc.pred, "tpr", "fpr")

    data.frame (fpr = perf@x.values [[1]], tpr = perf@y.values [[1]], 
                threshold = perf@alpha.values [[1]], 
                cost = cost, gamma = gamma)
}

df <- data.frame ()
for (cost in -10:10)
  df <- rbind (df, svmperf (cost = 2^cost))
head (df)
plot (df$fpr, df$tpr)

cost.df <- split (df, df$cost)

cost.df <- sapply (cost.df, function (x) {
    i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y 
    x [i,]
})

cost.df <- as.data.frame (t (cost.df))
plot (cost.df$fpr, cost.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (cost.df$fpr, cost.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (cost.df),start=0, end=4/6)))

df <- data.frame ()
for (gamma in -10:10)
  df <- rbind (df, svmperf (gamma = 2^gamma))
head (df)
plot (df$fpr, df$tpr)

gamma.df <- split (df, df$gamma)

gamma.df <- sapply (gamma.df, function (x) {
     i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y
     x [i,]
})

gamma.df <- as.data.frame (t (gamma.df))
plot (gamma.df$fpr, gamma.df$tpr, type = "l", xlim = 0:1, ylim = 0:1, lty = 2)
points (gamma.df$fpr, gamma.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (gamma.df),start=0, end=4/6)))

roc.df <- subset (df, cost == 1 & gamma == 1)
plot (roc.df$fpr, roc.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (roc.df$fpr, roc.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (roc.df),start=0, end=4/6)))

Das ist sehr klar, danke. Ich hatte die Idee, dass das Variieren von b dem Bewegen der Hyperebene gleicht und somit unterschiedliche (TPR, FPR) hat! aber mit dem SVM-Klassifikator wird der Bias b gelernt, es scheint also der beste Parameter zu sein? nein ?, wenn dies der Fall ist, muss keine ROC-Analyse durchgeführt werden ?, nein?
Abdelhak Mahmoudi

@AbdelhakMahmoudi: Ich denke, die vom Modell gelernten Parameter sind nicht das, was Sie variieren möchten. Aber da Sie eine Wahrscheinlichkeitsausgabe haben können (ich habe mich nicht in den Code eingearbeitet, also weiß ich nicht, ob die Wahrscheinlichkeits-SVM den "harten" wirklich gleichwertig sind), warum nicht? Dies ist ein sehr häufiges Ergebnis, aus dem der ROC generiert wird. Die svm-Funktion von R ist eine Schnittstelle zu dem weit verbreiteten libsvm, sodass Sie nicht darauf beschränkt sind, R zu diesem Zweck zu verwenden.
cbeleites unterstützt Monica

8

Normalerweise wird das vorhergesagte Label von SVM durch , wobei das SVM-optimierte ist Gewichte der Hyperebene, und das ist der SVM-optimierte Achsenabschnitt. Dies kann auch wie folgt umgeschrieben werden: y =sign(wTx+b)wb yy^y^=sign(wTx+b)wb

y^={0if  wTx+b<01otherwise

Wenn wir jedoch einen Schwellenwert einzuführen , wir die positive Erkennungsrate durch Variation steuern , dh & eegr; yηη

y^={0if  wTx+b<η1otherwise

Durch Variation von ; können wir einen ROC unter Verwendung von SVM erzeugen und dadurch die Empfindlichkeit und Spezifitätsrate anpassen.η

Wenn wir es zum Beispiel in Python machen wollen, können wir und mit threshold wie folgt extrahieren . bηwbη

>>> from sklearn.svm import SVC
>>> model = SVC(kernel='linear', C=0.001, probability=False, class_weight='balanced')
>>> model.fit(X, y)
>>> # The coefficients w are given by
>>> w = list(model.coef_)
>>> # The intercept b is given by
>>> b = model.intercept_[0]
>>> y_hat = X.apply(lambda s: np.sum(np.array(s)*np.array(w))+b, axis=1)
>>> y_hat = (y_hat > eta).astype(float)

3

In der ROC-Kurve ist die Spezifität gegen die Empfindlichkeit aufgetragen, die mit dem Schwellenwert einer Kovariate (die kontinuierlich oder diskret sein kann) variiert. Ich denke, Sie verwechseln die Kovariate mit der Antwort und verstehen möglicherweise nicht ganz, was eine ROC-Kurve ist. Es ist sicherlich eine Kurve, wenn die Kovariate stetig ist, und wir betrachten eine Schwelle für die Kovariate, die sich stetig ändert. Wenn die Kovariate diskret ist, können Sie immer noch als Funktion einer kontinuierlichen Schwelle zeichnen. Dann wäre die Kurve flach mit Schritten nach oben (oder unten) bei Schwellenwerten, die den diskreten Werten der Kovariate entsprechen. Dies würde also für SVM und andere diskrete Klassifikatoren gelten.

In Bezug auf die AUC können wir, da wir immer noch eine ROC haben (eine geschätzte), immer noch die Fläche berechnen, die darunter liegt. Ich bin mir nicht sicher, was Sie mit Ihrer Frage zur gegenseitigen Validierung im Sinn hatten. Im Zusammenhang mit Klassifizierungsproblemen wird die Kreuzvalidierung verwendet, um unvoreingenommene oder nahezu neutrale Schätzungen der Fehlerraten für den Klassifizierer zu erhalten. Damit kann festgelegt werden, wie wir die Punkte auf dem ROC schätzen.


1
Ok, was könnten die Schwellenwerte für den SVM-Klassifikator sein?
Abdelhak Mahmoudi

Ich weiß es nicht. Was sind die Kovariaten? Wenn Sie eine Kovariate haben, kann jeder Wert ein Schwellenwert sein. Wenn Sie mehr als eine Kovariate haben, hängt die Leistung des Klassifizierers von der Auswahl mehrerer Werte statt eines einzelnen Schwellenwerts ab, variiert jedoch im Raum der Kovariaten.
Michael R. Chernick

Beispielsweise basieren lineare SVMs auf der Trennungs-Hyperebene, die vom gewählten C-Wert abhängt (niedriger C-Wert toleriert mehr Trainingsfehler). Könnte ein Satz von C-Werten der Satz von Schwellenwerten sein?
Abdelhak Mahmoudi

Ja und sind die C-Werte nicht nur Linearkombinationen der Kovariaten?
Michael R. Chernick

2
C ist der Straffaktor, der eingeführt wird, um den Kompromiss zwischen der Komplexität der Hyperebene und Trainingsfehlern zu steuern. Eine andere Alternative könnte die Verwendung der Vorspannung b als Schwelle sein, da b der Abstand von der Mitte des Merkmalsraums zur trennenden Hyperebene ist. Das Variieren von b bedeutet also, die Hyperebene zu bewegen und somit unterschiedliche TP und FP zu haben! Das ist mein Verständnis!
Abdelhak Mahmoudi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.