5 votos

Superficies ROC en R

Si mi variable de respuesta, tiene 2 niveles, 0 y 1, puede utilizar una curva ROC para evaluar la exactitud de mi modelo predictivo. Pero ¿qué pasa si mi variable de respuesta tiene 3 niveles, -1, 0 y 1? Es allí una manera a la trama de "ROC superficies" en R?

Comencé a tratar de este código hasta mí, pero yo no podía entender cómo calcular y graficar la superficie.

library(rpart)
library(randomForest)

y <- as.factor(c(-1,-1,-1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,-1,0,1,0,1,0,-1,0,-1,0,-1,1,0))
x1 <- rnorm(1:30)
x2 <- rnorm(1:30)
x3 <- rnorm(1:30)

model <- randomForest(y~x1+x2+x3)
model
y1 <- predict(model,type='prob')

DF <- data.frame(y=as.numeric(as.character(y)),'negone'=y1[,'-1'],'zero'=y1[,'0'],'one'=y1[,'1'])

DF$FPrOne <- 
DF$FPrNegOne <- 
DF$TPR <- 

library(rgl)
plot3d(DF$FPrOne,DF$FPrNegOne,DF$TPR,type=1)

6voto

ESRogs Puntos 1381

Alguna idea de meterlo en 2D que en 3D es una superficie definida por la verdadera tasa positiva de cada clase (Él, Xin, B. D. Gallas, y E. C. Frey. 2009.), así que voy a ir de esta manera.

Digamos que el g variable contiene el voto proporciones:

g<-model$votes;

En primer lugar usted necesita dos umbrales, uno para cada una de las dos clases (digamos de 1 y -1) -- voy a llamar a qP y qN, que va a crear la superficie:

qP<-qN<-seq(0,1,30)

Ahora, vamos a calcular una verdadera tasa de positivos positivos de la clase (y negativo, que generalmente es el mismo):

tpP<-function(qP,qN,g) sum(g[,"1"]>qP & y=="1")/sum(y=="1")
tpN<-function(qP,qN,g) sum(g[,"-1"]>qN & y=="-1")/sum(y=="-1")

El cero de la clase se pone el resto de votos:

tpZ<-function(qP,qN,g) sum(!(q[,"-1"]>qN) & !(q[,"1"]>qP) & y=="0")/sum(y=="0")

Ahora sólo tenemos que aplicar sobre el conjunto de la qPxqN, la forma más fácil es usar outer a Vectorized funciones (tenga en cuenta que este no es el método eficaz, aunque no veo ninguna obvio optimizaciones que no degenere legibilidad):

X<-outer(qP,qN,Vectorize(tpP,vec=c("qP","qN")),g)
   outer(qP,qN,Vectorize(tpN,vec=c("qP","qN")),g)->Y
Z<-outer(qP,qN,Vectorize(tpZ,vec=c("qP","qN")),g)

Ahora todos los puntos (X[[i]],Y[[i]],Z[[i]]) se deben establecer en la superficie; la matriz de formato es adecuado para ejecutar rgl.surface:

rgl.surface(X,Z,Y) //Yup, the order is weired

enter image description here

Definitivamente no parecer demasiado bueno, pero esto es lo que uno puede esperar en un pequeño aleatoria de los datos ;-)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X