Ga naar hoofdinhoud

Spline-regressie: een praktische gids met Python & R

Een praktische gids voor spline-regressie, met uitleg over hoe stukgewijze polynomen en knopen niet-lineaire relaties modelleren, de belangrijkste splinetypen en hoe je ze in Python en R past.
Bijgewerkt 15 jun 2026  · 15 min lezen

Verkennen met AI

Openen in ChatGPTOpenen in ClaudeOpenen in Perplexity

Een rechte lijn passen op data die buigt is nooit een goed idee.

Lineaire regressie gaat ervan uit dat de relatie tussen je voorspellers en het doel een rechte lijn is. Helaas zijn de meeste relaties in de echte wereld dat niet. Denk aan de relatie tussen inkomen en uitgaven of tijd en groei: ze buigen, vlakken af, buigen opnieuw en veranderen van richting op manieren die je niet met één enkele helling kunt weergeven.

Spline-regressie pakt dit aan door de relatie te laten buigen waar dat nodig is, zonder een wilde, onbegrensde curve te passen. Het idee is om meerdere vloeiende polynomiale segmenten over het bereik van de voorspeller te passen en ze op specifieke punten te combineren.

In dit artikel leer je de kernconcepten achter spline-regressie, hoe knopen de flexibiliteit bepalen, de belangrijkste splinetypen en hoe je ze in de praktijk toepast.

Voordat je over splines leert, lees onze tutorial die je alles leert wat je moet weten over simpele lineaire regressie.

Wat is spline-regressie?

Spline-regressie is een regressietechniek die niet-lineaire relaties modelleert met stukgewijze polynomiale functies die samenkomen op specifieke punten, knopen genoemd.

In plaats van één vergelijking te maken om de volledige relatie te beschrijven, verdeelt spline-regressie het bereik van de voorspeller in kleinere stukken en past op elk stuk een aparte polynoom. Deze stukken komen samen bij de knopen, en beperkingen zorgen ervoor dat de overgangen vloeiend zijn.

Het eindresultaat zit ergens tussen twee uitersten in. Het is flexibeler dan lineaire regressie, die slechts één rechte lijn door je data kan trekken. En het is gestructureerder dan volledig onbegrensde niet-lineaire modellen zoals diepe neurale netwerken of kernel-methoden, die bijna alles kunnen passen maar je weinig vertellen over wat ze hebben gepast.

Om deze reden kom je splines zo vaak tegen in toegepaste statistiek.

Waarom spline-regressie nodig is

Echte data volgt bijna nooit een rechte lijn.

Lineaire regressie is het standaard startpunt voor het modelleren van relaties, maar kent een sterke aanname: het effect van een voorspeller op de uitkomst blijft constant over het hele bereik. Wanneer de werkelijke relatie buigt of van richting verandert, zal een rechte lijn onderfitten. Je krijgt fouten aan de uitersten en een model dat het patroon niet kan volgen.

De oplossing is een flexibeler model gebruiken. Polynomiale regressie met hoge graad is één optie: je voegt x^2, x^3, x^4-termen toe totdat de curve genoeg buigt om bij je data te passen. Maar polynomen worden instabiel aan de randen van de data doordat ze omhoog of omlaag uitslaan waar je weinig datapunten hebt. Dat gedrag heet het verschijnsel van Runge en maakt polynomen met hoge graad riskant voor voorspelling.

Spline-regressie zit tussen deze twee uitersten in.

Je krijgt lokale flexibiliteit waar de data buigt, zonder de globale instabiliteit van één polynoom met hoge graad. Elk segment is een polynoom met lage graad (meestal kubisch), zodat geen enkel deel zich onverwacht kan gedragen. En omdat de segmenten soepel aan elkaar worden gezet bij de knopen, oogt de totale curve nog steeds als één continue functie.

Kortom: een spline biedt genoeg flexibiliteit om complexe patronen te volgen en genoeg structuur om zich netjes te gedragen aan de uitersten.

Hoe spline-regressie werkt

Spline-regressie volgt altijd een eenvoudig driestappenplan.

  1. Verdeel het bereik van de voorspeller in regio's: Je kiest een set knopen langs de as van de voorspeller. Deze knopen splitsen het bereik in intervallen. Als je drie knopen plaatst, krijg je vier regio's. De knopen zijn de grenzen tussen segmenten.
  2. Pas binnen elke regio een polynoom: Binnen elk interval past het model een polynoom met lage graad. Elke regio krijgt zijn eigen polynoomcoëfficiënten, zodat de curve in verschillende delen van het bereik anders kan buigen. Een regio waar de relatie bijna vlak is, krijgt een bijna vlak polynoom. Een regio waar de relatie scherp buigt, krijgt een meer gebogen polynoom.
  3. Verbind de regio's: Het model dwingt continuïteitsvoorwaarden af bij elke knoop. De polynoomwaarden van beide kanten moeten op de knoop overeenkomen, zodat de curve geen sprongen maakt. Voor kubische splines moeten ook de eerste en tweede afgeleiden overeenkomen, wat betekent: geen scherpe hoeken en geen abrupte veranderingen in kromming.

Deze beperkingen geven splines het uiterlijk van één vloeiende curve die lokaal buigt maar continu door het hele bereik van de voorspeller stroomt. Visueel kun je niet zien waar de ene polynoom eindigt en de volgende begint.

De knopen, de polynoomgraad en de continuïteitsvoorwaarden definiëren samen de spline. Als je een van deze verandert, krijg je een ander soort spline met andere eigenschappen — precies waar de volgende secties op ingaan.

Wat zijn knopen in spline-regressie?

Knopen zijn de punten langs de as van de voorspeller waar het ene polynomiale segment eindigt en het volgende begint.

Je kunt ze zien als de scharnieren van de spline. Als je een knoop plaatst bij x = 5, past het model één polynoom voor waarden onder 5 en een ander polynoom voor waarden boven 5. De twee polynomen komen samen op de knoop, en de continuïteitsvoorwaarden zorgen dat ze soepel verbonden zijn. Als je meer knopen toevoegt, krijg je meer segmenten, wat betekent dat de curve op meer plekken kan buigen.

Daarom zijn knopen de belangrijkste hefboom om te bepalen hoe flexibel het model is.

Het aantal knopen bepaalt uit hoeveel afzonderlijke polynomiale stukken de spline bestaat. De locatie van de knopen bepaalt waar de curve van vorm mag veranderen. Een spline met twee knopen kan maar op een paar plekken buigen. Een spline met twintig knopen kan bijna elk datapunt volgen.

Dus het kiezen van het juiste aantal en de juiste plaatsing van knopen is de belangrijkste beslissing in spline-regressie.

Te weinig knopen

Als je te weinig knopen plaatst, heeft de spline niet genoeg segmenten om het daadwerkelijke patroon in de data te volgen. De curve blijft te star. Het gedraagt zich bijna als een polynoom met lage graad: in algemene zin flexibel, maar niet in staat lokale veranderingen vast te leggen.

Stel je voor dat je een spline met één knoop past op data met drie duidelijke fasen: een stijgende trend, een plateau en een daling. Met maar één knoop heeft de spline slechts twee segmenten om mee te werken. Hij kan de stijging en één van de andere fasen vastleggen, maar niet alle drie. Je eindigt met hetzelfde probleem als bij lineaire regressie: fouten waar de spline niet de vorm van de data kan volgen.

Te weinig knopen voorbeeld

Voorbeeld van te weinig knopen

Te weinig knopen leidt tot onderfitting. Het model is te glad om nuttig te zijn.

Te veel knopen

Het tegenovergestelde probleem is net zo erg. Als je te veel knopen plaatst, heeft de spline zoveel segmenten dat hij de ruis in de data begint te passen in plaats van het echte patroon. De curve kronkelt tussen elke observatie en jaagt op willekeurige variatie in plaats van de onderliggende trend.

Een spline met twintig knopen op een dataset van vijftig punten zal meer lijken op een "verbind-de-stippen"-tekening dan op een model. Hij past de trainingsdata bijna perfect, maar voorspellingen op nieuwe data zijn onbetrouwbaar. Kleine veranderingen in de input leiden tot grote, onvoorspelbare veranderingen in de output.

Te veel knopen voorbeeld

Voorbeeld van te veel knopen

Te veel knopen leidt tot overfitting. Het model is te flexibel om te generaliseren.

Je wilt genoeg knopen om de echte buigingen in de data te pakken, maar niet zoveel dat het model ruis gaat onthouden. In de volgende secties lees je hoe je die keuze in de praktijk maakt.

Typen splines

Splines zijn er in een paar varianten, en de keuze komt grotendeels neer op het soort polynoom dat je in elk segment gebruikt en welke beperkingen je op de curve legt.

Lineaire splines

Lineaire splines zijn de eenvoudigste versie. Elk segment is een rechte lijn en de segmenten sluiten op de knopen op elkaar aan.

Voorbeeld lineaire splines

Voorbeeld van lineaire splines

De continuïteitsvoorwaarde is hier losser, want de waarden van beide kanten moeten op de knoop overeenkomen, maar de hellingen mogen veranderen. Het resultaat lijkt op een reeks verbonden lijnsegmenten met hoeken bij elke knoop. Het is flexibel genoeg voor eenvoudige buigingen, maar de curve is soms niet vloeiend.

Lineaire splines werken goed als je alleen om de grote lijnen geeft en de visuele scherpte niet erg vindt. Ze zijn ook het gemakkelijkst te interpreteren omdat elk segment gewoon een lijn is met zijn eigen helling.

Kubische splines

Kubische splines zijn in de meeste toepassingen de standaardkeuze. Elk segment is een kubisch polynoom (graad 3) en de continuïteitsvoorwaarden zijn strenger dan bij lineaire splines.

Voorbeeld kubische splines

Voorbeeld van kubische splines

Bij elke knoop moeten drie voorwaarden gelden: de waarden komen overeen, de eerste afgeleiden komen overeen en de tweede afgeleiden komen overeen. Dat betekent: geen sprongen, geen hoeken en geen plotselinge veranderingen in kromming. De curve stroomt door de knopen zonder visuele aanwijzing waar de overgangen plaatsvinden.

Kubisch is de laagste polynoomgraad die soepele krommingsveranderingen toestaat. Daarom is het zo populair. Hogere graden voegen zelden nuttige flexibiliteit toe en maken het model alleen lastiger te beheersen.

Natuurlijke kubische splines

Natuurlijke kubische splines zijn een variant die extra beperkingen toevoegt aan de randen van de data.

Voorbeeld natuurlijke kubische splines

Voorbeeld van natuurlijke kubische splines

Het probleem met gewone kubische splines is dat ze zich vreemd kunnen gedragen aan de randen, vooral waar je weinig datapunten hebt. De meest linker en rechter segmenten zijn nog steeds kubische polynomen, en kubische polynomen kunnen snel omhoog of omlaag uitslaan bij extrapolatie.

Natuurlijke kubische splines omzeilen dit door de tweede afgeleide op beide grensknopen op nul te forceren. In de praktijk betekent dit dat de curve lineair wordt voorbij de buitenste knopen. Het extrapolatiegedrag is veel stabieler, wat natuurlijke kubische splines een betere keuze maakt wanneer je waarde hecht aan voorspellingen aan de randen van de data.

B-splines

B-splines (afkorting van basis-splines) zijn een andere manier om splines te construeren. In plaats van elk polynomiaal segment direct te definiëren, bouwen B-splines de spline als een gewogen som van basisfuncties.

Voorbeeld B-splines

Voorbeeld van B-splines

Elke basisfunctie is zelf een kleine spline die alleen in een beperkt gebied niet-nul is. De volledige spline is de som van deze basisfuncties, elk vermenigvuldigd met een coëfficiënt die de regressie schat.

B-splines zijn numeriek stabiel en gemakkelijk uit te breiden. De meeste moderne spline-implementaties in Python en R gebruiken B-spline-representaties, zelfs wanneer de interface voor de gebruiker eruitziet als een gewone spline. Als je ooit bs() in R hebt aangeroepen of SplineTransformer in scikit-learn hebt gebruikt, heb je met B-splines gewerkt.

Spline-regressie vs polynomiale regressie

Zowel polynomiale regressie als spline-regressie gaan om met niet-lineaire relaties, maar ze pakken het heel verschillend aan. Het verschil komt neer op hoe de curve wordt opgebouwd.

Polynomiale regressie

Polynomiale regressie past één globaal polynoom over het volledige bereik van de voorspeller. Je kiest een graad (2, 3, 5, 10) en het model vindt één set coëfficiënten die de fout over alle data minimaliseert. De curve heeft één vergelijking, en die beschrijft de relatie overal.

Dat klinkt netjes, maar heeft een probleem. Eén polynoom moet de fit over het hele bereik balanceren, dus wat in het ene gebied gebeurt, beïnvloedt wat in elk ander gebied gebeurt. Als je de graad verhoogt om een scherpe buiging in het midden van de data aan te kunnen, zul je zien dat de curve aan de randen begint te slingeren. Dit is het eerder genoemde verschijnsel van Runge: polynomen met hoge graad worden instabiel nabij de grenzen van de data.

Het andere probleem is dat polynomiale regressie geen begrip van localiteit heeft. Een piek bij x = 5 kan de vorm van de fit bij x = 50 veranderen, omdat elke observatie bijdraagt aan dezelfde globale vergelijking.

Spline-regressie

Spline-regressie splitst het bereik van de voorspeller in segmenten en past in elk segment een polynoom met lage graad. De polynomen worden soepel verbonden bij de knopen, maar elk is onafhankelijk in die zin dat de vorm vooral wordt bepaald door de data in zijn eigen regio.

Dit geeft je lokale flexibiliteit. Een regio met een scherpe buiging krijgt een meer gebogen polynoom. Een regio met een vlakke trend krijgt een bijna vlakke. En omdat elk segment van lage graad is (meestal kubisch), kan geen enkel deel zich vreemd gedragen aan de randen. Je krijgt een gladdere, stabielere fit, vooral nabij de randen van de data.

Vergelijking naast elkaar

Polynomiale vs spline-regressie

Polynomiale versus spline-regressie

Dus als je relatie mild niet-lineair is en je prima bent met een globale fit, kan polynomiale regressie werken. Als je een complexer patroon hebt of waarde hecht aan voorspellingen nabij de grenzen, zijn splines de veiligere keuze.

Het kiezen van het aantal en de locatie van knopen

Knoopselectie is het deel van spline-regressie dat het meest telt. Te weinig knopen leidt tot onderfitting en te veel tot overfitting. En waar je ze plaatst, bepaalt welke patronen het model kan vastleggen.

Er zijn een paar aanpakken en meestal combineer je er een paar.

  1. Domeinkennis: Als je iets van het probleem weet, gebruik het. Een klinische studie kan knopen plaatsen bij bekende klinische drempels. Een prijsmodel kan knopen plaatsen op punten waar verwacht wordt dat consumentengedrag verandert. Domeingestuurde knoopplaatsing is het best te interpreteren omdat de segmenten overeenkomen met daadwerkelijke grenzen.
  2. Gelijk verdeelde knopen: Kies een aantal knopen en spreid ze gelijkmatig over het bereik van de voorspeller. Dit werkt prima als je data grofweg uniform verdeeld is langs de as. Het werkt niet als je in sommige regio's veel en in andere weinig data hebt — gelijk verdeelde knopen kunnen in gebieden met bijna geen data terechtkomen, wat de fit instabiel maakt.
  3. Knopen op basis van kwantielen: In plaats van knopen op gelijke posities op de x-as te plaatsen, plaats je ze op kwantielen van de voorspeller. Met 4 knopen en kwantielplaatsing zet je knopen op het 20e, 40e, 60e en 80e percentiel. Dit garandeert dat elk segment grofweg hetzelfde aantal observaties bevat, wat de fit betrouwbaarder maakt in schaarse regio's.
  4. Cross-validatie: Je probeert verschillende aantallen knopen, past de spline voor elk en vergelijkt de prestaties op achtergehouden data. De configuratie met de laagste validatiefout wint. Dit haalt de gok eruit maar kost rekenkracht, en het resultaat hangt nog steeds af van welke plaatsingsstrategie (gelijk, kwantiel) je doorzoekt.

De afweging is dezelfde als in elk regressieprobleem: flexibiliteit versus complexiteit. Meer knopen betekenen meer flexibiliteit, wat het model fijnere patronen laat volgen maar ook ruis kan laten najagen. Minder knopen betekenen een stabieler, beter te interpreteren model dat echte patronen kan missen.

Begin met 3–5 knopen op kwantielen en controleer vervolgens de residuen. Zie je systematische patronen die de spline niet pakt, voeg dan in die regio een knoop toe. Als de fit erg kronkelt, haal er één weg. Cross-validatie is de moeite waard als je de keuze moet verdedigen of als het model naar productie gaat.

Spline-regressie in machine learning en statistiek

Spline-regressie duikt op waar iemand een soepele niet-lineaire werking wil modelleren zonder zich vast te leggen op een specifieke functionele vorm. Hier zijn een paar veelvoorkomende gebieden:

  • Trends in tijdreeksen: Een veelgebruikte toepassing is het scheiden van de vloeiende trend in een tijdreeks van kortetermijnschommelingen. Een spline op tijd als voorspeller geeft je een flexibele trendlijn die zich aanpast aan richtingsveranderingen zonder te overreageren op ruis. Economen en analisten gebruiken dit voortdurend wanneer ze het onderliggende verloop van een variabele willen beschrijven — denk aan bbp of aandelenkoersen — zonder zich vast te leggen op een lineaire of exponentiële aanname.
  • Economie en econometrie: Splines worden gebruikt om relaties te modelleren waarbij het effect van een variabele verandert over het bereik. Het effect van inkomen op consumptie is niet constant, omdat lage-inkomenshuishoudens anders besteden dan hoge-inkomenshuishoudens. Een spline ziet dit zonder een specifieke functionele vorm aan te nemen.
  • Zorg en biostatistiek: Veel gezondheidsuitkomsten hebben niet-lineaire relaties met voorspellers zoals leeftijd, BMI, bloeddruk of biomarkerwaarden. Ziekterisico volgt vaak een U- of J-vorm — beide uitersten zijn riskant, het midden is veilig. Een lineair model zou dit missen. Kubische splines en natuurlijke kubische splines zijn de standaardtool om deze effecten te modelleren en ze zijn ingebouwd in de meeste statistische software die in klinisch onderzoek wordt gebruikt.
  • Milieu- en ecologische modellering: Splines verschijnen ook bij het modelleren van hoe soorten of klimaatvariabelen reageren op milieugradienten. Dingen als temperatuur, hoogte en neerslag hebben vaak niet-lineaire effecten op uitkomsten zoals soortenaantallen of gewasopbrengst. Splines laten onderzoekers de responscurve passen zonder de vorm vooraf te specificeren.

In al deze gevallen geven splines je flexibiliteit waar je die nodig hebt, zonder dat je de functionele vorm van de relatie hoeft te raden. Dat maakt ze geschikt voor verkennende modellering en een solide keuze voor productiemodellen wanneer interpreteerbaarheid belangrijk is.

Spline-regressie in Python

Python heeft drie veelgebruikte manieren om spline-regressie te passen: scikit-learn voor een ML-stijl pipeline, patsy voor formulegebaseerde modelspecificatie en statsmodels voor statistische inferentie. Ik loop ze nu langs.

Met scikit-learn

scikit-learn biedt SplineTransformer, die een numerieke feature omzet in een set B-spline-basisfuncties. Die features voer je vervolgens in een lineair regressiemodel.

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import SplineTransformer
from sklearn.pipeline import make_pipeline

# Data
np.random.seed(42)
x = np.linspace(0, 10, 100).reshape(-1, 1)
y = np.sin(x).ravel() + 0.3 * x.ravel() + np.random.normal(0, 0.3, 100)

# Spline features + linear regression pipeline
model = make_pipeline(
    SplineTransformer(n_knots=5, degree=3),
    LinearRegression()
)
model.fit(x, y)
y_pred = model.predict(x)

print("R^2 score:", model.score(x, y))

scikit-learn R2-score

scikit-learn R2-score

De SplineTransformer maakt de splinebasis met 5 knopen en kubische polynomen. Vervolgens vindt LinearRegression de coëfficiënten voor elke basisfunctie. Je kunt hier elke sklearn-regressor inwisselen — ridge, lasso, alles wat een lineair model op de getransformeerde features past.

Deze aanpak past bij de sklearn-workflows, maar je krijgt geen statistische output zoals standaardfouten of p-waarden. Daarvoor heb je patsy of statsmodels nodig.

Met patsy

patsy is een formulegebaseerde interface voor het bouwen van designmatrices. Het is het dichtstbijzijnde wat Python heeft bij de modelformules van R en de standaardmanier om splinefeatures te construeren voor gebruik met statsmodels.

import numpy as np
import pandas as pd
from patsy import dmatrix
import statsmodels.api as sm

np.random.seed(42)
x = np.linspace(0, 10, 100)
y = np.sin(x) + 0.3 * x + np.random.normal(0, 0.3, 100)
df = pd.DataFrame({"x": x, "y": y})

# B-spline basis using patsy
spline_basis = dmatrix("bs(x, df=6, degree=3)", data=df, return_type="dataframe")

# Fit with statsmodels OLS
model = sm.OLS(df["y"], spline_basis).fit()
print(model.summary())

patsy modeloverzicht

patsy modeloverzicht

De functie bs() in de formule vertelt patsy om een B-splinebasis te bouwen met 6 vrijheidsgraden en graad 3 (kubisch). patsy geeft de designmatrix terug, die direct in sm.OLS() gaat. De parameter df bepaalt het aantal splinebasisfuncties — hogere waarden geven je meer flexibiliteit, vergelijkbaar met het toevoegen van meer knopen.

Als je natuurlijke splines wilt, vervang dan bs() door ns():

spline_basis = dmatrix("ns(x, df=6)", data=df, return_type="dataframe")

Met statsmodels en formules

statsmodels heeft ook een formule-API die integreert met patsy. Dit is de schoonste versie wanneer je een one-liner spline-regressie wilt met volledige statistische output.

import statsmodels.formula.api as smf

model = smf.ols("y ~ bs(x, df=7, degree=3)", data=df).fit()
print(model.summary())

statsmodels modeloverzicht

statsmodels modeloverzicht

De output van summary() geeft je coëfficiënten voor elke splinebasisfunctie, standaardfouten, p-waarden en de gebruikelijke fit-statistieken. De coëfficiënten zelf zijn niet direct interpreteerbaar, omdat elk correspondeert met een basisfunctie, niet met een grootheid uit de echte wereld. Je interpreteert de fit door voorspellingen over het bereik van de voorspeller te plotten.

Voor de meeste statistische workflows is de formula-API van statsmodels de meest handige keuze. Gebruik scikit-learn wanneer splines onderdeel zijn van een grotere ML-pipeline.

Spline-regressie in R

R heeft de beste ingebouwde ondersteuning voor splines van alle grote talen. Het pakket splines wordt meegeleverd met base R en de twee belangrijkste functies — bs() en ns() — werken rechtstreeks in elke regressieformule.

De functie bs() maakt een B-splinebasis. De functie ns() maakt een natuurlijke kubische splinebasis. Beide produceren een matrix met splinefeatures die R's formulesysteem automatisch in het model opneemt.

bs() gebruiken voor B-splines

# Data
set.seed(42)
x <- seq(0, 10, length.out = 100)
y <- sin(x) + 0.3 * x + rnorm(100, sd = 0.3)
df <- data.frame(x = x, y = y)

# Cubic B-spline with 6 degrees of freedom
library(splines)
model <- lm(y ~ bs(x, df = 6, degree = 3), data = df)
summary(model)

bs()-output in R

bs()-output in R

De formule y ~ bs(x, df = 6, degree = 3) vertelt R om x te vervangen door een B-splinebasis van graad 3 en 6 vrijheidsgraden. R doet de rest — het bouwt de basismatrix, past het lineaire model en produceert een standaard lm-object met alle gebruikelijke diagnostiek.

Je kunt knoopp posities direct doorgeven als je volledige controle wilt:

model <- lm(y ~ bs(x, knots = c(2, 5, 8), degree = 3), data = df)

Dit plaatst knopen bij x = 2, x = 5 en x = 8 in plaats van R ze voor je te laten kiezen.

ns() gebruiken voor natuurlijke splines

Voor natuurlijke kubische splines (het type met lineair gedrag voorbij de grenzen) gebruik je ns():

model_natural <- lm(y ~ ns(x, df = 6), data = df)
summary(model_natural)

ns()-output in R

ns()-output in R

De syntaxis is hetzelfde, maar het randgedrag is anders. Natuurlijke splines zijn meestal de veiligere keuze wanneer je waarde hecht aan voorspellingen of interpretatie nabij de randen van de data.

De output interpreteren

De coëfficiënten in de output van summary() corresponderen met de splinebasisfuncties, niet met interpreteerbare grootheden. Om te zien wat het model daadwerkelijk heeft geleerd, voorspel je over een raster van x-waarden en plot je het resultaat:

x_grid <- data.frame(x = seq(0, 10, length.out = 200))
preds <- predict(model, newdata = x_grid)
plot(df$x, df$y)
lines(x_grid$x, preds, col = "green", lwd = 2)

Output-interpretatie bij spline-regressie in R

Output-interpretatie in R

Dit is het standaardpatroon in R: je past de spline, voorspelt op een glad raster en legt de curve over de data. R laat je ook splinetermen samen met andere voorspellers in dezelfde formule gebruiken:

model_multi <- lm(y ~ ns(x, df = 6) + other_var, data = df)

Dit past een niet-lineair effect voor x en een lineair effect voor other_var in hetzelfde model. Die flexibiliteit is waarom splines zo breed worden gebruikt in R-gebaseerde statistische workflows.

Voordelen van spline-regressie

Hier zijn een paar voordelen van splines vergeleken met populairdere machinelearningmodellen:

  • Modelleert niet-lineaire relaties zonder de vorm te kennen: Je hoeft je niet vast te leggen op een specifieke functionele vorm. Splines laten de data de curve vormen, zodat je buigingen, plateaus en richtingsveranderingen kunt modelleren zonder vooraf te weten waar ze optreden.
  • Vloeiende en interpreteerbare fits: De output is een continue curve, geen blackbox-voorspelling. Je kunt de spline plotten, zien hoe de respons verandert over het bereik van de voorspeller en het uitleggen aan een niet-technisch publiek.
  • Stabieler dan polynomen met hoge graad: Elk segment is een polynoom met lage graad, dus geen enkel stuk kan zich wild gedragen aan de randen. Het randgedrag is veel beter beheerst, vooral bij natuurlijke kubische splines.
  • Werkt binnen bestaande regressieworkflows: Splines werken binnen standaard lineaire regressie. Je kunt ze combineren met andere voorspellers, regularisatie, mixed effects en elk ander hulpmiddel dat bovenop OLS past.

Beperkingen van spline-regressie

Zoals de meeste modellen brengen splines een paar afwegingen mee die je moet kennen:

  • Knoopselectie is het moeilijke deel: Het kiezen van het aantal en de locatie van knopen kost werk. Standaarden zijn soms goed, maar in veel gevallen heb je cross-validatie of domeinkennis nodig voor een goede fit. Er is geen één regel die altijd werkt.
  • Interpretatie wordt moeilijker met meer knopen: Een spline met drie knopen is nog eenvoudig te interpreteren. Een spline met twintig knopen niet. Je kunt de curve nog plotten, maar uitleggen wat het model precies doet wordt een stuk lastiger.
  • Ze kunnen nog steeds overfitten: Splines zijn stabieler dan polynomen met hoge graad, maar niet immuun voor overfitting. Te veel knopen, slechte knoopplaatsing, te veel uitschieters of een kleine steekproef kunnen allemaal een model opleveren dat de trainingsdata goed past maar faalt op nieuwe data.
  • Coëfficiënten zijn niet direct betekenisvol: De geschatte coëfficiënten corresponderen met basisfuncties, niet met grootheden uit de echte wereld. Je kunt niet aflezen: "een toename van één eenheid in x verandert y met bèta" zoals bij lineaire regressie. Je moet de fit visueel interpreteren.

Veelgemaakte fouten bij spline-regressie

Ik loop nu een paar fouten langs die beginners maken bij spline-regressie:

  • Te veel knopen gebruiken: Beginners voegen vaak knopen toe totdat de fit er visueel goed uitziet op de trainingsdata. Dit is een klassieke overfitting-val. Als de spline tussen elke observatie kronkelt, heb je te veel knopen. Doe aan cross-validatie of begin met minder knopen en voeg alleen toe wanneer de residuen een duidelijk patroon laten zien.
  • Te weinig knopen gebruiken en aannemen dat de data lineair is: De omgekeerde fout. Als je een spline met één of twee knopen past en de residuen nog steeds kromming tonen, onderfit het model. De spline heeft simpelweg niet genoeg segmenten om het echte patroon te volgen. Voeg meer knopen toe in de regio's waar de residuen afwijken.
  • Randgedrag verkeerd begrijpen: Gewone kubische splines kunnen zich grillig gedragen nabij de randen van de data. Als je voorspellingen dicht bij de grenzen maakt (of daarbuiten extrapoleert), gebruik dan natuurlijke kubische splines. Die forceren lineair gedrag voorbij de grensknopen en voorkomen uitschieters die gewone kubische splines kunnen veroorzaken.
  • Splines direct vergelijken met onbegrensde niet-lineaire modellen: Splines proberen geen neurale netwerken of random forests te zijn. Als je een spline afzet tegen een volledig niet-lineair blackbox-model op pure voorspellingsnauwkeurigheid, wint het blackbox-model vaak op ruwe prestaties. Dat is niet het punt. Splines winnen op interpreteerbaarheid en de mogelijkheid om in traditionele statistische inferentie te passen.

Spline-regressie vs andere niet-lineaire modelleringstechnieken

Splines zijn niet de enige manier om niet-lineaire relaties te modelleren, maar ze zijn nuttig als je om interpreteerbaarheid geeft. Zo verhouden ze zich tot de meest voorkomende alternatieven.

Polynomiale regressie

Polynomiale regressie gebruikt één globale vergelijking. Het is eenvoudiger te specificeren maar minder stabiel, vooral aan de randen. Splines verslaan polynomen op flexibiliteit en stabiliteit wanneer de relatie meer dan één buiging heeft. Polynomen zijn alleen bij zeer lage graad (2 of 3) makkelijker te interpreteren. Daarboven worden splines zowel betrouwbaarder als beter te interpreteren.

Generalized Additive Models (GAM's)

GAM's zijn in essentie splines op schaal. Een GAM laat je voor elke voorspeller onafhankelijk een spline passen en ze additief combineren. Je kunt spline-regressie zien als een eendimensionale GAM en een GAM als een som van splines over meerdere variabelen.

GAM's behandelen meerdere niet-lineaire voorspellers netter dan handmatig splines voor elk te passen. Ze bevatten ook gladheidsstraffen die de juiste hoeveelheid flexibiliteit kiezen, wat een deel van het knoopselectiewerk wegneemt. Werk je met meerdere voorspellers en moeten er een paar niet-lineair worden gemodelleerd, dan zijn GAM's meestal de betere optie.

Beslisbomen

Beslisbomen pakken het totaal anders aan. In plaats van een vloeiende curve te passen, verdelen ze de voorspellersruimte in rechthoekige regio's en voorspellen ze een constante waarde in elke regio. Het resultaat is een stapfunctie.

Bomen zijn in sommige opzichten flexibeler dan splines — ze kunnen interacties en abrupte veranderingen modelleren. Maar de gefitte functie is niet vloeiend of continu. Ook generaliseren ze minder goed in regio's met weinig data. Splines zijn beter als je om vloeiendheid en stabiele extrapolatie geeft. Bomen zijn beter wanneer je scherpe grenzen of interacties over veel variabelen wilt modelleren.

Waarom spline-regressie ertoe doet

Splines zijn alomtegenwoordig in toegepaste statistiek. Je ziet ze in klinisch onderzoek, economische analyses, milieuwetenschap, tijdreeksmodellering en in elk veld waar iemand een soepele niet-lineaire werking wil modelleren zonder voor een blackbox-model te gaan.

De reden is de balans die ze bieden — genoeg flexibiliteit om rommelige data aan te kunnen, maar genoeg structuur om interpreteerbaar en stabiel te blijven.

Ze vormen ook de basis voor geavanceerdere methoden. Generalized Additive Models zijn rechtstreeks op splines gebouwd, smoothing splines breiden het idee uit met ingebouwde regularisatie en veel moderne niet-lineaire regressietechnieken gebruiken splinebasissen. Als je een van deze methoden wilt begrijpen, moet je eerst splines begrijpen.

Splines zijn dus belangrijk omdat ze praktisch zijn en omdat ze de bouwsteen vormen voor veel van wat daarna komt. Het zijn niet de krachtigste modellen, maar wel een van de betrouwbaarste — en dat is vaak wat telt.

Conclusie

Spline-regressie modelleert niet-lineaire relaties door stukgewijze polynomen te combineren op punten die knopen worden genoemd. Dat is het idee, en de rest zijn variaties daarop.

Knopen en gladheid zijn de twee ideeën die je moet begrijpen. Al het andere (splinetypen, basisrepresentaties, implementatie in R en Python) zijn slechts verschillende manieren om met die twee concepten te werken.

Probeer een paar splinetypen op je eigen data. Vergelijk kubisch, natuurlijk kubisch en B-splines. Verplaats de knopen en kijk wat er gebeurt. Experimenteer gewoon, want de visuele aard van de fit maakt het makkelijk om te zien wat elke keuze doet.

Als je dieper in de wiskunde achter splines en vele andere algoritmen wilt duiken, schrijf je dan in voor onze Machine Learning Scientist in Python-track. Die heeft alles wat je nodig hebt om in 2026 job-ready te zijn.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Senior Data Scientist, gevestigd in Kroatië. Top Tech-schrijver met meer dan 700 gepubliceerde artikelen en meer dan 10 miljoen weergaven. Auteur van het boek Machine Learning Automation with TPOT.

Spline-regressie: veelgestelde vragen

Wat is spline-regressie in eenvoudige bewoordingen?

Spline-regressie is een manier om gebogen relaties in data te modelleren door het bereik van de voorspeller in segmenten te splitsen en in elk segment een kleine polynoom te passen. De segmenten sluiten soepel op elkaar aan op punten die knopen worden genoemd, zodat het eindresultaat één continue curve is. Het is flexibeler dan lineaire regressie en stabieler dan polynomiale regressie met hoge graad.

Wanneer moet ik spline-regressie gebruiken in plaats van lineaire regressie?

Gebruik spline-regressie wanneer de relatie tussen je voorspeller en uitkomst geen rechte lijn is. Als een lineair model patronen in de residuen achterlaat — bijvoorbeeld de fouten zijn positief in het midden van de data en negatief aan de uiteinden — is dat een teken dat de relatie niet-lineair is.

Wat zijn knopen in spline-regressie?

Knopen zijn de punten langs de as van de voorspeller waar het ene polynomiale segment eindigt en het volgende begint. Ze bepalen hoe flexibel de spline kan zijn. Meer knopen betekent dat de curve op meer plekken kan buigen. Het kiezen van het juiste aantal en de juiste plaatsing van knopen is de centrale beslissing in spline-regressie. Te weinig leidt tot onderfitting en te veel tot overfitting.

Wat is het verschil tussen kubische splines en natuurlijke kubische splines?

Beide passen kubische polynomen tussen knopen, maar ze verschillen in hun gedrag aan de randen van de data. Gewone kubische splines kunnen zich nabij de randen onverwacht gedragen omdat elk uiteinde nog steeds een volwaardig kubisch polynoom is. Natuurlijke kubische splines forceren de curve om lineair te zijn voorbij de buitenste knopen, wat voorspellingen nabij of voorbij de grenzen veel stabieler maakt.

Hoe kies ik het aantal knopen voor een splinemodel?

Begin met 3–5 knopen op kwantielen van de voorspeller zodat elk segment een vergelijkbaar aantal observaties heeft. Als de residuen patronen laten zien die de spline niet pakt, voeg dan in die regio een knoop toe. Voor een rigoureuzere aanpak gebruik je cross-validatie om verschillende aantallen knopen te vergelijken en kies je de configuratie met de laagste validatiefout.

Onderwerpen

Leer met DataCamp

Cursus

Generalized Linear Models in R

4 Hr
21.8K
De cursus Generalized Linear Model breidt je regressietoolbox uit met logistische en Poisson-regressie.
Bekijk detailsRight Arrow
Begin Met De Cursus
Meer zienRight Arrow
Gerelateerd

blog

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer ZienMeer Zien