Datos sesgados de varias clases

10

Tengo un conjunto de datos que contiene ~ 100,000 muestras de 50 clases. He estado usando SVM con un núcleo RBF para entrenar y predecir nuevos datos. Sin embargo, el problema es que el conjunto de datos está sesgado hacia diferentes clases.

Por ejemplo, Clase 1 - 30 (~ 3% cada uno), Clase 31 - 45 (~ 0.6% cada uno), Clase 46 - 50 (~ 0.2% cada uno)

Veo que el modelo tiende a predecir muy raramente las clases que ocurren con menos frecuencia en el conjunto de entrenamiento, a pesar de que el conjunto de prueba tiene la misma distribución de clase que el conjunto de entrenamiento.

Soy consciente de que existen técnicas como el 'submuestreo' donde la clase mayoritaria se reduce a la clase menor. Sin embargo, ¿es esto aplicable aquí donde hay tantas clases diferentes? ¿Existen otros métodos para ayudar a manejar este caso?

mike1886
fuente

Respuestas:

5

Te sugiero que uses libsvm, que ya tiene implementados pesos de clase ajustables. En lugar de replicar las muestras de entrenamiento, uno modifica el parámetro C para diferentes clases en la optimización SVM. Por ejemplo, si sus datos tienen 2 clases, y la primera clase es solo el 10% de los datos, elegiría que los pesos de las clases sean 10 y 1 para las clases 1 y 2 respectivamente. Por lo tanto, las infracciones de margen de la primera clase costarían 10 veces más que las infracciones de margen para la segunda clase, y las precisiones por clase serían más equilibradas.

magicharp
fuente
gracias por el consejo, ¿sabe si libsvm hace esto automáticamente o necesito pasar manualmente los pesos de la clase?
mike1886
Debe pasar manualmente los pesos de la clase. La forma de hacerlo es diferente según la interfaz que esté utilizando (python, java, matlab, c). Está bien documentado en los archivos léame si descarga la herramienta desde csie.ntu.edu.tw/~cjlin/libsvm . Además, el tamaño de sus datos parece ser grande y la implementación predeterminada de varias clases de libsvm utilizará una clasificación uno contra uno que puede tardar demasiado en ejecutarse. Puede intentar entrenar 50 clasificadores binarios uno contra todos especificando los pesos adecuadamente.
magicharp
2

No soy una exportación en el uso de SVM, pero generalmente (si está utilizando una biblioteca de aprendizaje automático como Python scikit-learno R libsvm, existe el class_weightparámetro, o class.weights, respectivamente.

O si usara un clasificador de Bayes, tendría en cuenta este "sesgo" a través de las "probabilidades anteriores (de clase)" P (ω j )


fuente
1

Con respecto al enfoque, SVM con un kernel RBF hace un buen trabajo, pero los SVM se pueden ralentizar por tamaños de objetos grandes, a menos que esté empleando CV con, por ejemplo, una décima parte de los datos asignados aleatoriamente a cada pliegue. Sin embargo, ¿se preguntó por qué está empleando SVM en primer lugar?

¿Ha probado la regresión lineal multivariada, , donde cada registro de se codifica si el ésimo objeto está en clase , y contrario? Si la precisión de la clasificación es apreciablemente alta utilizando la regresión lineal, entonces sus datos son linealmente separables, y no se necesitan métodos más complejos como SVM y ANN. El paso 2 sería mostrar que el vecino k-más cercano, Bayes ingenuo, análisis discriminante lineal (Fisher), regresión logística politómica, etc., se descomponen y fallan.Y=XβYyij=+1ijyij=1

Para la terminología, podría resolver el problema de tener más ponderaciones de clase en el contexto de "proporciones más bajas de objetos en ciertas clases" o "tamaño de clase casi cero". La inclinación tiende a usarse para describir la distribución de los valores de una característica, como en la inclinación, colas gruesas, etc.

¿Cuántas características tienes? ¿Intentó la agrupación no supervisada (descubrimiento de clase) en los 100.000 objetos antes de intentar la clasificación supervisada (predicción de clase) con SVM? Quizás los 100,000 objetos se pueden agrupar en menos clases que 50, para lo cual la nueva membresía de la clase podría usarse como la clase objetivo durante el análisis de clasificación. Esto puede aliviar el problema de tener un tamaño de clase cercano a cero.


fuente
1

Me he enfrentado a este problema muchas veces al usar SVM con el kernel Rbf. El uso del núcleo lineal en lugar del núcleo Rbf resolvió mi problema, pero traté con un menor número de clases. Los resultados fueron menos sesgados y más precisos con el núcleo lineal. Espero que esto resuelva tu problema.

Editar: Si bien escribí la respuesta original, fui lo suficientemente ingenuo como para no considerar ponderar las clases como una de ellas respondió correctamente. Además, al usar el kernel rbf es importante asegurarse de que el parámetro de penalización o el valor 'C' según el módulo svm de sklearn sea demasiado genérico. Encuentro que el valor predeterminado de C = 1 es demasiado genérico la mayor parte del tiempo y generalmente termino con un valor de C = 10000. Espero que esto ayude a otros que obtienen resultados asimétricos con svm (rbf) a pesar de tener una buena distribución de clases en los datos.

usuario776193
fuente
¡Gracias por la respuesta! De hecho, he probado muchos otros algoritmos / núcleos y todavía tengo el mismo tipo de problema. Por lo tanto, estoy buscando un enfoque más como submuestreo o alguna forma de igualar las clases.
mike1886
Ok, también puede intentar replicar filas para clases que contienen datos dispersos, aunque es útil solo si las características de los datos dispersos son realmente buenas.
user776193