6 votos

¿Cómo dibujar la curva ROC con tres variables de respuesta?

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?

4voto

Calimo Puntos 528

Tal vez quiera echar un vistazo al volumen bajo la superficie ROC que se define en los siguientes artículos:

3voto

Alexey Grigorev Puntos 1751

El análisis ROC se diseñó para tratar sólo dos variables: el ruido y el no ruido, por lo que utilizarlo para 3 o más variables tiene poco sentido.

Sin embargo, para cualquier problema de multiclasificación es posible utilizar un grupo de clasificadores binarios y hacer lo que se llama Clasificación Uno-Todos

Por ejemplo, consideremos el conjunto de datos IRIS: hay 3 clases: setosa, versicolor y virginica. Así que podemos construir 3 clasificadores (por ejemplo, Naive Bayes): para setosa, para vesicolor y para virginica. Y luego dibujar una curva ROC para cada uno y ajustar el umbral para cada modelo por separado. En este caso, el AUC podría ser simplemente la media de los AUC de los modelos individuales.

Aquí hay una curva ROC para el conjunto de datos del IRIS:

ROC Curve

El AUC en este caso es $\approx 0.98 = \frac{1 + 0.98 + 0.97}{3}$

Código R:

library(ROCR)
library(klaR)

data(iris)

lvls = levels(iris$Species)
testidx = which(1:length(iris[, 1]) %% 5 == 0) 
iris.train = iris[testidx, ]
iris.test = iris[-testidx, ]

aucs = c()
plot(x=NA, y=NA, xlim=c(0,1), ylim=c(0,1),
     ylab='True Positive Rate',
     xlab='False Positive Rate',
     bty='n')

for (type.id in 1:3) {
  type = as.factor(iris.train$Species == lvls[type.id])

  nbmodel = NaiveBayes(type ~ ., data=iris.train[, -5])
  nbprediction = predict(nbmodel, iris.test[,-5], type='raw')

  score = nbprediction$posterior[, 'TRUE']
  actual.class = iris.test$Species == lvls[type.id]

  pred = prediction(score, actual.class)
  nbperf = performance(pred, "tpr", "fpr")

  roc.x = unlist(nbperf@x.values)
  roc.y = unlist(nbperf@y.values)
  lines(roc.y ~ roc.x, col=type.id+1, lwd=2)

  nbauc = performance(pred, "auc")
  nbauc = unlist(slot(nbauc, "y.values"))
  aucs[type.id] = nbauc
}

lines(x=c(0,1), c(0,1))

mean(aucs)

Fuente de inspiración: http://karchinlab.org/fcbb2_spr14/Lectures/Machine_Learning_R.pdf

0 votos

¿Deben fijarse los umbrales por separado para cada clase? En caso afirmativo, ¿qué ocurre si 2 clases tienen el mismo umbral?

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