Cómo trazar una curva ROC para un modelo knn

Estoy usando el paquete ROCR y me preguntaba cómo se puede trazar una curva ROC para el modelo knn en R. ¿Hay alguna forma de trazarlo todo con este paquete?

No sé cómo usar la función de predicción de ROCR para knn. Aquí está mi ejemplo, estoy usando un conjunto de datos isolet del repositorio UCI donde cambié el nombre del atributo de clase como y:

cl<-factor(isolet_training$y)
knn_isolet<-knn(isolet_training, isolet_testing, cl, k=2, prob=TRUE)

Ahora mi pregunta es, ¿cuáles son los argumentos para pasar a la función de predicción de ROC? Probé las 2 alternativas a continuación que no funcionan:

library(ROCR)
pred_knn<-prediction(knn_isolet$y, cl)
pred_knn<-prediction(knn_isolet$y, isolet_testing$y)

preguntado el 31 de julio de 12 a las 14:07

Supongo que se puede hacer ya que el paquete ROCR se trata de visualizar varios aspectos de los clasificadores. Sería genial si pudiera proporcionar un ejemplo de juguete donde muestre cómo encaja su clasificador kNN. -

@Backlin Acabo de agregar un ejemplo. -

2 Respuestas

Hay varios pasos que resolver para obtener una curva ROC aquí. Solo voy a inventar algunos datos ya que no proporcionó una manera fácil de obtener los datos que está utilizando. Tenga en cuenta que el ROCR package quiere que las etiquetas de clase sean positivas/negativas, no factores, así que hagámoslas así.

# Generate fake data
isolet_training <- sweep(matrix(rnorm(400), 40, 10), 1, rep(0:1, each=20))
isolet_testing <- sweep(matrix(rnorm(400), 40, 10), 1, rep(0:1, each=20))
# Generate class labels
cl <- cl_testing <- rep(c(-1, 1), each=20)

Ahora puede entrenar su knn y obtener sus probabilidades de clase de la "prob" atributo.

knn_isolet <- class::knn(isolet_training, isolet_testing, cl, k=2, prob=TRUE)
prob <- attr(knn_isolet, "prob")
# you can probably use just `knn` instead of `class::knn`,
# but for some reason it did not work for me.

Sin embargo, vienen en una forma que ROCR no acepta por lo que tenemos que invertirlos para el -1 clase y reescalarlas.

prob <- 2*ifelse(knn_isolet == "-1", 1-prob, prob) - 1

Ahora puede introducir las "probabilidades" en el ROCR funciones del paquete y obtener una curva ROC.

pred_knn <- prediction(prob, cl_testing)
pred_knn <- performance(pred_knn, "tpr", "fpr")
plot(pred_knn, avg= "threshold", colorize=T, lwd=3, main="Voilà, a ROC curve!")

enter image description here

Respondido 02 ago 12, 13:08

Si el vector a proporcionar en el predictions argumento debe contener las probabilidades de categoría positiva de cada caso, ¿por qué ifelse(knn_isolet == "-1", 1-prob, prob) solo no es suficiente para obtener tales probabilidades? - por siempre novato

pred_knn<-predicción(knn_isolet$y, isolet_testing$y)

Esta línea funcionaría bien, pero según la documentación, ambos argumentos deben ser vectores.

Así que primero haz:

knn_isolet$y <- as.vector(knn_isolet$y, modo = "numérico")

isolet_testing$y <- as.vector(isolet_testing$y, modo = "numérico")

Nota: ROCR solo admite la clasificación binaria. Así que comprueba si los niveles en 'knn_isolet$y' e 'isolet_testing$y' tienen las mismas etiquetas.

Respondido 10 Abr '15, 12:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.