¿Cómo podemos dibujar una curva ROC para los árboles de decisión?

13

Normalmente no podemos dibujar una curva ROC para los clasificadores discretos como los árboles de decisión. Estoy en lo cierto? ¿Hay alguna forma de dibujar una curva ROC para Dtrees?

Minero de datos
fuente
1
Puede encontrar su respuesta aquí: stats.stackexchange.com/questions/105501/…
rapaio
[Evaluación del modelo de árbol de decisión para “conjunto de entrenamiento” versus “conjunto de prueba” en R] [1] [1]: stats.stackexchange.com/questions/49416/… Puede encontrar su respuesta aquí.
Sangram
@rapaio Lo sentimos, su enlace muestra una curva ROC para encontrar un umbral en un clasificador que produce una salida entre 1 y 0 (valor continuo).
DataMiner
@Sangram Estas son las soluciones en R pero solo quiero entender cómo funciona.
DataMiner el

Respuestas:

15

Si su clasificador produce solo resultados de factores (solo etiquetas), sin puntajes, aún puede dibujar una curva ROC. Sin embargo, esta curva ROC es solo un punto. Considerando el espacio ROC, estos puntos son , donde - tasa de falso positivo y - tasa de verdadero positivo.(x,y)=(FPR,TPR)FPRTPR

Vea más sobre cómo se calcula esto en la página de Wikipedia .

Puede extender este punto para que parezca una curva ROC dibujando una línea desde hasta su punto, y desde allí hasta . Así tienes una curva.(0,0)(1,1)

Sin embargo, para un árbol de decisión es fácil extender desde una salida de etiqueta a una salida numérica. Tenga en cuenta que cuando predice con un árbol de decisión, baja del nodo raíz a un nodo hoja, donde predice con clase mayoritaria. Si en lugar de esa clase devuelve la proporción de clases en ese nodo hoja, tendría una puntuación para cada clase. Suponga que tiene dos clases y , y en su nodo hoja tiene 10 instancias con y 5 instancias con , puede devolver un vector de puntajes :TFTF(scoreT,scoreF)=(countTcountT+countF,countFcountT+countF)=(10/15,5/15)=(0.66,0.33). Tenga cuidado de que esto realmente tenga en cuenta una regla de puntuación adecuada (este no es el mejor estimador de probabilidades), pero creo que es mejor que nada, y así es como generalmente se recuperan los puntajes para los árboles de decisión.

rapaio
fuente
12

Para un árbol de decisión, las clases aún se predicen con cierto nivel de certeza. La respuesta ya la dio @rapaio, pero la ampliaré un poco.

Imagine el siguiente árbol de decisión (que es un poco versión modificada poco de esto uno )

ejemplo de árbol de decisión

En cada nodo hay no solo las etiquetas de clase mayoritaria, sino también otras que terminaron en esa hoja, por lo que podemos asignar el grado de certeza a esa hoja en la que predecimos la etiqueta.

Por ejemplo, considere los siguientes datos

datos

Lo ejecutamos y asignamos los puntajes a la salida, no a las etiquetas reales. Con esto, podemos dibujar una curva ROC, como se sugiere aquí

curva roc

Sin embargo, tiene poco sentido usarlo para ajustar su umbral (ya que, por supuesto, no existe un umbral en los árboles de decisión), pero aún se puede usar para calcular el AUC, que, en este caso, es 0.92

Código R utilizado aquí:

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
fuente