Tengo un ejemplo de juguete reproducido a continuación en el que la variable de respuesta tiene tres clases posibles. Estoy tratando de crear una ROC pero no estoy seguro de cómo tratarla cuando hay tres clases. Cualquier ayuda será apreciada. Gracias
library(ipred)
control = rpart.control(maxdepth = 20, minsplit = 20, cp = 0.01, maxsurrogate=2, surrogatestyle = 0, xval=25)
n <- 500; p <- 10
f <- function(x,a,b,d) return( a*(x-b)^2+d )
x1 <- runif(n/2,0,4)
y1 <- f(x1,-1,2,1.7)+runif(n/2,-1,1)
x2 <- runif(n/2,2,6)
y2 <- f(x2,1,4,-1.7)+runif(n/2,-1,1)
y <- c(rep(-1,floor(n/3)),rep(0,ceiling(n/3)), rep(1,ceiling(n/3)))
dat <- data.frame(y=factor(y),x1=c(x1,x2),x2=c(y1,y2), matrix(rnorm(n*(p-2)),ncol=(p-2)))
names(dat)<-c("y",paste("x",1:p,sep=""))
dat
plot(dat$x1,dat$x2,pch=c(1:2)[y], col=c(1,8)[y],
xlab=names(dat)[2],ylab=names(dat)[3])
indtrain<-sample(1:n,300,replace=FALSE)
train<-dat[indtrain,]; dim(train)
test<-dat[setdiff(1:n,indtrain),]; dim(test)
test
mod <- bagging(y~., data=train, control=control, coob=TRUE, nbagg=25, keepX = TRUE)
mod
pred<-predict(mod, newdata=test[,-1],type="prob", aggregation= "average"); pred
Para un caso de dos clases, solía hacer lo siguiente pero ya no es válido para tres clases.
yhat <- pred[,2]
y = test[, -1]
plot.roc(y, yhat)
0 votos
Tienes razón: el ROC se define sólo para dos clases, y quizá no exista una generalización obvia. Una opción es dividir su análisis en tres ROCs separados (A versus B unión C, B versus A unión C, y C versus A unión B). Alternativamente, podría ser interesante la tasa global de clasificación errónea.
0 votos
Gracias @zkurtz, tal y como has sugerido ¿cómo puedo encontrar la unión utilizando las probabilidades de clase?