Hoppa till innehållet
AI-grafen
E· Universitetklassisk-ml· ca 60 min· utvecklande· verifierad 2026-09-20

Bias–varians-avvägningen

Kunna dekomponera fel i bias och varians och koppla till modellkomplexitet.

Förkunskaper

Intuition

Tänk dig att du tränar samma modelltyp på tio olika stickprov ur samma population och tittar på förutsägelserna i en given punkt.

  • Bias = hur långt medelvärdet av de tio förutsägelserna ligger från sanningen. Systematiskt fel — modellen är för enkel för mönstret.
  • Varians = hur mycket de tio spretar. Modellen är så flexibel att den följer just sitt stickprov.
  • Brus = det som inte går att förutsäga oavsett modell.

En rät linje på krokig data: hög bias, låg varians. Ett polynom av grad 15: låg bias, hög varians. Båda har stort totalfel.

Formellt

För kvadratisk förlust i en punkt xx, med y=f(x)+εy = f(x) + \varepsilon och E[ε]=0\mathbb E[\varepsilon]=0, Var(ε)=σ2\text{Var}(\varepsilon)=\sigma^2:

E[(y−f^(x))2]=(f(x)−E[f^(x)])2⏟bias2+E[(f^(x)−E[f^(x)])2]⏟varians+σ2⏟oreducerbart\mathbb E\big[(y - \hat f(x))^2\big] = \underbrace{\big(f(x) - \mathbb E[\hat f(x)]\big)^2}_{\text{bias}^2} + \underbrace{\mathbb E\big[(\hat f(x) - \mathbb E[\hat f(x)])^2\big]}_{\text{varians}} + \underbrace{\sigma^2}_{\text{oreducerbart}}

Väntevärdet tas över olika träningsmängder.

Vad som påverkar vad:

  • Ökad modellkomplexitet: bias ↓, varians ↑.
  • Mer träningsdata: varians ↓ (bias oförändrad).
  • Regularisering: varians ↓, bias ↑ något.
  • Ensembler (bagging, random forest): varians ↓ genom medelvärdesbildning.
  • Boosting: bias ↓ genom att successivt korrigera fel.

Nyansen för moderna nät: «double descent» visar att testfelet kan sjunka igen bortom interpolationspunkten för mycket stora modeller — den klassiska U-kurvan är inte hela bilden.

Kod

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

rng = np.random.default_rng(0)
f = lambda x: np.sin(1.5 * x)
x_test = np.linspace(-3, 3, 200)[:, None]

for grad in (1, 3, 15):
    preds = []
    for _ in range(50):                        # 50 olika träningsmängder
        X = rng.uniform(-3, 3, (30, 1)); y = f(X[:, 0]) + rng.normal(0, 0.3, 30)
        m = make_pipeline(PolynomialFeatures(grad), LinearRegression()).fit(X, y)
        preds.append(m.predict(x_test))
    P = np.array(preds)
    bias2 = float(np.mean((P.mean(axis=0) - f(x_test[:, 0])) ** 2))
    var = float(np.mean(P.var(axis=0)))
    print(f"grad {grad:2d}  bias² {bias2:.3f}  varians {var:.3f}  summa {bias2 + var:.3f}")
# grad  1  bias² 0.281  varians 0.021  summa 0.302
# grad  3  bias² 0.020  varians 0.049  summa 0.069   ← bäst
# grad 15  bias² 0.013  varians 0.612  summa 0.625

Behärskning innebär

  • Dekomponerar fel i bias, varians och brus
  • Kopplar avvägningen till modellkomplexitet och datamängd

Logga in för att göra övningarna och bygga upp din behärskning.

Källor

Alla källor och licenser