sklearn - problema di overfitting


8

Sto cercando consigli sul modo migliore per affrontare il mio attuale problema di apprendimento automatico

Lo schema del problema e quello che ho fatto è il seguente:

  • Ho oltre 900 prove di dati EEG, in cui ogni prova dura 1 secondo. La verità fondamentale è nota per ciascuno e classifica lo stato 0 e lo stato 1 (divisione 40-60%)
  • Ogni processo passa attraverso la preelaborazione in cui filtrare ed estrarre la potenza di determinate bande di frequenza, e queste costituiscono un insieme di funzionalità (matrice di caratteristiche: 913x32)
  • Quindi uso sklearn per addestrare il modello. cross_validation viene utilizzato dove utilizzo una dimensione di prova di 0,2. Il classificatore è impostato su SVC con kernel rbf, C = 1, gamma = 1 (ho provato un numero di valori diversi)

Puoi trovare una versione abbreviata del codice qui: http://pastebin.com/Xu13ciL4

I miei problemi:

  • Quando uso il classificatore per prevedere le etichette per il mio set di test, ogni previsione è 0
  • la precisione del treno è 1, mentre la precisione del set di prova è di circa 0,56
  • il mio diagramma della curva di apprendimento è simile al seguente:

inserisci qui la descrizione dell'immagine

Ora, questo sembra un classico caso di overfitting qui. Tuttavia, è improbabile che il sovradimensionamento sia causato da un numero sproporzionato di funzioni per i campioni (32 caratteristiche, 900 campioni). Ho provato una serie di cose per alleviare questo problema:

  • Ho provato a usare la riduzione della dimensionalità (PCA) nel caso in cui ho troppe funzioni per il numero di campioni, ma i punteggi di precisione e il diagramma della curva di apprendimento sembrano gli stessi di cui sopra. A meno che non imposti il ​​numero di componenti su un valore inferiore a 10, a quel punto la precisione del treno inizia a diminuire, ma questo non è in qualche modo previsto dato che stai iniziando a perdere informazioni?
  • Ho provato a normalizzare e standardizzare i dati. La standardizzazione (SD = 1) non fa nulla per cambiare i punteggi di treno o precisione. La normalizzazione (0-1) riduce la precisione del mio allenamento a 0,6.
  • Ho provato una varietà di impostazioni C e gamma per SVC, ma non cambiano nessuno dei due punteggi
  • Ho provato ad usare altri stimatori come GaussianNB, persino metodi ensemble come adaboost. Nessun cambiamento
  • Ho provato a impostare in modo esplicito un metodo di regolarizzazione usando linearSVC ma non ha migliorato la situazione
  • Ho provato a utilizzare le stesse funzionalità attraverso una rete neurale usando theano e la precisione del mio treno è di circa 0,6, il test è di circa 0,5

Sono felice di continuare a pensare al problema, ma a questo punto sto cercando una spinta nella giusta direzione. Dove potrebbe essere il mio problema e cosa posso fare per risolverlo?

È del tutto possibile che il mio set di funzionalità non distingua tra le 2 categorie, ma vorrei provare alcune altre opzioni prima di saltare a questa conclusione. Inoltre, se le mie caratteristiche non si distinguono, ciò spiegherebbe i punteggi bassi del set di test, ma come ottenere un punteggio del set di allenamento perfetto in quel caso? È possibile?


1
Che aspetto avevano i dati in 2 o 3 dimensioni dopo aver applicato la PCA, c'erano dei cluster evidenti? Quali esempi vengono classificati erroneamente, esiste un modello?
image_doctor,

Che aspetto hanno gli spettri di potenza delle tracce? se traccia gli spettri medi per ogni classe, sembrano diversi, in tal caso come e come puoi ottimizzare un classificatore per catturare quella differenza?
image_doctor,

1) Puoi mostrarci la trama del cluster PCA ?, 2) Hai provato gli alberi delle decisioni? Se le funzionalità originali sono in qualche modo controllabili dall'uomo, potresti essere in grado di capire dove sta andando storto. Altrimenti (escludendo alcuni stupidi bug da parte tua) sembrerebbe che le tue funzionalità non siano abbastanza discriminatorie.
montagne russe il

È molto probabile che i dati EEG non siano separabili, ma hai ispezionato i set di test training v per assicurarti che non siano distorti (ad esempio uno ha solo esempi positivi o è normalizzato in modo diverso)?
jamesmf,

1
Puoi pubblicare i dati da qualche parte? "AllData" o "features_all" (senza normalizzazione e PCA).
stmax

Risposte:


1

Per vedere se SVM è in grado di catturare qualsiasi segnale, prova a bilanciare i tuoi dati: crea set di training e test che consistono esattamente in campioni positivi al 50% e negativi al 50% (cioè, campionando casualmente da quello che è più grande). Anche standardizzare i dati (sottrarre la media e dividere per deviazione standard).

(Per il bilanciamento, potresti provare a cambiare il parametro class_weight in sklearn, ma abbiamo trovato che il metodo manuale (sottocampionamento) funziona meglio.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.