Anomaly heet 'outlier' op de uitstekend bruikbare scikit (sklearn) site. Aardig om hiervoor eens even terug te vallen op de eerdere oefeningen met de Titanic dataset van Kaggle. Het leren of iemand kans had om de ramp overleven wordt mogelijk negatief beïnvloed door 'bijzondere uitzonderingen': De 'outliers'. In principe maakt scikit het eenvoudig. Met de support vector machine (svm) module 'OneClassSVM' en het instellen van enkele parameters daarbij kan al snel een selectie outliers worden gevonden. Het blijkt echter lastig te beoordelen waarom het outliers zijn. Een van de redenen is, denk ik, dat ik mijn data opschoning niet goed voor elkaar heb. Gelukkig heeft scikit 'preprocessing' daar wat oplossingen voor.
Zelf had ik al een functie gemaakt (isnum(x)) om een heleboel soorten 'foutief geschreven' getallen uit een tekstbestand om te zetten naar nummers. "2.021,53" wordt dan bijvoorbeeld keurig naar het juiste nummer vertaald. Daarin heb ik echter lege waardes voorlopig op 0 gezet. Voor een 'outlier detectie' wellicht niet zo handig. In Python en Numpy wordt 'NaN' gebruikt om lege waardes aan te geven. Dat dus eerst eens aangepast. Scikit heeft dan een mooie functie (Imputer) om de NaN om te zetten naar een gemiddelde waarde. Voor de Titanic dataset gaat het dan vooral om de leeftijd die niet altijd is ingevuld.
Ook blijkt dat mijn eigen geschreven programmacode niet geheel (meer?) doet wat ik voor ogen had. De getallen zouden allemaal tussen 0 en 1 moeten geschaald worden. Het lukt mij niet direct om dat zelf voor elkaar te krijgen. De benodigde 'max' functie lijkt steeds de verkeerde waarde terug te geven. Gelukkig ook een mooie aanleiding om ook hiervoor een scikit functie uit te testen: De MinMaxScaler() doet dit 'zonder moeite'.
Eindelijke krijg ik nu een aardig 'outlier resultaat'. Met wat parameter aanpassingen selecteert hij 11 outlier records. (van de 750). Nog niet elk record lijkt even logisch maar ja, als je de computer hier al niet op kan vertrouwen :-)
Nu eens kijken of de code zo kan worden aangepast dat de outliers uit het leer gedeelte verdwijnen. En uiteraard of dat dan tot betere resultaten leidt.
Oh ja, 'Outlier detection' is onderdeel van 'unsupervised learning' . Mijn 'eerste'. :-)
Geen opmerkingen:
Een reactie posten