Goed, nu de praktijk. Het ophalen van de data gaat vrij snel. Heel wat beter dan de gigabytes uit de vorige challenge. Ik maak een programma om de kolomvariabelen te analyseren. Dat geeft bijvoorbeeld de volgende resultaten:
kolom = 17, aantal = 8149, nonzero = 11749 , nonzero disat = 441 classif: -
kolom = 17 skip: - max: 47598, min: 0, mean: 140 Log: log
kolom = 18, aantal = 66, nonzero = 96 , nonzero disat = 9 classif: -
kolom = 18 skip: skip max: 105000, min: 0, mean: 5 Log: log
kolom = 19, aantal = 2, nonzero = 871 , nonzero disat = 37 classif: class
kolom = 19 skip: - max: 1, min: 0, mean: 0 Log: log
kolom = 20, aantal = 2, nonzero = 286 , nonzero disat = 20 classif: class
kolom = 20 skip: - max: 1, min: 0, mean: 0 Log: log
kolom = 21, aantal = 1, nonzero = 0 , nonzero disat = 0 classif: -
kolom = 21 skip: skip max: 0, min: 0, mean: 0 Log: -
kolom = 22, aantal = 1, nonzero = 0 , nonzero disat = 0 classif: -
kolom = 22 skip: skip max: 0, min: 0, mean: 0 Log: -
Het 'aantal' geeft het aantal verschillende waardes op. Hiermee bepaal ik later of ik denk dat het classificatiewaardes gaan worden.
Daarnaast druk ik het aantal waardes <> nul af en dezelfde waarde maar nu voor de ~ 4% ontevreden klanten.
Ook de maximale, minimale en gemiddelde waarde druk ik af.
Om mijn selectie te controleren voeg ik 3 'boolean-waardes' toe:
- classif: Als ik denk dat het een classifier variabele is
- skip: Als ik denk dat de kolom geen bijdrage biedt en dus overgeslagen kan worden.
- log: Als ik denk dat het beter is om de 'lineaire kolommen' naar logaritmisch om te zetten omdat er te veel uitschieters in zitten. (En dus de variatie rond het gemiddelde in weg kan vallen.)
Ik besluit de kolommen te skippen als er minder dan 50% van de waardes gevuld zijn en van de 'ontevreden klanten' minder dan 11. Is wat arbitrair maar scheelt 205 kolommen van de 369!!!
Ik besluit dat kolommen met meer dan 100 verschillende waarden 'lineaire kolommen' zijn. De anderen zijn dus classificatie kolommen. Dit resulteert in 117 classificatiekolommen en 47 lineaire kolommen.
Daarnaast kijk ik of bij de lineaire kolommen het maximum meer dan 10 x groter is dan het gemiddelde. In die gevallen zet ik ze om naar een logaritmische verdeling. Uiteindelijk blijkt dat bij deze instelling voor alle lineaire kolommen van toepassing te zijn.
De classificatie kolommen worden omgezet naar aparte kolommen per klasse hetgeen uiteindelijk 2147 kolommen oplevert. Oeps, wel heel veel. Maar daar kijken we later nog wel naar. In elke kolom staat een 1 of een 0 indien de betreffende klasse voor de klant geldig is.
Na de logaritmische bewerking worden alle lineaire kolommen terug gebracht naar een waarde tussen 0 en 1. Daar waar er negatieve getallen zijn worden ze opgeschaald zodat alles toch tussen 0 en 1 blijft. Ik voeg een test toe of mijn data aan de voorwaarden voldoet. (Geen nan / inf / tussen 0 en 1) Dat zou ik eigelijk in een bibliotheek moeten plaatsen voor algemeen gebruik.
In eerste instantie zijn er nog veel fouten met -nan waarden of -inf waarden in de kolommen. Ik moet corrigeren dat het logaritmische resultaat van een waarde tussen 0 en 1 een negatieve waarde is. Ook worstel ik enige tijd met een numpy array dat niet goed geinitialiseerd is. Ik moet mij toch weer aanleren om de programma's niet vanuit de Python schil te starten maar rechtstreeks vanuit de terminal. Daardoor blijven variabelen en dus ook arrays niet 'onthouden'.
De data lijkt nu in orde. Ik heb 2 arrays opgeslagen. 1 van 76020 x 2194 (de X) en 1 met de targets van 76020 (de y). Daarmee kan ik trainen! Ik besef mij dat ik wel dezelfde bewerking moet doen op de test data. Dat is niet zomaar eenvoudig vervangen omdat ik daar, uiteraard, de target data niet heb. Ik denk dat ik deze gelijk moet bewerken tijdens de train data. Ik hoop dat het geheugen dat aankan. Tevens moet ik controleren of de classificatiedata overeenkomt tussen de train en de test dataset.