sklearn - problema de sobreajuste

8

Estoy buscando recomendaciones sobre el mejor camino para mi problema actual de aprendizaje automático

El resumen del problema y lo que he hecho es el siguiente:

  • Tengo más de 900 pruebas de datos de EEG, donde cada prueba dura 1 segundo. La verdad básica es conocida para cada uno y clasifica el estado 0 y el estado 1 (división del 40-60%)
  • Cada prueba pasa por un preprocesamiento en el que filtro y extraigo la potencia de ciertas bandas de frecuencia, y estas conforman un conjunto de características (matriz de características: 913x32)
  • Luego uso sklearn para entrenar al modelo. cross_validation se usa donde uso un tamaño de prueba de 0.2. El clasificador está configurado en SVC con kernel rbf, C = 1, gamma = 1 (he probado varios valores diferentes)

Puede encontrar una versión abreviada del código aquí: http://pastebin.com/Xu13ciL4

Mis problemas:

  • Cuando uso el clasificador para predecir etiquetas para mi conjunto de pruebas, cada predicción es 0
  • la precisión del tren es 1, mientras que la precisión del conjunto de prueba es de alrededor de 0,56
  • mi diagrama de curva de aprendizaje se ve así:

ingrese la descripción de la imagen aquí

Ahora, esto parece un caso clásico de sobreajuste aquí. Sin embargo, el sobreajuste aquí es poco probable que sea causado por un número desproporcionado de características a las muestras (32 características, 900 muestras). He intentado varias cosas para aliviar este problema:

  • Intenté usar la reducción de dimensionalidad (PCA) en caso de que tenga demasiadas características para la cantidad de muestras, pero los puntajes de precisión y el diagrama de la curva de aprendizaje se ve igual que el anterior. A menos que establezca el número de componentes por debajo de 10, en ese momento la precisión del tren comienza a disminuir, pero ¿no es algo esperado dado que está comenzando a perder información?
  • He intentado normalizar y estandarizar los datos. La estandarización (SD = 1) no hace nada para cambiar el tren o los puntajes de precisión. La normalización (0-1) reduce mi precisión de entrenamiento a 0.6.
  • He probado una variedad de configuraciones de C y gamma para SVC, pero no cambian ninguno de los puntajes
  • Intenté usar otros estimadores como GaussianNB, incluso métodos de conjunto como adaboost. Ningún cambio
  • Intenté establecer explícitamente un método de regularización usando linearSVC pero no mejoró la situación
  • Intenté ejecutar las mismas funciones a través de una red neuronal usando theano y la precisión de mi tren es de alrededor de 0.6, la prueba es de alrededor de 0.5

Estoy feliz de seguir pensando en el problema, pero en este momento estoy buscando un empujón en la dirección correcta. ¿Dónde podría estar mi problema y qué podría hacer para resolverlo?

Es completamente posible que mi conjunto de características simplemente no distinga entre las 2 categorías, pero me gustaría probar algunas otras opciones antes de llegar a esta conclusión. Además, si mis características no distinguen, eso explicaría los bajos puntajes del conjunto de pruebas, pero ¿cómo se obtiene un puntaje perfecto del conjunto de entrenamiento en ese caso? ¿Es eso posible?

Simón
fuente
1
¿Cómo se veían los datos en 2 o 3 dimensiones después de aplicar PCA? ¿Hubo grupos notables? ¿Qué ejemplos se clasifican erróneamente? ¿Hay algún patrón?
image_doctor
¿Cómo son los espectros de poder de las huellas? si traza los espectros medios para cada clase, ¿se ven diferentes? De ser así, ¿cómo puede optimizar un clasificador para capturar esa diferencia?
image_doctor
1) ¿Puede mostrarnos el diagrama de clúster de PCA ?, 2) ¿Ha probado los árboles de decisión? Si las características originales son de alguna manera escrutables por humanos, es posible que pueda entender dónde va mal. De lo contrario (salvo algún error tonto de su parte) parecería que sus características simplemente no son lo suficientemente discriminatorias.
lollercoaster
Es muy posible que los datos del EEG no sean separables, pero ¿ha inspeccionado los conjuntos de prueba de entrenamiento v para asegurarse de que no estén sesgados (por ejemplo, uno solo tiene ejemplos positivos o está normalizado de manera diferente)?
jamesmf
1
¿Puedes publicar los datos en alguna parte? "AllData" o "features_all" (sin normalización y PCA).
stmax

Respuestas:

1

Para ver si SVM puede capturar alguna señal, intente equilibrar sus datos: cree conjuntos de entrenamiento y prueba que consistan exactamente en 50% de muestras positivas y 50% negativas (es decir, submuestreo aleatorio del que sea más grande). También estandarice los datos (reste la media y divida por la desviación estándar).

(Para equilibrar, puede intentar cambiar el parámetro class_weight en sklearn, pero encontramos que el método manual (submuestreo) funciona mejor).

Valentas
fuente