Come possiamo disegnare una curva ROC per gli alberi decisionali?


13

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?


1
Puoi trovare la tua risposta qui: stats.stackexchange.com/questions/105501/…
rapaio

[Valutazione del modello dell'albero decisionale per "set di addestramento" vs "set di test" in R] [1] [1]: stats.stackexchange.com/questions/49416/… Puoi trovare la tua risposta qui.
Sangram,

@rapaio Siamo spiacenti, il tuo collegamento mostra una curva ROC per trovare una soglia in un classificatore che produce output tra 1 e 0 (valore continuo).
DataMiner,

@Sangram Queste sono le soluzioni in R, ma voglio solo capire come funziona.
DataMiner,

Risposte:


15

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 è (x,y)=(FPR,TPR) , dove FPR - tasso di falsi positivi e TPR - 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 )(0,0)(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 TTFTF(scoreT,scoreF)=(countTcountT+countF,countFcountT+countF)=(10/15,5/15)=(0.66,0.33). 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.


12

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 )

esempio di albero decisionale

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

dati

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

curva roc

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')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.