sklearn - problème de surajustement

8

Je recherche des recommandations sur la meilleure façon de résoudre mon problème actuel d'apprentissage automatique

Le contour du problème et ce que j'ai fait est le suivant:

  • J'ai plus de 900 essais de données EEG, où chaque essai dure 1 seconde. La vérité fondamentale est connue pour chacun et classe l'état 0 et l'état 1 (répartition de 40 à 60%)
  • Chaque essai passe par un prétraitement où je filtre et extrait la puissance de certaines bandes de fréquences, et celles-ci constituent un ensemble de fonctionnalités (matrice de fonctionnalités: 913x32)
  • Ensuite, j'utilise sklearn pour former le modèle. cross_validation est utilisé lorsque j'utilise une taille de test de 0,2. Le classificateur est défini sur SVC avec le noyau rbf, C = 1, gamma = 1 (j'ai essayé un certain nombre de valeurs différentes)

Vous pouvez trouver une version abrégée du code ici: http://pastebin.com/Xu13ciL4

Mes problèmes:

  • Lorsque j'utilise le classificateur pour prédire les étiquettes de mon jeu de tests, chaque prédiction est 0
  • la précision du train est de 1, tandis que la précision de l'ensemble de test est d'environ 0,56
  • mon tracé de courbe d'apprentissage ressemble à ceci:

entrez la description de l'image ici

Maintenant, cela semble être un cas classique de sur-ajustement ici. Cependant, un sur-ajustement ici est peu susceptible d'être causé par un nombre disproportionné de fonctionnalités par rapport aux échantillons (32 fonctionnalités, 900 échantillons). J'ai essayé un certain nombre de choses pour atténuer ce problème:

  • J'ai essayé d'utiliser la réduction de dimensionnalité (PCA) au cas où c'est parce que j'ai trop de fonctionnalités pour le nombre d'échantillons, mais les scores de précision et le tracé de la courbe d'apprentissage sont les mêmes que ci-dessus. À moins que je ne fixe le nombre de composants à moins de 10, à quel moment la précision du train commence à chuter, mais n'est-ce pas quelque peu attendu étant donné que vous commencez à perdre des informations?
  • J'ai essayé de normaliser et de normaliser les données. La standardisation (SD = 1) ne change rien au train ou aux scores de précision. La normalisation (0-1) réduit ma précision d'entraînement à 0,6.
  • J'ai essayé une variété de paramètres C et gamma pour SVC, mais ils ne changent pas non plus le score
  • Essayé en utilisant d'autres estimateurs comme GaussianNB, même des méthodes d'ensemble comme adaboost. Pas de changement
  • J'ai essayé de définir explicitement une méthode de régularisation à l'aide de linearSVC mais n'a pas amélioré la situation
  • J'ai essayé d'exécuter les mêmes fonctionnalités via un réseau de neurones à l'aide de Theano et la précision de mon train est d'environ 0,6, le test est d'environ 0,5

Je suis heureux de continuer à penser au problème, mais à ce stade, je cherche un coup de pouce dans la bonne direction. Où pourrait être mon problème et que pourrais-je faire pour le résoudre?

Il est tout à fait possible que mon ensemble de fonctionnalités ne fasse tout simplement pas de distinction entre les 2 catégories, mais j'aimerais essayer d'autres options avant de sauter à cette conclusion. De plus, si mes fonctionnalités ne font pas de distinction, cela expliquerait les faibles scores de l'ensemble de tests, mais comment obtenir un score parfait de l'ensemble d'entraînement dans ce cas? Est-ce possible?

Simon
la source
1
À quoi ressemblaient les données en 2 ou 3 dimensions après avoir appliqué l'ACP, y avait-il des grappes visibles? Quels exemples sont mal classés, y a-t-il un modèle?
image_doctor
À quoi ressemblent les spectres de puissance des traces? si vous tracez les spectres moyens pour chaque classe, sont-ils différents, si oui, comment et pouvez-vous optimiser un classificateur pour capturer cette différence?
image_doctor
1) Pouvez-vous nous montrer le graphique du cluster PCA?, 2) Avez-vous essayé des arbres de décision? Si les caractéristiques originales sont quelque peu contrôlables par l'homme, vous pourrez peut-être comprendre où cela va mal. Sinon (sauf un bug idiot de votre part), il semblerait que vos fonctionnalités ne soient tout simplement pas suffisamment discriminantes.
lollercoaster
Il est très possible que les données EEG ne soient pas séparables, mais avez-vous inspecté les ensembles de test de formation v pour vous assurer qu'ils ne sont pas biaisés (par exemple, l'un n'a que des exemples positifs ou est normalisé différemment)?
jamesmf
1
Pouvez-vous publier les données quelque part? Soit "allData" ou "features_all" (sans normalisation et PCA).
stmax

Réponses:

1

Pour voir si SVM peut capturer un signal, essayez d'équilibrer vos données: créez des ensembles de formation et de test qui se composent d'exactement 50% d'échantillons positifs et 50% négatifs (c'est-à-dire en sous-échantillonnant au hasard à partir de celui qui est le plus grand). Standardisez également les données (soustrayez la moyenne et divisez par l'écart-type).

(Pour l'équilibrage, vous pouvez essayer de changer le paramètre class_weight dans sklearn, mais nous avons trouvé que la méthode manuelle (sous-échantillonnage) fonctionnait mieux.)

Valentas
la source