17 votos

Curva ROC que cruza la diagonal

En este momento estoy utilizando un clasificador binario. Cuando trazo la curva ROC obtengo una buena elevación al principio, luego cambia de dirección y cruza la diagonal y luego, por supuesto, vuelve a subir, haciendo que la curva tenga forma de S inclinada.

¿Cuál puede ser una interpretación/explicación al respecto?

Gracias

1 votos

¿Por qué le interesa una curva ROC? ¿Qué le hizo elegir un clasificador en lugar de un modelo probabilístico directo?

20voto

Jens Bannmann Puntos 1148

Sólo se obtiene un bonito gráfico ROC simétrico cuando las desviaciones estándar de ambos resultados son iguales. Si son bastante diferentes, puede que obtenga exactamente el resultado que describe.

El siguiente código de Mathematica lo demuestra. Suponemos que un objetivo arroja una distribución normal en el espacio de respuesta y que el ruido también arroja una distribución normal, pero desplazada. Los parámetros ROC se determinan por el área bajo las curvas de Gauss a la izquierda o a la derecha de un criterio de decisión. La variación de este criterio describe la curva ROC.

Manipulate[
 ParametricPlot[{CDF[NormalDistribution[4, \[Sigma]], c], 
                 CDF[NormalDistribution[0, 3], c]
                }, {c, -10, 10}, 
                Frame -> True, 
                Axes -> None, PlotRange -> {{0, 1}, {0, 1}}, 
                Epilog -> Line[{{0, 0}, {1, 1}}]], 
 {{\[Sigma], 3}, 0.1, 10, Appearance -> "Labeled"}]

Esto es con desviaciones estándar iguales: enter image description here

Esto es con unos bastante distintos:

enter image description here

o con algunos parámetros más con los que jugar:

Manipulate[
 ParametricPlot[{CDF[NormalDistribution[\[Mu]1, \[Sigma]1], c], 
   CDF[NormalDistribution[\[Mu]2, \[Sigma]2], c]}, {c, -100, 100}, 
  Frame -> True, Axes -> None, PlotRange -> {{0, 1}, {0, 1}}, 
  Epilog -> Line[{{0, 0}, {1, 1}}]], {{\[Mu]1, 0}, 0, 10, 
  Appearance -> "Labeled"},
 {{\[Sigma]1, 4}, 0.1, 20, Appearance -> "Labeled"},
 {{\[Mu]2, 5}, 0, 10, Appearance -> "Labeled"},
 {{\[Sigma]2, 4}, 0.1, 20, Appearance -> "Labeled"}]

enter image description here

2voto

Sean Hanley Puntos 2428

(Las respuestas de @Sjoerd C. de Vries y @Hrishekesh Ganu son correctas. No obstante, he pensado que podría presentar las ideas de otra manera, que podría ayudar a algunas personas).


Puedes obtener un ROC como ese si tu modelo está mal especificado. Considere el siguiente ejemplo (codificado en R ), que está adaptado de mi respuesta aquí: ¿Cómo utilizar los gráficos de caja para encontrar el punto en el que es más probable que los valores procedan de condiciones diferentes?

## data
Cond.1 = c(2.9, 3.0, 3.1, 3.1, 3.1, 3.3, 3.3, 3.4, 3.4, 3.4, 3.5, 3.5, 3.6, 3.7, 3.7,
           3.8, 3.8, 3.8, 3.8, 3.9, 4.0, 4.0, 4.1, 4.1, 4.2, 4.4, 4.5, 4.5, 4.5, 4.6,
           4.6, 4.6, 4.7, 4.8, 4.9, 4.9, 5.5, 5.5, 5.7)
Cond.2 = c(2.3, 2.4, 2.6, 3.1, 3.7, 3.7, 3.8, 4.0, 4.2, 4.8, 4.9, 5.5, 5.5, 5.5, 5.7,
           5.8, 5.9, 5.9, 6.0, 6.0, 6.1, 6.1, 6.3, 6.5, 6.7, 6.8, 6.9, 7.1, 7.1, 7.1,
           7.2, 7.2, 7.4, 7.5, 7.6, 7.6, 10, 10.1, 12.5)
dat    = stack(list(cond1=Cond.1, cond2=Cond.2))
ord    = order(dat$values)
dat    = dat[ord,]  # now the data are sorted

## logistic regression models
lr.model1 = glm(ind~values,             dat, family="binomial")  # w/o a squared term
lr.model2 = glm(ind~values+I(values^2), dat, family="binomial")  # w/  a squared term
lr.preds1 = predict(lr.model1, data.frame(values=seq(2.3,12.5,by=.1)), type="response")
lr.preds2 = predict(lr.model2, data.frame(values=seq(2.3,12.5,by=.1)), type="response")

## here I plot the data & the 2 models
windows()
  with(dat, plot(values, ifelse(ind=="cond2",1,0), 
                 ylab="predicted probability of condition2"))
  lines(seq(2.3,12.5,by=.1), lr.preds1, lwd=2, col="red")
  lines(seq(2.3,12.5,by=.1), lr.preds2, lwd=2, col="blue")
  legend("bottomright", legend=c("model 1", "model 2"), lwd=2, col=c("red", "blue"))

enter image description here

Es fácil ver que el modelo rojo no tiene en cuenta la estructura de los datos. Podemos ver cómo son las curvas ROC trazadas a continuación:

library(ROCR)  # we'll use this package to make the ROC curve

## these are necessary to make the ROC curves
pred1 = with(dat, prediction(fitted(lr.model1), ind))
pred2 = with(dat, prediction(fitted(lr.model2), ind))
perf1 = performance(pred1, "tpr", "fpr")
perf2 = performance(pred2, "tpr", "fpr")

## here I plot the ROC curves
windows()
  plot(perf1, col="red",  lwd=2)
  plot(perf2, col="blue", lwd=2, add=T)
  abline(0,1, col="gray")
  legend("bottomright", legend=c("model 1", "model 2"), lwd=2, col=c("red", "blue"))

enter image description here

Ahora podemos ver que, para el modelo mal especificado (rojo), cuando la tasa de falsos positivos es mayor que $80\%$ la tasa de falsos positivos aumenta más rápidamente que la de verdaderos positivos. Observando los modelos anteriores, vemos que ese punto está donde las líneas roja y azul se cruzan en la parte inferior izquierda.

1voto

Wabbit Puntos 41

Tener una serie de instancias negativas en la parte de la curva con un FPR alto puede crear este tipo de curva. Esto está bien siempre que se utilice el algoritmo adecuado para generar la curva ROC.

La condición de tener un conjunto de 2 millones de puntos, la mitad de ellos positivos y la otra mitad negativos, con la misma puntuación para el modelo es complicada. Si al ordenar los puntos en función de la puntuación (procedimiento estándar en el trazado de ROC) se encuentran primero todos los ejemplos negativos, la curva ROC se mantendrá plana y se desplazará hacia la derecha:

Fawcett| Trazado de curvas ROC

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