Jak narysować krzywą ROC dla drzew decyzyjnych?

13

Zwykle nie możemy narysować krzywej ROC dla dyskretnych klasyfikatorów, takich jak drzewa decyzyjne. Czy mam rację? Czy jest jakiś sposób na narysowanie krzywej ROC dla Dtrees?

DataMiner
źródło
1
Możesz znaleźć swoją odpowiedź tutaj: stats.stackexchange.com/questions/105501/…
rapaio
[Ocena modelu drzewa decyzyjnego dla „zestawu treningowego” a „zestawu testowego” w R] [1] [1]: stats.stackexchange.com/questions/49416/... Tutaj możesz znaleźć odpowiedź.
Sangram
@rapaio Przepraszamy, twój link pokazuje krzywą ROC, aby znaleźć próg w klasyfikatorze, który daje wynik od 1 do 0 (wartość ciągła).
DataMiner
@Sangram Są to rozwiązania w języku R, ale chcę po prostu zrozumieć, jak to działa.
DataMiner

Odpowiedzi:

15

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

Dowiedz się więcej o tym, jak to jest obliczane na stronie Wikipedii .

(0,0)(1,1)

T.faT.fa(wynikT.,wynikfa)=(liczyćT.liczyćT.+liczyćfa,liczyćfaliczyćT.+liczyćfa)=(10/15,5/15)=(0,66,0,33)

rapaio
źródło
13

W przypadku drzewa decyzyjnego klasy są nadal przewidywane z pewnym poziomem pewności. Odpowiedź jest już udzielona przez @rapaio, ale rozwinę ją nieco.

Wyobraźmy sobie następującą drzewo decyzyjne (to nieco zmodyfikowana wersja tego jednego )

przykład drzewa decyzyjnego

W każdym węźle znajdują się nie tylko etykiety większości, ale także inne, co skończyło się na tym liściu, więc możemy przypisać stopień pewności do tego liścia, na którym przewidujemy etykietę.

Weźmy na przykład następujące dane

dane

Uruchamiamy go i przypisujemy wyniki do wyniku, a nie do rzeczywistych etykiet. Dzięki temu możemy narysować krzywą ROC, jak zasugerowano tutaj

krzywa Roca

Jednak nie ma sensu, aby go użyć do dostrojenia progu (ponieważ oczywiście nie ma czegoś takiego jak próg w drzewach decyzyjnych), ale nadal można go użyć do obliczenia AUC, który w tym przypadku wynosi 0,92

Zastosowano tutaj kod R:

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')
Aleksiej Grigoriew
źródło