Cómo determinar la calidad de un clasificador multiclase

30

Dado

  • un conjunto de datos con instancias junto con clases donde cada instancia pertenece exactamente a una clasexiNxiyi
  • un clasificador multiclase

Después del entrenamiento y las pruebas, básicamente tengo una tabla con la clase verdadera y la clase predicha para cada instancia en el conjunto de prueba. Entonces, para cada instancia tengo una coincidencia ( ) o una falla ( ).yiaixiyi=aiyiai

¿Cómo puedo evaluar la calidad del partido? El problema es que algunas clases pueden tener muchos miembros, es decir, muchas instancias le pertenecen. Obviamente, si el 50% de todos los puntos de datos pertenecen a una clase y mi clasificador final es el 50% correcto en general, no he ganado nada. Podría haber hecho un clasificador trivial que genera esa clase más grande sin importar la entrada.

¿Existe un método estándar para estimar la calidad de un clasificador basado en los resultados conocidos del conjunto de pruebas de coincidencias y aciertos para cada clase? ¿Quizás es importante distinguir las tasas de correspondencia para cada clase en particular?

El enfoque más simple que se me ocurre es excluir las coincidencias correctas de la clase más grande. ¿Qué más?

Gerenuk
fuente
No estoy seguro si entiendo la pregunta correctamente. ¿Conoces la matriz de confusión y las medidas derivadas ? ¿Es esta la respuesta a tu pregunta? ¿O te refieres a algo más complicado?
steffen
Creo que esta es la fuente de mi confusión: en el primer párrafo declaras ... donde yi son las clases reales y ... : ¿Quieres decir que una instancia puede pertenecer / tiene más de una clase? ¿O cada pertenece / tiene exactamente una clase? Puedes por favor aclarar ? xixi
steffen
@steffen: He visto la matriz de confusión. En mi caso particular tengo 4 clases. Por lo tanto, no estoy seguro de qué medidas derivadas se pueden usar y tendrían sentido. Cada pertenece a una sola clase. Sin embargo, hay más de dos clases posibles en general . xii[1,,N]
Gerenuk
@steffen Esas medidas derivadas son principalmente aplicables a la clasificación binaria , mientras que esta pregunta trata explícitamente con más de dos clases. Esto requiere una comprensión modificada de términos como "verdadero positivo".
Michael McGowan
@MichaelMcGowan Le pedí al OP que me aclarara y luego realicé una edición para reflejar explícitamente el problema multiclase, que no era obvio antes de la edición (en mi humilde opinión).
steffen

Respuestas:

16

Al igual que la clasificación binaria, puede usar la tasa de error empírico para estimar la calidad de su clasificador. Sea un clasificador, y e sean respectivamente un ejemplo en su base de datos y su clase. Como dijiste, cuando las clases están desequilibradas, la línea de base no está 50% pero la proporción de la clase más grande. Puede agregar un peso en cada clase para equilibrar el error. Deje ser el peso de la clase . Establezca los pesos de manera que y defina el error empírico ponderadogxiyi

err(g)=1nin1g(xi)yi
Wyy1Wy1nin1yi=y
errW(g)=1ninWyi1g(xi)yi

Como dijo Steffen, la matriz de confusión podría ser una buena manera de estimar la calidad de un clasificador. En el caso binario, puede derivar alguna medida de esta matriz, como la sensibilidad y la especificidad, estimando la capacidad de un clasificador para detectar una clase en particular. La fuente de error de un clasificador puede ser de una manera particular. Por ejemplo, un clasificador puede tener demasiada confianza al predecir un 1, pero nunca decir mal cuando predice un 0. Muchos clasificadores pueden parametrizarse para controlar esta tasa (falsos positivos frente a falsos negativos), y entonces usted está interesado en la calidad del toda la familia de clasificadores, no solo uno. A partir de esto, puede trazar la curva ROC , y medir el área bajo la curva ROC le brinda la calidad de esos clasificadores.

Las curvas ROC se pueden extender para su problema multiclase. Le sugiero que lea la respuesta de este hilo .

Emile
fuente
1
¿No es necesario dividir el error empírico ponderado por el número de clases, para estar en la misma escala que el error empírico? De lo contrario, sería mucho más grande ...
PhilippPro
17

Para evaluar los sistemas de clasificación de texto de múltiples vías, utilizo F1 (medida F) con micro y macro promedios. La medida F es esencialmente una combinación ponderada de precisión y recordar eso. Para la clasificación binaria, los enfoques micro y macro son los mismos, pero, para el caso de múltiples vías, creo que podrían ayudarlo. Puede pensar en Micro F1 como una combinación ponderada de precisión y recuperación que le da el mismo peso a cada documento, mientras que Macro F1 le da el mismo peso a cada clase. Para cada uno, la ecuación de la medida F es la misma, pero calcula la precisión y recuerda de manera diferente:

F=(β2+1)PRβ2P+R,

donde generalmente se establece en 1. Luego,β

Pmicro=i=1|C|TPii=1|C|TPi+FPi,Rmicro=i=1|C|TPii=1|C|TPi+FNi

Pmacro=1|C|i=1|C|TPiTPi+FPi,Rmacro=1|C|i=1|C|TPiTPi+FNi

donde es verdadero positivo, es falso positivo, es falso negativo y es clase.TPFPFNC

Kyle
fuente
1
# Function in R, using precision, recall and F statistics

check.model.accuracy <- function(predicted.class, actual.class){

  result.tbl <- as.data.frame(table(predicted.class,actual.class ) ) 

  result.tbl$Var1 <- as.character(result.tbl$predicted.class)
  result.tbl$Var2 <- as.character(result.tbl$actual.class)

  colnames(result.tbl)[1:2] <- c("Pred","Act")

  cntr <- 0  
  for (pred.class in unique(result.tbl$Pred) ){
    cntr <- cntr+ 1
    tp <- sum(result.tbl[result.tbl$Pred==pred.class & result.tbl$Act==pred.class, "Freq"])
    tp.fp <- sum(result.tbl[result.tbl$Pred == pred.class , "Freq" ])
    tp.fn <- sum(result.tbl[result.tbl$Act == pred.class , "Freq" ])
    presi <- tp/tp.fp 
    rec <- tp/tp.fn
    F.score <- 2*presi*rec/(presi+rec)
    if (cntr == 1 ) F.score.row <- cbind(pred.class, presi,rec,F.score)
    if (cntr > 1 ) F.score.row <- rbind(F.score.row,cbind(pred.class,presi,rec,F.score))
  }

  F.score.row <- as.data.frame(F.score.row) 
  return(F.score.row)
}

check.model.accuracy(predicted.df,actual.df) 
# For multiclass, average across all classes 
Ashish Markanday
fuente
55
¿Puedes agregar algún texto para explicar esto?
gung - Restablece a Monica