donderdag 3 november 2016

14 - EEGs - In de herhaling

Bij gebrek aan succes met de chatbots maar ook gelukkig door hernieuwde interesse de uitdaging van de EEGs maar weer eens ter hand genomen. De eerdere keuzes waren vooral gebaseerd op een 'gu-feeling' met betrekking tot de data: Eerst de EEGs als grafiek aaneen convolutional netwerk aangeboden. Vervolgens de data sterk teruggebracht met behulp van histogrammen en daarna nogmaals door een verdeling over de 'hoeken' aan te bieden.

Niet veel success helaas. Nu wordt het tijd om eens echt aan feature selection te doen. Of te wel kijken of bepaalde features te vinden zijn die een sterke correlatie hebben met de uitkomst (seizure / non seizure).

Daarvoor moet ik eerst de oorspronkelijke data in 'ruwe vorm' beschikbaar hebben. Al eerder was gebleken dat het samenvoegen van alle data in 1 numpy bestand (zelfs per patient) een onmogelijke grote hoeveelheid data koppelde waar mijn arme pc-tje niet mee om kon gaan. Ik besluit dus maar een subset te gebruiken. Voor de feature selectie lijkt het mij wel handig als die subset een beetje in balans is. (~7 % was seizure). Eerst maar eens starten met 30 metingen met seizure en 30 zonder. Het gaat dan ook al om 60 * 16 * 240000 waarden! (60 metingen, 16 elektroden en 10 minuten metingen van 400Hz)

Ook hier duurt het weer even om de juiste uitkomst te krijgen. Met name het verschil tussen Python data en Numpy data geeft even verwarring. Ik selecteer ook gelijk de 'nul-metingen' uit. Daar waar 1 of meerdere elektroden (tijdelijk) geen data hebben geregistreerd.


Nu komt het 'leuke werk'. Het testen van verschillende features. Even zoeken brengt mij bij een mooie correlatie meting:


from scipy.stats import pearsonr

Deze geeft een getal terug tussen -1 en 1 van de, al dan niet positive, correlatie tussen twee datareeksen. Kijk, dat kan ik gebruiken.

Ik test over elke minuut een aantal kernwaarden: mean / max / min / std / var. Daar springen max en std ruim boven uit als significant. Vervolgens kijk ik of ik de correlatie op kan schroeven door gedeeltes van de metingen uit te sluiten. Als snel vind ik voor 'max' een grootste verbetering als ik alleen waarden > 150 neem en voor de standaard deviatie helpt het enorm als ik alleen waarden boven de 50 selecteer.

Hier het verloop over de tijdsintervallen (minuten voor de wel/niet seizure):

0 max150 (-0.2428839825773387, 2.3435010343051565e-14) std50 (-0.26096667600414636, 2.0685689963712831e-16)
1 max150 (-0.33598962813441019, 9.1784806826576722e-27) std50 (-0.29492897549479213, 1.0142709208333018e-20)
2 max150 (-0.33059302456077189, 6.4793485016530853e-26) std50 (-0.31674493430559891, 8.1837316741478994e-24)
3 max150 (-0.37319974507157977, 4.322841083800451e-33) std50 (-0.35271735656399611, 1.6702445216675265e-29)
4 max150 (-0.29885460039324757, 2.9427898839384232e-21) std50 (-0.28566093330688908, 1.7463025301619868e-19)
5 max150 (-0.36582553202669144, 9.0635043157077112e-32) std50 (-0.32981841489689517, 8.5501446927981418e-26)
6 max150 (-0.28622511275709217, 1.4729483647796412e-19) std50 (-0.31308744866968408, 2.8175041901043518e-23)
7 max150 (-0.30733197375896981, 1.9040684165552083e-22) std50 (-0.28822277817774439, 8.0362161083617587e-20)
8 max150 (-0.28951262407729206, 5.4203254023624537e-20) std50 (-0.24322110059100063, 2.1530382542027311e-14)

9 max150 (-0.3113887769925055, 4.9737967989126725e-23) std50 (-0.24830971694265835, 5.8962413007042606e-15)

Het eerste getal uit het duo geeft dus de correlatie aan en het 2e de waarschijnlijkheid om dit aan te treffen in een random dataset van een dergelijk formaat. Zie hier meer daarover.
Ok, daar kunnen we wellicht wat mee. Of misschien eerst kijken of er nog meer interessante correlaties te vinden zijn ...

Geen opmerkingen:

Een reactie posten