La mejor manera de manejar un conjunto de datos multiclase desequilibrado con SVM

9

Estoy tratando de construir un modelo de predicción con SVM en datos bastante desequilibrados. Mis etiquetas / resultados tienen tres clases, positiva, neutral y negativa. Yo diría que el ejemplo positivo representa alrededor del 10-20% de mis datos, neutral alrededor del 50-60% y negativo alrededor del 30-40%. Estoy tratando de equilibrar las clases ya que el costo asociado con las predicciones incorrectas entre las clases no es el mismo. Un método consistía en volver a muestrear los datos de entrenamiento y producir un conjunto de datos igualmente equilibrado, que era más grande que el original. Curiosamente, cuando hago eso, tiendo a obtener mejores predicciones para la otra clase (por ejemplo, cuando equilibré los datos, aumenté el número de ejemplos para la clase positiva, pero en las predicciones fuera de muestra, la clase negativa mejoró). ¿Alguien puede explicar generalmente por qué ocurre esto? Si aumento el número de ejemplos para la clase negativa, ¿obtendría algo similar para la clase positiva dentro de las predicciones de muestra (por ejemplo, mejores predicciones)?

También estoy muy abierto a otras ideas sobre cómo puedo abordar los datos desequilibrados, ya sea imponiendo diferentes costos en la clasificación errónea o utilizando los pesos de clase en LibSVM (aunque no estoy seguro de cómo seleccionarlos / ajustarlos correctamente).

tomas
fuente

Respuestas:

6

Tener diferentes penalizaciones para las variables de margen de margen para los patrones de cada clase es un mejor enfoque que volver a muestrear los datos. Es asintóticamente equivalente a volver a muestrear de todos modos, pero es más fácil de implementar y continuo, en lugar de discreto, por lo que tiene más control.

Sin embargo, elegir los pesos no es sencillo. En principio, puede elaborar una ponderación teórica que tenga en cuenta los costos de clasificación errónea y las diferencias entre el entrenamiento que establece una probabilidad operacional de clase anterior, pero no dará el rendimiento óptimo. Lo mejor que puede hacer es seleccionar las penalizaciones / pesos para cada clase minimizando la pérdida (teniendo en cuenta los costos de clasificación errónea) mediante validación cruzada.

Dikran Marsupial
fuente
¿Existe una forma automatizada de cómo hacerlo, o existen estudiantes que tienen esta funcionalidad incorporada?
Vam
Por lo general, solo escribo una función matlab para evaluar la pérdida de un conjunto particular de penalizaciones y luego minimizarla usando el algoritmo simplex de Nelder-Mead. No conozco ninguna biblioteca que tenga esto incorporado.
Dikran Marsupial
@DikranMarsupial ¿Sería equivalente una búsqueda de cuadrícula de las dos variables de margen de margen en un problema de dos clases a lo que está haciendo con el algoritmo simplex?
Spacey
@Tarantula sí, el método de optimización preciso es relativamente poco importante, el punto clave es asegurarse de que está optimizando la estadística de validación cruzada que realmente le interesa para los propósitos de su aplicación (es decir, las mismas frecuencias de clase encontradas en el uso operativo y teniendo en cuenta los costos de clasificación errónea si se conocen).
Dikran Marsupial