Normalmente non possiamo disegnare una curva ROC per i classificatori discreti come gli alberi delle decisioni. Ho ragione? Esiste un modo per disegnare una curva ROC per Dtrees?
Normalmente non possiamo disegnare una curva ROC per i classificatori discreti come gli alberi delle decisioni. Ho ragione? Esiste un modo per disegnare una curva ROC per Dtrees?
Risposte:
Se il tuo classificatore produce solo risultati fattoriali (solo etichette), senza punteggi, puoi comunque disegnare una curva ROC. Tuttavia, questa curva ROC è solo un punto. Considerando lo spazio ROC, questo punto è , dove - tasso di falsi positivi e - tasso di veri positivi.

Vedi di più su come viene calcolato sulla pagina di Wikipedia .
È possibile estendere questo punto in modo che assomigli ad una curva ROC tracciando una linea da al punto e da lì a . Quindi hai una curva.( 1 , 1 )
Tuttavia, per un albero decisionale è facile estendere da un output di etichetta a un output numerico. Si noti che quando si prevede con un albero decisionale si scende dal nodo radice a un nodo foglia, dove si prevede con classe di maggioranza. Se invece di quella classe restituissi la proporzione di classi in quel nodo foglia, avresti un punteggio per ogni classe. Supponi di avere due classi e e nel nodo foglia hai 10 istanze con e 5 istanze con , puoi restituire un vettore di punteggi :F T F ( punteggio T , punteggio F ) = ( conta T. Fai attenzione che questa è davvero una regola di punteggio appropriata (questo non è il miglior stimatore per le probabilità), ma è meglio di niente credo, ed è così che di solito vengono recuperati i punteggi per gli alberi delle decisioni.
Per un albero decisionale, le classi sono ancora previste con un certo livello di certezza. La risposta è già data da @rapaio, ma mi espanderò un po '.
Immaginate la seguente albero decisionale (è un po bit versione modificata di questo uno )

Ad ogni nodo non ci sono solo le etichette della classe di maggioranza, ma anche altre che sono finite a quella foglia, quindi possiamo assegnare il grado di certezza a quella foglia a cui prediamo l'etichetta.
Ad esempio, considerare i seguenti dati

Lo eseguiamo e assegniamo i punteggi all'output, non le etichette effettive. Con questo, possiamo disegnare una curva ROC, come suggerito qui

Ha poco senso, tuttavia, usarlo per ottimizzare la soglia (poiché, ovviamente, non esiste una soglia negli alberi delle decisioni), ma può ancora essere utilizzata per calcolare l'AUC, che, in questo caso, è 0,92
Codice R usato qui:
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')