Curva ROC para clasificadores discretos como SVM: ¿Por qué todavía lo llamamos "curva" ?, ¿no es solo un "punto"?


25

En la discusión: cómo generar una curva roc para la clasificación binaria , creo que la confusión fue que un "clasificador binario" (que es cualquier clasificador que separa 2 clases) fue para Yang lo que se llama un "clasificador discreto" (que produce salidas discretas 0/1 como un SVM) y no salidas continuas como los clasificadores ANN o Bayes ... etc. Entonces, la discusión fue sobre cómo se traza el ROC para "clasificadores continuos binarios", y la respuesta es que las salidas están ordenadas por sus puntajes ya que los resultados son continuos, y se usa un umbral para producir cada punto en la curva ROC.

Mi pregunta es para "clasificadores discretos binarios", como SVM, los valores de salida son 0 o 1. Por lo tanto, el ROC produce solo un punto y no una curva. ¡Estoy confundido sobre por qué todavía lo llamamos curva! ¿Podemos seguir hablando de umbrales? ¿Cómo se pueden usar umbrales en SVM en particular? ¿Cómo se puede calcular el AUC ?, ¿la validación cruzada juega algún papel aquí?


10
Un SVM genera un valor de decisión real, es decir, la distancia firmada al hiperplano de separación en el espacio de características. En la clasificación, la etiqueta se asigna en función del signo de este valor de decisión. Como tal, SVMs hacen de salida más que un valor binario, su salida es sólo binariza como un paso de post-procesamiento en la clasificación.
Marc Claesen

Respuestas:


15
  • Sí, hay situaciones en las que no se puede obtener la curva de funcionamiento habitual del receptor y solo existe un punto.

  • Los SVM se pueden configurar para que generen probabilidades de pertenencia a clases. Estos serían el valor habitual para el cual se variaría un umbral para producir una curva de operación del receptor .
    ¿Es esto lo que estás buscando?

  • Los pasos en el ROC generalmente ocurren con un pequeño número de casos de prueba en lugar de tener algo que ver con una variación discreta en la covariable (en particular, terminas con los mismos puntos si eliges tus umbrales discretos para que para cada nuevo punto solo cambie una muestra su asignación).

  • La variación continua de otros parámetros (hiper) del modelo, por supuesto, produce conjuntos de pares de especificidad / sensibilidad que dan otras curvas en el sistema de coordenadas FPR; TPR.
    La interpretación de una curva, por supuesto, depende de qué variación generó la curva.

Aquí hay un ROC habitual (es decir, solicitar probabilidades como salida) para la clase "versicolor" del conjunto de datos de iris:

  • FPR; TPR (γ = 1, C = 1, umbral de probabilidad):
    ROC

El mismo tipo de sistema de coordenadas, pero TPR y FPR como función de los parámetros de ajuste γ y C:

  • FPR; TPR (γ, C = 1, umbral de probabilidad = 0.5):
    gama

  • FPR; TPR (γ = 1, C, umbral de probabilidad = 0.5):
    costo

Estas tramas tienen un significado, ¡pero el significado es decididamente diferente del de la ROC habitual!

Aquí está el código R que utilicé:

svmperf <- function (cost = 1, gamma = 1) {
    model <- svm (Species ~ ., data = iris, probability=TRUE, 
                  cost = cost, gamma = gamma)
    pred <- predict (model, iris, probability=TRUE, decision.values=TRUE)
    prob.versicolor <- attr (pred, "probabilities")[, "versicolor"]

    roc.pred <- prediction (prob.versicolor, iris$Species == "versicolor")
    perf <- performance (roc.pred, "tpr", "fpr")

    data.frame (fpr = perf@x.values [[1]], tpr = perf@y.values [[1]], 
                threshold = perf@alpha.values [[1]], 
                cost = cost, gamma = gamma)
}

df <- data.frame ()
for (cost in -10:10)
  df <- rbind (df, svmperf (cost = 2^cost))
head (df)
plot (df$fpr, df$tpr)

cost.df <- split (df, df$cost)

cost.df <- sapply (cost.df, function (x) {
    i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y 
    x [i,]
})

cost.df <- as.data.frame (t (cost.df))
plot (cost.df$fpr, cost.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (cost.df$fpr, cost.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (cost.df),start=0, end=4/6)))

df <- data.frame ()
for (gamma in -10:10)
  df <- rbind (df, svmperf (gamma = 2^gamma))
head (df)
plot (df$fpr, df$tpr)

gamma.df <- split (df, df$gamma)

gamma.df <- sapply (gamma.df, function (x) {
     i <- approx (x$threshold, seq (nrow (x)), 0.5, method="constant")$y
     x [i,]
})

gamma.df <- as.data.frame (t (gamma.df))
plot (gamma.df$fpr, gamma.df$tpr, type = "l", xlim = 0:1, ylim = 0:1, lty = 2)
points (gamma.df$fpr, gamma.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (gamma.df),start=0, end=4/6)))

roc.df <- subset (df, cost == 1 & gamma == 1)
plot (roc.df$fpr, roc.df$tpr, type = "l", xlim = 0:1, ylim = 0:1)
points (roc.df$fpr, roc.df$tpr, pch = 20, 
        col = rev(rainbow(nrow (roc.df),start=0, end=4/6)))

1
Esto está muy claro, gracias. ¡Tenía la idea de que variar b es como mover el hiperplano y, por lo tanto, tener diferente (TPR, FPR)! pero con el clasificador SVM, el sesgo b se aprende, ¿entonces parece ser el mejor parámetro? no ?, si este es el caso, no hay necesidad de realizar el análisis ROC ?, no?
Abdelhak Mahmoudi

@AbdelhakMahmoudi: Supongo que los parámetros aprendidos por el modelo no son lo que quieres variar. Pero como puede tener un resultado de probabilidad (no profundicé en el código, así que no sé si el SVM de probabilidad es realmente equivalente a los "duros"), ¿por qué no usarlo? Este es un resultado muy común a partir del cual se genera el ROC. La función svm de R es una interfaz para el libsvm ampliamente utilizado, por lo que no está restringido a usar R para hacer esto.
cbeleites apoya a Monica el

these plots do have a meaning- ¿Cuál es el significado de esas tramas?
Gulzar

8

y^y^=firmar(wTX+si)wsi

y^={0 0Si  wTX+si<0 01de otra manera

ηη

y^={0 0Si  wTX+si<η1de otra manera

η

wsiη

>>> from sklearn.svm import SVC
>>> model = SVC(kernel='linear', C=0.001, probability=False, class_weight='balanced')
>>> model.fit(X, y)
>>> # The coefficients w are given by
>>> w = list(model.coef_)
>>> # The intercept b is given by
>>> b = model.intercept_[0]
>>> y_hat = X.apply(lambda s: np.sum(np.array(s)*np.array(w))+b, axis=1)
>>> y_hat = (y_hat > eta).astype(float)

3

La curva ROC traza la especificidad frente a la sensibilidad que varía con el umbral de una covariable (que puede ser continua o discreta). Creo que estás confundiendo la covariable con la respuesta y quizás no entiendes completamente qué es una curva ROC. Ciertamente es una curva si la covariable es continua y observamos un umbral para que la covariable cambie continuamente. Si la covariable es discreta, aún puede trazar en función de un umbral continuo. Entonces la curva sería plana con pasos hacia arriba (o hacia abajo) en umbrales que corresponden a los valores discretos de la covariable. Entonces esto se aplicaría a SVM y a cualquier otro clasificador discreto.

Con respecto al AUC ya que todavía tenemos un ROC (uno estimado), aún podemos calcular el área debajo de él. No estoy seguro de por qué tenía en mente su pregunta sobre la validación cruzada. En el contexto de los problemas de clasificación, la validación cruzada se utiliza para obtener estimaciones imparciales o casi imparciales de las tasas de error para el clasificador. Entonces puede entrar en cómo estimamos los puntos en el ROC.


1
Ok, ¿cuáles podrían ser los umbrales para el clasificador svm?
Abdelhak Mahmoudi

No lo sé. ¿Qué son las covariables? Si tiene una covariable, cualquier valor podría ser un umbral. Si tiene más de una covariable, el rendimiento del clasificador depende de la elección de varios valores en lugar de un solo umbral, pero aún varía en el espacio de las covariables.
Michael R. Chernick

Por ejemplo, los SVM lineales se basan en el hiperplano de separación que depende del valor C elegido (bajo C tolera más errores de entrenamiento), ¿podría un conjunto de valores C ser el conjunto de umbrales?
Abdelhak Mahmoudi

Sí, ¿y los valores de C no son solo combinaciones lineales de las covariables?
Michael R. Chernick

2
C es el factor de penalización introducido para controlar la compensación entre la complejidad del hiperplano y los errores de entrenamiento. Otra alternativa podría ser el uso del sesgo b como umbral, ya que b es la distancia desde el centro del espacio de características hasta el hiperplano de separación. ¡Así que variar b es como mover el hiperplano y tener diferentes TP y FP! Este es mi entendimiento!
Abdelhak Mahmoudi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.