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?
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?
Respuestas:
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.
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.
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 :. 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.
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 )
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
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í
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')