Como podemos desenhar uma curva ROC para árvores de decisão?

13

Normalmente, não podemos desenhar uma curva ROC para classificadores discretos, como árvores de decisão. Estou certo? Existe alguma maneira de desenhar uma curva ROC para Dtrees?

Minerador de dados
fonte
1
Você pode encontrar o seu aswer aqui: stats.stackexchange.com/questions/105501/...
rapaio
[Avaliação do modelo de árvore de decisão para "conjunto de treinamento" vs "conjunto de teste" em R] [1] [1]: stats.stackexchange.com/questions/49416/… Você pode encontrar sua resposta aqui.
Sangram
@rapaio Desculpe, seu link mostra uma curva ROC para encontrar um limite em um classificador que produz saída entre 1 e 0 (valor contínuo).
DataMiner 04/07
@ Sangram Estas são as soluções em R, mas eu quero apenas entender como ele funciona.
DataMiner

Respostas:

15

(x,y)=(FPR,TPR)FPRTPR - taxa de verdadeiro positivo.

Veja mais sobre como isso é calculado na página da Wikipedia .

(0 0,0 0)(1,1) . Assim você tem uma curva.

TFTF(PontoT,PontoF)=(contagemTcontagemT+contagemF,contagemFcontagemT+contagemF)=(10/15,5/15)=(0,66,0,33)

rapaio
fonte
12

Para uma Árvore de Decisão, as classes ainda são previstas com algum nível de certeza. A resposta já é dada por @rapaio, mas vou expandir um pouco.

Imagine a seguinte árvore de decisão (é uma versão pouco modificada deste um )

exemplo de árvore de decisão

Em cada nó não há apenas os rótulos de classe majoritária, mas também outros que acabaram nessa folha, para que possamos atribuir o grau de certeza àquela folha na qual previmos o rótulo.

Por exemplo, considere os seguintes dados

dados

Nós o executamos e atribuímos as pontuações à saída, não aos rótulos reais. Com isso, podemos desenhar uma curva ROC, como sugerido aqui

curva roc

No entanto, faz pouco sentido usá-lo para ajustar seu limite (já que, é claro, não existe um limite nas Árvores de Decisão), mas ainda pode ser usado para calcular a AUC, que, neste caso, é 0,92

Código R usado aqui:

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
fonte