Fundamente de Data Science

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

SimptomDiagnosticTratament
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 ✔
Reflexul de concurs: raportează mereu ambele scoruri, train și validare. Diferența dintre ele este diagnosticul.

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

Unde e echilibrul unui arbore de decizie? Mediu Rezolvată

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

1. Diagnostic rapid Exercițiu

Pune diagnosticul: (a) train 55%, validare 54%; (b) train 99%, validare 71%; (c) train 88%, validare 86%. Pentru fiecare, propune două remedii concrete.

2. Overfitting cu K-NN Exercițiu

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.

3. Ajută mai multe date? Exercițiu

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.

4. Audit pe o soluție reală Platformă

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.