Wie können wir eine ROC-Kurve für Entscheidungsbäume zeichnen?

13

Normalerweise können wir keine ROC-Kurve für die diskreten Klassifikatoren wie Entscheidungsbäume zeichnen. Habe ich recht? Gibt es eine Möglichkeit, eine ROC-Kurve für Dtrees zu zeichnen?

Datengräber
quelle
1
Sie finden Ihren Aswer hier: stats.stackexchange.com/questions/105501/…
rapaio
[Bewertung des Entscheidungsbaummodells für "Trainingssatz" vs. " Testsatz " in R] [1] [1]: stats.stackexchange.com/questions/49416/… Hier finden Sie Ihre Antwort.
Sangram
@rapaio Entschuldigung, Ihr Link zeigt eine ROC-Kurve, um einen Schwellenwert in einem Klassifikator zu finden, der eine Ausgabe zwischen 1 und 0 (kontinuierlicher Wert) erzeugt.
DataMiner
@ Sangram Dies sind die Lösungen in R, aber ich möchte nur verstehen, wie es funktioniert.
DataMiner

Antworten:

15

(x,y)=(FPR,TPR)FPRTPR

Weitere Informationen zur Berechnung finden Sie auf der Wikipedia-Seite .

(0,0)(1,1)

TFTF(ErgebnisT,ErgebnisF)=(AnzahlTAnzahlT+AnzahlF,AnzahlFAnzahlT+AnzahlF)=(10/15,5/15)=(0,66,0,33)

rapaio
quelle
12

Für einen Entscheidungsbaum werden die Klassen immer noch mit einer gewissen Sicherheit vorhergesagt. Die Antwort wird bereits von @rapaio gegeben, aber ich werde es ein wenig erweitern.

Stellen Sie sich folgende Entscheidungsbaum (es ist ein bisschen modifizierte Version dieses ein )

Beispiel für einen Entscheidungsbaum

An jedem Knoten befinden sich nicht nur die Beschriftungen der Mehrheitsklasse, sondern auch andere, die auf diesem Blatt landeten, sodass wir dem Blatt, auf dem wir die Beschriftung vorhersagen, den Grad an Sicherheit zuweisen können.

Betrachten Sie beispielsweise die folgenden Daten

Daten

Wir führen es aus und weisen die Bewertungen der Ausgabe zu, nicht den tatsächlichen Bezeichnungen. Damit können wir eine ROC-Kurve zeichnen, wie hier vorgeschlagen

ROC-Kurve

Es ist jedoch wenig sinnvoll, damit Ihren Schwellenwert abzustimmen (da es in Decision Trees natürlich keinen Schwellenwert gibt), kann aber dennoch zur Berechnung der AUC verwendet werden, die in diesem Fall 0,92 beträgt

Hier verwendeter R-Code:

outlook = c('rain', 'overcast', 'rain', 'sunny', 'rain', 
            'rain', 'sunny', 'overcast', 'overcast', 'overcast', 
            'sunny', 'sunny', 'rain', 'rain', 'overcast',
            'sunny', 'overcast', 'overcast', 'sunny', 'sunny',
            'sunny', 'overcast')
humidity = c(79, 74, 80, 60, 65, 79, 60, 74, 77, 80, 
             71, 70, 80, 65, 70, 56, 80, 70, 56, 70,
             71, 77)
windy = c(T, T, F, T, F, T, T, T, T, F, T, F, F, F, T, T, F, T, T, F, T, T)
play = c(F, F, T, F, T, F, F, T, T, T, F, F, T, T, T, T, T, T, F, T, F, T)

game = data.frame(outlook, humidity, windy, play)
game$score = NA

attach(game)
game$score[outlook == 'sunny' & humidity <= 70] = 5/8
game$score[outlook == 'sunny' & humidity > 70] = 1 - 3/4
game$score[outlook == 'overcast'] = 4/5
game$score[outlook == 'rain' & windy == T] = 1 - 2/2
game$score[outlook == 'rain' & windy == F] = 3/3
detach(game)

game$predict = game$score >= 0.5
game$correct = game$predict == game$play

library(ROCR)

pred = prediction(game$score, game$play)
roc = performance(pred, measure="tpr", x.measure="fpr")
plot(roc, col="orange", lwd=2) 
lines(x=c(0, 1), y=c(0, 1), col="red", lwd=2)

auc = performance(pred, 'auc')
slot(auc, 'y.values')
Alexey Grigorev
quelle