Als we een gegevensreeks krijgen, willen we die vaak gebruiken om voorspellingen te doen over wat er in de toekomst zal gebeuren. De informatie die we hebben noemen we "x" en de uitkomst waar we om geven "y". Eén manier om dit te doen is met een lineaire regressie, om de relatie tussen de twee vast te stellen. De relatie tussen de x en de y in onze gegevens is echter vaak niet-lineair. Een manier om dit probleem op te lossen is door de x-waarden zo aan te passen dat de relatie lineair wordt. Dit wordt een transformatie genoemd. Spline transformaties zijn een type transformatie. In dit artikel bekijken we hoe ze werken en hoe ze te gebruiken.
In een typische kleinste-kwadraten regressie passen we een lijn op onze gegevens door de som van de gekwadrateerde fouten tussen de lijn en onze gegevens te minimaliseren. Laten we de volgende gegevens genereren;
y = log(x) + sin(x/7)
In het onderstaande voorbeeld hebben we een lijn gepast op onze gegevens (met wat toegevoegde ruis).
De fit van de lijn wordt bepaald door de vergelijking:
Y = intercept + (coëfficiënt * x)
De fouten zijn de stippellijnen, die we proberen te minimaliseren. Het is duidelijk dat dit niet erg goed werkt, onze lijn volgt de gegevens niet goed, omdat onze gegevens niet lineair zijn.
B-splines kunnen worden gezien als een manier om onze gegevens op te splitsen in kleinere secties, zodat we een lijn kunnen passen op elke afzonderlijke sectie. Bovendien kunnen we hiermee ook een kromme in plaats van een lijn in onze gegevens passen, terwijl we nog steeds een lineair model gebruiken.
Dit maakt waarschijnlijk niet veel duidelijker wat ze zijn, maar wikipedia doet het zeker niet beter;
"Een B-spline of basisspline is een spline functie die minimale ondersteuning heeft met betrekking tot een gegeven graad, gladheid en domeinverdeling. Elke spline functie van een gegeven graad kan uitgedrukt worden als een lineaire combinatie van B-splines van die graad. Kardinale B-splines hebben knopen die op gelijke afstand van elkaar liggen."
Laten we in plaats daarvan een voorbeeld bekijken. De beginwaarden van x (in ons voorbeeld hierboven) variëren van 1-100. We zullen deze enkele lijst van x transformeren. We zullen deze enkele lijst van x-waarden omzetten in 3 afzonderlijke lijsten van 100 waarden met behulp van een spline-functie. De resulterende waarden liggen allemaal tussen 0 en 1. We kunnen onze splines plotten op onze oorspronkelijke x-as;
Elke spline piekt op een ander punt. Wanneer spline1 hoog is, is spline3 laag enz. De splines sommeren ook tot 1 op elk gegeven punt. Als we nu proberen een lineair model te passen op onze gegevens, met de splines als onze x-waarden, krijgen we dit;
Het is misschien moeilijk om het verschil te zien, maar bij de x-waarde van 50 is er een knik in de lijn. Deze keer ziet onze vergelijking er als volgt uit;
Y = intercept + (coëfficiënt1 * spline1) + (coëfficiënt2 * spline2) + (coëfficiënt3 * spline3)
Wat er in feite gebeurt is dat we voor verschillende waarden van x verschillende sets coëfficiënten gebruiken. Als x lager is dan 50 gebruiken we splines 1 en 2, omdat de waarde van spline 3 nul is. Als x groter is dan 50 gebruiken we splines 2 en 3. Hierdoor kunnen we niet-lineaire gegevens fitten met een lineair model.
Het aantal bochten in de lijn wordt knopen genoemd. In het bovenstaande voorbeeld hebben we 3 knopen gebruikt, omdat er ook een knoop aan het begin en het einde moet zitten. Om beter bij de gegevens te passen, gebruiken we gewoon meer knopen. Hieronder met 6 knopen;
Het is duidelijk dat we onze gegevens beginnen te kloppen. Wat er gebeurt, is dat we onze gegevens opdelen in brokken en voor elke brok een aparte lijn passen.
We passen nog steeds niet perfect bij de gegevens. Als we dat wel willen, moeten we krommen gebruiken. Dit kan worden bereikt door splines van graad 2 of hoger te gebruiken. Hier is een plot van enkele splines van graad 2;
Nu zijn de splines niet langer lineair, maar gebogen. Wat gebeurt er als we een lineair model toepassen?
De 'lijn' is niet langer recht, maar begint te buigen. De fit kan worden verbeterd door meer knopen en splines van een hogere graad te gebruiken;
Dat is het! We hebben gezien hoe splines ons in staat stellen om lineaire modellen te gebruiken voor niet-lineaire gegevens.
Er is nog steeds één probleem. Hoe meer knopen we gebruiken en hoe hoger de graad, hoe beter we bij de gegevens passen. Dit kan leiden tot een probleem - overpassen. Hier zijn dezelfde gegevens, maar met veel meer ruis;
Deze fit volgt de gegevens veel te nauwkeurig, we gebruiken te veel knopen en passen op elke kleine verandering in de gegevens. De meeste variatie in de gegevens is gewoon ruis en die willen we niet passen. Als we proberen te interpoleren, nemen we de ruis op in ons model, waardoor het minder nauwkeurig wordt. Om dit op te lossen zijn er 3 benaderingen;
Benadering 1 is eenvoudig, door het aantal knopen te beperken kunnen we de data niet overfitten;
Dit werkt goed als je je gegevens kunt visualiseren en gemakkelijk kunt zien of je aan het overfitten bent. In veel gevallen is dit echter niet mogelijk. Als de gegevens multidimensionaal zijn, kunnen ze niet worden uitgezet in een gemakkelijk leesbare grafiek.
Selectiecriteria zijn vergelijkingen voor de beoordeling van modellen (lees er hier meer over).
Benadering 3 maakt gebruik van regularisatie, die de complexiteit van het model beperkt door een straf te introduceren. De grafiek hieronder is van dezelfde gegevens, maar met meer ruis. Met behulp van splines met 50 knopen passen we twee modellen, een standaard lineaire regressie en een nokregressie. Het nokmodel maakt overfitting minder waarschijnlijk.
Ik hoop dat je hebt genoten van deze inleiding. Als je het interessant vindt om te zien hoe modellen werken, wil je misschien mijn blog over exponentieel afvlakken voor tijdreeksanalyse lezen.