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?
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?
Antworten:
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 )
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
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
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')