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?
fuente
No soy una exportación en el uso de SVM, pero generalmente (si está utilizando una biblioteca de aprendizaje automático como Python
scikit-learn
o Rlibsvm
, existe elclass_weight
parámetro, oclass.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
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β Y yij=+1 i j yij=−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
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.
fuente