3 onmisbare Python functies voor data preprocessing

3 Pyhton Tips Preprocessing data

1 – Wat is data preprocessing?

Het voorbereiden van data op algritmes en modellen

“Machine learning bestaat voor 80% uit data preprocessing en voor 20% uit modellen trainen”

Voordat je een data science model (lees: machine learning) kan toepassen, moet je eerst jouw data voorbereiden. Gelukkig zijn er een aantal handige Python functies die de standaard handelingen een stuk makkelijker maken. Hier vind je drie handige Python tips voor de belangrijkste preprocessing stappen.


2 – Python functies voor data preprocessing

2.1 – Missende waardes (NaN) in je dataset aanvullen

Je dataset is haast nooit compleet. Als een veld niet gevuld is, krijgt het de waarde NaN. Dit betekent NotANumber en geeft aan dat een numeriek veld leeg is.

nan missing values python
Missende (numerieke) waarden worden weergegeven met NaN

Check daarom altijd hoeveel waarden elke kolom bevat.

Dat doe je eenvoudig met:

df.isna().sum()

Uitleg: df is de naam van het dataframe. Gebruik je een andere naam voor je dataset, vervang df dan door die desbetreffende naam.

Missende waardes kunnen je analyse of model aardig in de war schoppen. Toch is een hele rij weggooien ook zonde. Gelukkig zijn er slimme methodes om missende waardes aan te vullen.

SimpleImputer van (wederom) sklearn is een veel gebruikte functie:

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(fill_value=np.nan, strategy='mean')
X = imputer.fit_transform(df)

Uitleg: In de eerste regel importeer je de functie, waarna je in regel 2 een strategie bepaald. In dit geval is gekozen voor ‘mean’, wat betekent dat je de missende waardes aanvult door het gemiddelde van de kolom. Je kan ook kiezen voor de mediaan, de meest voorkomende waarde of een zelf gekozen waarde.

Meer over deze functies lees je hier: https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html

De laatste regel van dit script geeft aan dat het dataframe genaamd ‘df’ getransformeerd moet worden. De uitkomst ‘X’ is standaard een Numpy array en klaar voor gebruik in een model.

Wil je van X weer een dataframe maken voor verder analyse? Gebruik dan de volgende code:

X = pd.DataFrame(X, columns=df.columns)
print(X)

Let op: Heeft je dataframe een andere naam dan df, pas deze dan aan de scripts.

Wil je missende waardes weggooien in plaats van vervangen? Dan kun je eenvoudig een nieuw dataframe maken door middel van:

df_compleet = df.dropna()

Uitleg: df_compleet bevat alle waarden van dataframe ‘df’, maar de rijen met lege waarden zijn gedropt, oftewel weggelaten. Gebruik vervolgens het nieuwe dataframe in je verder analyse.


2.2 – Velden met categorieën of tekst omzetten naar numerieke velden

Datasets bevatten vaak kolommen met categorieën. Voor veel algoritmes is het noodzakelijk dat hier numerieke velden van gemaakt worden. Deze handeling heet OneHotEncoding.

Voorbeeld dataset (df):

KostenLand
1500Nederland
2000Belgie
1895Nederland

Dat kun je op de volgende manier doen met Pandas:

df = pd.get_dummies(data=df)

Uitleg: De Pandas functie get_dummies zet alle velden om in nulletjes en eentjes. Vervolgens wordt het dataframe (df) overschreven met deze nieuwe waarden.

Het resultaat is dan:

KostenLand_NederlandLand_Belgie
150010
200001
189510

Let op: Heb je een kolom met bijvoorbeeld 50 categorieën, dan maakt deze functie ook 50 nieuwe velden aan. Bepaal daarom van te voren of het handig is om OneHotEncoder toe te passen!

OneHotEncoder Python
Een voorbeeld waarbij drie tekst-kolommen omgezet zijn naar numerieke waarden dankzij OneHotEncoder. Herken jij ze?

Extra tip: Label Encoding

Een andere manier om categorieën om te zetten naar aantallen is Label Encoding. Deze functie heeft als resultaat dat Nederland omgezet wordt naar waarde ‘1’, België naar ‘2’ enzovoorts. Het voordeel is dat er dan geen extra kolommen aangemaakt worden. Helaas heeft deze methode als nadeel dat er niet mee te rekenen valt, aangezien de waardes niet in verhouding van elkaar zijn.


2.3 – Data splitsen in een training-set en een test-set

Voordat je data aan een algoritme gaat voeren, is het slim om een data-split te maken. Deze vorm van data-preprocessing is noodzakelijk voor machine learning.

data split x y train test
Een data-split waarbij de data wordt opgedeeld in vier subsets.

Je deelt de data dan op in twee delen:

Training data waarmee het model getraind wordt

Test data om het getrainde model te testen

Meestal is de verhouding 80% trainingsdata en 20% testdata. Om deze split te maken kun je gebruik maken van een functie uit SciKit Learn (sklearn).

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

Uitleg: Van te voren moet je de X en de y hebben bepaald. De X bevat alle kolommen van onafhankelijke variabelen en de y is de target variabele; De variabele die je wil voorspellen.

Test_size = 0.2 bepaalt de grootte van de testdata-set. In dit geval dus 20% van de gehele data.

Achter test_size kan je nog meer input meegeven aan de split, door simpelweg een komma te plaatsen en een extra parameters in te voeren. Alle parameters vind je hier: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Gebruik vervolgens X_train en y_train bij het trainen van je model. Veel algoritmes vragen bij voorhand al om een test- en train-set


3 – Wanneer pas je Data Preprocessing toe?

De bovenstaande functies pas je toe in de data preparation stap van het CRISP-DM proces. Data preparation bestaat o.a. uit:

  • Data selection
  • Data cleaning
  • Data formatting
  • Feature Engineering
  • Data transformation

Kort samengevat moet je dus eerst de data kiezen en op orde maken. Vervolgens kies je welke velden je wilt gebruiken voor het beoogde model. De laatste stap is het passend maken van de data aan het gewenste systeem of algoritme. Hierna kan het model worden ontwikkeld en getraind.

De eerste twee tips van deze post hebben betrekking op de eerste stap; Het op orde maken van je data.

De derde tip gebruik in het laatste stadium van de data preparation. Het maken van een datasplit doe je als de data helemaal klaar is voor gebruik.

Meer Python tips?

Lees al mijn Python-posts en tutorials hier!