3 votos

Clasificación multiclase con clases desequilibradas

Tengo datos de 5 clases y me gustaría construir un clasificador. Sin embargo, el número de vectores de características en cada clase es muy diferente. Una tiene unos 5000, otra unos 200.000, otra unos 1.000.000, otra unos 10.000.000 y otra unos 1.000.000.000.

Como la clase más grande es demasiado grande para construir un clasificador con ella, tendré que reducir la muestra en cualquier caso.

Actualmente estoy usando scikit learn y Random Forests aunque puedo usar otra herramienta si fuera mejor. Si fuera un problema de clasificación binaria podría haber entrenado con clases equilibradas y calcular la curva ROC para obtener la tasa de falsos positivos que puedo tolerar. Sin embargo no tengo ni idea de lo que hay que hacer en este caso multiclase.

¿Existen recomendaciones de buenas prácticas sobre qué hacer en la práctica en esta situación? No quiero que el clasificador simplemente ignore una de las clases, por ejemplo.

2voto

Mirko Friedenhagen Puntos 304

Como el tamaño de sus clases es tan grande. Yo realizaría un muestreo previo a algo así como 5000+10000+10000+10000+10000. ¿Realmente necesita más muestras? A continuación, vuelva a reducir la muestra y modele de forma independiente y agregar varios bosques después. Eso ahorrará tiempo y memoria. Durante el modelado puede incluso sólo hacer bootstrap de ~5000 muestras para cada árbol para acelerar el proceso. Para cada árbol el bootstrap puede ser estratificado, de tal manera que se seleccionen 1000 muestras de cada clase.

Aquí está un hilo sobre cómo entrenar un bosque multiclase equilibrado con un muestreo descendente y un gráfico ROC 1-vs-rest.

Y aquí hay un ejemplo de R-code sobre gráficos roc 1-vs-rest:

library(AUC)
#simulated probabilistic prediction(yhat) vs true class (y)
obs=500
nClass=5
y = sample(1:nClass,obs,rep=T)
yhat = sapply(y,function(y) {
  pred.prob = rep(0,nClass)
  pred.prob[y] = 0.2
  pred.prob = pred.prob + runif(nClass)
  pred.prob = pred.prob / sum(pred.prob)
})

#plot 1-vs-all, one curve for each class
for(i in 1:nClass) plot(roc(predictions = yhat[i,],
                        labels = as.factor(y==i)),
                        add=i!=1,
                        col=i)

enter image description here

2voto

user117301 Puntos 56

El cambio de las tasas de referencia para su modelo con problemas de varias clases afectará a sus probabilidades de salida de forma no deseada. Por ejemplo, la salida de probabilidades para su clase minoritaria será más alta de lo que debería y sesgaría los resultados y perjudicaría el rendimiento. Tendría que cambiar la probabilidad de salida de alguna manera (ajuste bayesiano o alguna otra forma).

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