zondag 3 januari 2016

MRI - 10 - Metadata learning

Ik had mij voorgenomen om deze dagen een eerste inzending te doen voor Kaggle. Gewoon om het al eens te proberen heb ik een NN gebouwd op basis van de (beperkte) meta-data: Geslacht / Leeftijd en afstand tussen de grootste en kleinste 'SliceLocation'. Meer bruikbaars zit er volgens mij niet bij. Het kost mij relatief veel moeite om de data op de juiste wijze beschikbaar te krijgen. Daar wreekt zich nog het gebrek aan routine. Een rare 'bug' zorgt ervoor dat de csv tussenbestanden niet volledig aangemaakt zijn. Ik kom er niet achter waarom maar uiteindelijk lijkt zo volledig als gewenst. Een 'geleende' functie checkt of er 30 afbeeldingen per slice beschikbaar zijn. Hierdoor vallen er enkele 'rare studies' uit. Voor het NN moet ik deze studies dan ook uiteraard uit de resultaten houden. In plaats van het Python 'set' commando ontdek ik hiervoor numpy 'unique'. Uiteindelijk lukt het om ze gelijkt te krijgen. Eerst maar eens kijken wat het systeem aan resultaten berekend. Ik geef aan dat het een regressie berekening moet worden met 2 outputs; systole en diastole.


Het valt, zoals te verwachten, een beetje tegen. Ik bereken het gemiddelde van de absolute afwijking van werkelijk en berekend en deel dat door het gemiddelde van de werkelijke waarden. Afhankelijk van de train en test dataset (die voor het gebeuren steeds geshuffeld wordt) krijg ik een uitslag van tussen de 20 en 50 % afwijking. Dat is best veel! Maar ik kan nog sleutelen aan de 'leerparameters'.


print np.mean(np.abs(Y_p[:,0] - net1.predict(X_p)[0][0]))/np.mean(Y_p[:,0]), np.mean(np.abs(Y_p[:,1] - net1.predict(X_p)[0][1]))/np.mean(Y_p[:,1])
 
Eerst maar eens de zaak ombouwen naar de werkelijk gewenste output. Als ik systole en diastole combineer maakt dat een NN met 1200 outputwaarden. Voor systole van 0 tot 600 ml en idem voor diastole. De waarden kleiner dan de werkelijke meetwaarden zet ik op nul en groter of gelijk zet ik op 1. Het levert al een aardig resultaat op. Ik had echter niet op waarden kleiner dan 0 gerekend en groter dan 1. Dat moet ik er iig nog uithalen. Tevens lopen de waarden niet steeds netjes op zoals in het voorbeeld. Ik weet nog niet hoe ik dat kan bereiken. Helaas dus vandaag nog geen 'submission'.

Een klein stukje van 1 van de resultaten: De afdruk is in stappen van 10:

Systole             Diastole  
0   0.0 -0.0113143 600 0.0 -0.0252197
10  0.0 0.0112925  610 0.0 -0.0263309
20  0.0 0.0354233  620 0.0 0.00522101
30  0.0 0.0806117  630 0.0 0.0127949
40  0.0 0.137841   640 0.0 0.00438075
50  0.0 0.295932   650 0.0 0.0731391
60  0.0 0.449993   660 0.0 0.00388365
70  0.0 0.519898   670 0.0 0.0445892
80  0.0 0.642001   680 0.0 0.0420143
90  0.0 0.700991   690 0.0 0.020834
100 0.0 0.828821   700 0.0 0.0778824
110 0.0 0.851698   710 0.0 0.0938411
120 0.0 0.823128   720 0.0 0.138827
130 0.0 0.912681   730 0.0 0.187268
140 1.0 0.881562   740 0.0 0.293074
150 1.0 0.897865   750 0.0 0.344319
160 1.0 0.922746   760 0.0 0.450661
170 1.0 0.88392    770 0.0 0.498002
180 1.0 0.911497   780 0.0 0.601924
190 1.0 0.992637   790 0.0 0.675375
200 1.0 0.918939   800 0.0 0.729967
210 1.0 0.931633   810 0.0 0.786691
220 1.0 0.96865    820 0.0 0.803362
230 1.0 0.962865   830 0.0 0.818551
240 1.0 0.930199   840 0.0 0.825329
250 1.0 1.00748    850 0.0 0.882776
260 1.0 0.942028   860 0.0 0.890886
270 1.0 0.961585   870 0.0 0.901568
280 1.0 0.978487   880 1.0 0.891294
290 1.0 0.959952   890 1.0 0.941661
300 1.0 0.952507   900 1.0 0.897842
310 1.0 0.961548   910 1.0 0.915683

Geen opmerkingen:

Een reactie posten