We zagen in de vorige sectie dat modellen uitdrukken hoe data tot stand komt doorheen een verzameling van wiskundige functies met twee soorten functie-argumenten:
gekende waarden van inputvariabelen
onbekende parameters
Die twee types staan nooit los van elkaar. Parameters hebben altijd betrekking op één of meerdere inputvariabelen.
Het linken van parameters aan inputvariabelen gebeurt via features. Deze geven een numerieke uitdrukking aan één of meerdere inputvariabelen zodat ze wiskundig aan de overeenkomstige modelparameter(s) kunnen worden gekoppeld.
+-------------------+ +-------------------+ +----------------------+
| Inputvariabele | ---> | Feature | ---> | Modelparameter |
+-------------------+ +-------------------+ +----------------------+
(bv. tijd, locatie, ...) (numerieke waarde) (numeriek patroon)Feature engineering¶
Het proces waarbij we de link leggen tussen model parameters en de data aan de hand van features noemen we feature engineering. Wanneer we zelf op maat modellen uitwerken voor bepaalde patroonherkenning, gaan we soms heel veel tijd in dit proces steken. Er zijn vaak verschillende keuzes die gemaakt kunnen worden over hoe we precies bepaalde informatie in de data projecteren op de parameters via de features. Die keuzes kunnen bepalend zijn voor de mogelijkheid om bepaalde patronen te leren.
Source
import random
import time
random.seed(42)# Create a sample of epochs
current_epoch = int(time.time())
sample_epochs = [
current_epoch - random.randint(30 * 24 * 3600, 6 * 30 * 24 * 3600) for _ in range(10)
]
sample_epochs[1743678853,
1752538829,
1753987044,
1741965502,
1749792428,
1750298051,
1750661800,
1752065597,
1742050718,
1752687071]from datetime import datetime
import pandas as pd
def get_season(dt):
"""
Determine the season for a given datetime object.
Args:
dt (datetime): The datetime object to evaluate.
Returns
-------
str: The season ("spring", "summer", "autumn", or "winter").
"""
Y = dt.year
if dt >= datetime(Y, 3, 21) and dt < datetime(Y, 6, 21):
return "spring"
elif dt >= datetime(Y, 6, 21) and dt < datetime(Y, 9, 23):
return "summer"
elif dt >= datetime(Y, 9, 23) and dt < datetime(Y, 12, 21):
return "autumn"
else:
return "winter"
df = pd.DataFrame({"epoch": sample_epochs})
df["datetime"] = pd.to_datetime(df["epoch"], unit="s")
df["season"] = df["datetime"].apply(get_season)
dffrom sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(categories=[["winter", "spring", "summer", "autumn"]], sparse_output=False)
season_encoded = encoder.fit_transform(df[["season"]])
season_columns = [f"season_{cat}" for cat in encoder.categories_[0]]
season_dummies = pd.DataFrame(season_encoded, columns=season_columns, index=df.index)
df = pd.concat([df, season_dummies], axis=1)
df
Meetschaal¶
De keuzes bij feature engineering worden in de eerste plaats bepaald door de meetschaal van de inputvariabelen:
Nominaal: De informatie laat toe om items in bepaalde categorieën te plaatsen (bv. “fruit” “groente” “vlees” “rond” “vierkant” )
Ordinaal: De informatie laat toe om items te ordenen (bv. “small” “medium” “large”)
Interval: De informatie laat toe om de afstand tussen items te bepalen (bv. )
Ratio: De informatie laat toe om de verhoudingen tussen items te bepalen (bv. )
(On)volledigheid¶
De data zijn in veel gevallen onvolledig (met verschillende gradaties per inputvariabele) en er moet dus bij feature engineering nagedacht worden over hoe om te gaan met missing data:
Niet: Sommige modellen kunnen perfect om met voorbeelden (denk: rijen) waar één of meerdere feature-waarden ontbreken
Verwijderen: Als er genoeg andere voorbeelden zijn kan het baten om onvolledige rijen in de feature matrix simpelweg te verwijderen
Imputation: Hierbij gaan we ontbrekende feature waarden volgens een bepaalde strategie invullen.
Missing value imputation¶
Wanneer missingness systematisch optreedt, draagt het bij tot ongebalanceerdheid van de trainingsdata en neemt het risico op bias in de model outputs toe. Er bestaan verschillende strategieën om ontbrekende waarden in te vullen (random, interpolatie, gemiddeldes, enz.). Er bestaan zelfs model-gebaseerde strategieën.