4.2 Underfitting și overfitting
Cele două moduri în care un model eșuează: prea simplu ca să învețe (underfitting) sau atât de flexibil încât memorează în loc să înțeleagă (overfitting).
Teorie
Bias și varianță
Bias (eroare sistematică): modelul face aceleași greșeli indiferent de datele de antrenare — presupunerile lui sunt prea rigide (dreaptă pentru o relație curbată).
Varianță: modelul se schimbă dramatic la mici variații ale datelor de antrenare — a memorat zgomotul, nu tiparul.
Compromisul bias–varianță: modele simple au bias mare + varianță mică (underfitting); modele foarte flexibile au bias mic + varianță mare (overfitting). Scopul: punctul de echilibru, unde eroarea pe date noi este minimă.
Impact asupra performanței — cum le recunoști
| Simptom | Diagnostic | Tratament |
|---|---|---|
| scor slab pe train ȘI pe validare | underfitting | model mai complex, feature-uri noi, mai puțină regularizare, antrenare mai lungă |
| scor excelent pe train, slab pe validare | overfitting | mai multe date, regularizare, model mai simplu, mai puține feature-uri, early stopping |
| scoruri apropiate și bune | echilibru ✔ | — |
Diagnosticare cu scikit-learn
Curbe de validare — scorul în funcție de un hiperparametru de complexitate:
from sklearn.model_selection import validation_curve
import numpy as np, matplotlib.pyplot as plt
adancimi = range(1, 21)
tr, va = validation_curve(DecisionTreeClassifier(random_state=42), X, y,
param_name="max_depth", param_range=adancimi, cv=5)
plt.plot(adancimi, tr.mean(axis=1), label="train")
plt.plot(adancimi, va.mean(axis=1), label="validare")
plt.xlabel("max_depth"); plt.legend(); plt.show()
Curbe de învățare — scorul în funcție de cantitatea de date:
from sklearn.model_selection import learning_curve
n, tr, va = learning_curve(model, X, y, cv=5,
train_sizes=np.linspace(0.1, 1.0, 8))
plt.plot(n, tr.mean(axis=1), label="train")
plt.plot(n, va.mean(axis=1), label="validare")
plt.legend(); plt.show()
# curbele converg jos → underfitting; gol mare între ele → overfitting
# (mai multe date ar ajuta)
Problemă rezolvată: diagnostic pe curba de validare
Pe un dataset de clasificare, desenăm curba de validare pentru max_depth 1–20 și
punem diagnosticul pentru fiecare zonă.
Rezolvarea completă
import numpy as np, matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import validation_curve
X, y = make_classification(n_samples=600, n_features=20, n_informative=8,
flip_y=0.1, random_state=42)
rng = range(1, 21)
tr, va = validation_curve(DecisionTreeClassifier(random_state=42), X, y,
param_name="max_depth", param_range=rng, cv=5)
plt.plot(rng, tr.mean(axis=1), "o-", label="train")
plt.plot(rng, va.mean(axis=1), "o-", label="validare")
best = rng[int(np.argmax(va.mean(axis=1)))]
plt.axvline(best, ls="--", c="gray", label=f"echilibru: depth={best}")
plt.xlabel("max_depth"); plt.ylabel("acuratețe"); plt.legend(); plt.show()
Citirea graficului: la depth 1–3 ambele curbe sunt jos și lipite —
underfitting. De la depth ~8, curba de train urcă spre 1.00 iar cea de validare scade —
overfitting: modelul învață zgomotul introdus de flip_y. Echilibrul este în jurul
depth 5–7, unde curba de validare atinge maximul.
Probleme propuse
Pune diagnosticul: (a) train 55%, validare 54%; (b) train 99%, validare 71%; (c) train 88%, validare 86%. Pentru fiecare, propune două remedii concrete.
Reia curba k → acuratețe din lecția 2.4 și marchează pe grafic zona de overfitting și cea de underfitting. Atenție: la K-NN complexitatea scade când k crește.
Desenează curbele de învățare pentru un model supraînvățat și unul subînvățat. Pentru care dintre ele „mai multe date" este un remediu real? Justifică din grafic.
Ia o problemă rezolvată pe platformă și verifică-ți soluția: care e diferența train–validare? Dacă e peste ~5 puncte procentuale, aplică un remediu și măsoară din nou.