Al llarg del mòdul han anat apareixent pistes: l'arbre sense límit de profunditat que clavava el 100 % en entrenament i s'enfonsava en prova (06-01), el return_train_score de cross_validate "per diagnosticar overfitting" (06-03), l'AUC sospitosament perfecte que convidava a buscar fuites (06-04). Aquesta lliçó ajunta totes aquelles pistes en el diagnòstic central del Machine Learning: el meu model memoritza (overfitting) o no aprèn prou (underfitting)? Aprendrem a diagnosticar-ho comparant l'error d'entrenament amb el de validació, a entendre el compromís biaix-variància que hi ha al darrere, i a usar dues eines gràfiques — corbes de validació i corbes d'aprenentatge — que responen a les dues preguntes pràctiques per excel·lència: quanta complexitat convé? i ajudarien més dades? Tancarem el mòdul amb una checklist d'avaluació honesta que resumeix tot allò après.

Contingut

  1. Definicions i analogia: memoritzar l'examen vs. no estudiar
  2. Diagnòstic: error d'entrenament davant d'error de validació
  3. El compromís biaix-variància
  4. Corbes de validació: quanta complexitat?
  5. Corbes d'aprenentatge: ajudarien més dades?
  6. Remeis de l'overfitting i de l'underfitting
  7. Tancament del mòdul: checklist d'avaluació honesta

Definicions i analogia: memoritzar l'examen vs. no estudiar

Tornem a l'analogia de l'examen de 06-01, ara amb tres estudiants:

  • El memorista s'aprèn de memòria les solucions dels exercicis del llibre, coma per coma. En aquells exercicis treu un 10; a l'examen (preguntes noves), suspèn: mai no va entendre els conceptes, només els casos concrets, soroll inclòs. És l'overfitting (sobreajustament): el model s'ajusta tant a les dades d'entrenament que en captura les peculiaritats i el soroll, i perd capacitat de generalitzar.
  • El qui no va estudiar amb prou feines va fullejar el temari. Falla els exercicis del llibre i l'examen per igual: no va capturar ni tan sols els patrons bàsics. És l'underfitting (subajustament): el model és massa simple (o les features massa pobres) per a l'estructura real del problema.
  • El qui va entendre la matèria fa bé els exercicis (sense clavar-los tots: no va memoritzar errates) i l'examen li surt semblant. És el punt dolç: aprèn el patró, ignora el soroll.

A MercaFresh ja hem vist tots tres: l'arbre sense podar de 04-03 era el memorista (una fulla per client); una regressió logística sobre una única feature pobra seria el qui no va estudiar; l'arbre amb max_depth=5 del torneig de 06-03 s'acostava al punt dolç.

Diagnòstic: error d'entrenament davant d'error de validació

El diagnòstic es fa amb dos números, no un: l'error (o mètrica) en entrenament i en validació. Els quatre escenaris possibles:

Error entrenament Error validació Diagnòstic Exemple MercaFresh
Baix Baix (similar) Punt dolç — bon ajust Logística amb bones features RFM: F1 0.66 / 0.63
Baix Alt (bretxa gran) Overfitting Arbre sense límit: F1 1.00 / 0.62
Alt Alt (similar) Underfitting Logística amb una sola feature: F1 0.35 / 0.34
Alt Baix Sospita de bug Fuita de dades, conjunts mal construïts, atzar en mostres petites

Regles de lectura:

  • La bretxa entrenament − validació mesura el sobreajustament: com més gran, més està memoritzant el model.
  • El nivell de l'error de validació mesura la qualitat real. Un model pot tenir bretxa zero i ser pèssim (underfitting) o bretxa enorme amb validació decent (overfitting aprofitable, però millorable).
  • El quart escenari no hauria d'existir: si la validació supera amb claredat l'entrenament, revisa el protocol (fuita al revés?, validació massa petita i amb sort?).

En codi, és el return_train_score=True de 06-03:

from sklearn.model_selection import cross_validate
from sklearn.tree import DecisionTreeClassifier

for prof in [None, 5]:                       # None = sense limit
    arbre = DecisionTreeClassifier(max_depth=prof, random_state=42)
    res = cross_validate(arbre, X_entrenament, y_entrenament, cv=5,
                         scoring="f1", return_train_score=True)
    print(f"max_depth={prof}: F1 entrenament = {res['train_score'].mean():.2f} | "
          f"F1 val = {res['test_score'].mean():.2f}")
# max_depth=None: F1 entrenament = 1.00 | F1 val = 0.58   <- overfitting de manual
# max_depth=5   : F1 entrenament = 0.70 | F1 val = 0.63   <- bretxa raonable

El compromís biaix-variància

Darrere dels dos fenòmens hi ha un compromís fonamental. A nivell intuïtiu, l'error d'un model en dades noves té dos components controlables:

  • Biaix (bias): error per suposicions massa rígides. Un model amb biaix alt (una recta per a un fenomen corbat) falla sistemàticament igual, s'entreni amb les dades que s'entreni. És la signatura de l'underfitting.
  • Variància: error per sensibilitat excessiva a les dades concretes d'entrenament. Un model amb variància alta (un arbre profundíssim) canvia dràsticament si canvies unes poques files: aprèn el soroll d'aquella mostra. És la signatura de l'overfitting. (De fet, la desviació entre folds de 06-03 ja ens donava una mesura empírica d'aquesta sensibilitat.)

En augmentar la complexitat del model, el biaix baixa (pot representar patrons més rics) però la variància puja (té més llibertat per perseguir el soroll). L'error total dibuixa una U:

flowchart LR
    subgraph Eix["Complexitat del model →"]
        A["Poca complexitat<br/>─────────<br/>Biaix ALT<br/>Variancia baixa<br/>= UNDERFITTING<br/>(entrenament malament, val malament)"]
        B["Complexitat adequada<br/>─────────<br/>Biaix moderat<br/>Variancia moderada<br/>= PUNT DOLC<br/>(error de validacio minim)"]
        C["Molta complexitat<br/>─────────<br/>Biaix baix<br/>Variancia ALTA<br/>= OVERFITTING<br/>(entrenament perfecte, val malament)"]
    end
    A --> B --> C

Cada algorisme del mòdul 4 té els seus comandaments de complexitat: max_depth i companyia en arbres, el nombre de veïns en K-NN (k petit = més variància), la mida de les capes en l'MLP, la C i el kernel en SVM... Trobar el punt dolç d'aquests comandaments és, precisament, allò per a què serveix el conjunt de validació de 06-01 — i el que ara visualitzarem.

Corbes de validació: quanta complexitat?

La corba de validació dibuixa la mètrica en entrenament i en validació en funció d'un hiperparàmetre de complexitat. Amb validation_curve sobre el max_depth de l'arbre de churn de 04-03:

from sklearn.model_selection import validation_curve
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import numpy as np

profunditats = range(1, 16)
train_scores, val_scores = validation_curve(
    DecisionTreeClassifier(random_state=42),
    X_entrenament, y_entrenament,
    param_name="max_depth", param_range=profunditats,
    cv=5, scoring="f1",
)

tr_m, va_m = train_scores.mean(axis=1), val_scores.mean(axis=1)
va_s = val_scores.std(axis=1)

plt.plot(profunditats, tr_m, "o-", label="F1 entrenament")
plt.plot(profunditats, va_m, "o-", label="F1 validacio")
plt.fill_between(profunditats, va_m - va_s, va_m + va_s, alpha=0.2)  # +/- std (06-03)
plt.axvline(profunditats[np.argmax(va_m)], ls="--", color="gray",
            label=f"Optim: max_depth={profunditats[np.argmax(va_m)]}")
plt.xlabel("max_depth"); plt.ylabel("F1"); plt.legend(); plt.show()

Com es llegeix el gràfic resultant (el patró és sempre el mateix):

  • Zona esquerra (max_depth 1–3): totes dues corbes baixes i juntes → underfitting; l'arbre és massa simple fins i tot per a l'entrenament.
  • Zona dreta (max_depth > 8): l'F1 d'entrenament continua pujant cap a 1.0 mentre el de validació baixa → overfitting; cada nivell extra de profunditat memoritza soroll.
  • El màxim de la corba de validació (típicament per max_depth 4–6 en el churn) és el punt dolç: la complexitat justa. És la "U" del biaix-variància, vista en dades reals.

Això explica el resultat de l'exercici 3 de la lliçó 06-03 (3 curt, 10 passat, 5 guanyador). La corba de validació explora un hiperparàmetre amb els altres fixos; l'exploració sistemàtica de diversos alhora és l'optimització d'hiperparàmetres de 07-05.

Corbes d'aprenentatge: ajudarien més dades?

L'altra pregunta pràctica: si MercaFresh invertís a recopilar més historial de clients, milloraria el model? La corba d'aprenentatge dibuixa la mètrica en entrenament i validació en funció del nombre d'exemples d'entrenament:

from sklearn.model_selection import learning_curve
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

pipe = Pipeline([("sc", StandardScaler()),
                 ("clf", LogisticRegression(max_iter=1000))])

mides, train_scores, val_scores = learning_curve(
    pipe, X_entrenament, y_entrenament,
    train_sizes=np.linspace(0.1, 1.0, 8),   # del 10 % al 100 % de l'entrenament
    cv=5, scoring="f1",
)

plt.plot(mides, train_scores.mean(axis=1), "o-", label="F1 entrenament")
plt.plot(mides, val_scores.mean(axis=1), "o-", label="F1 validacio")
plt.xlabel("Nre. d'exemples d'entrenament"); plt.ylabel("F1")
plt.legend(); plt.show()

Interpretació segons la forma de les corbes:

Forma en arribar al 100 % de les dades Diagnòstic Més dades?
Corbes separades (entrenament alt, val baix) i la de validació encara puja Overfitting amb marge : més dades tancarien la bretxa
Corbes ja convergides (juntes i planes) a nivell alt Punt dolç estable No: més dades amb prou feines aporten
Corbes convergides a nivell baix Underfitting No: el problema és el model o les features, no el volum

És un gràfic valuosíssim per decidir inversions: recopilar dades costa diners i mesos, i la corba d'aprenentatge diu per endavant si servirà d'alguna cosa.

Remeis de l'overfitting i de l'underfitting

Diagnòstic fet; receptari:

Contra l'overfitting (bretxa entrenament-validació gran)

  • Més dades d'entrenament — el remei més fiable quan la corba d'aprenentatge mostra marge: amb més exemples, el soroll individual pesa menys.
  • Reduir la complexitat del model: menys profunditat a l'arbre, més veïns en K-NN, menys neurones a l'MLP, o directament un algorisme més simple. La corba de validació indica quant retallar.
  • Menys features / millors features: eliminar variables sorolloses o redundants redueix les oportunitats de memoritzar (el PCA, de 05-03, pot ajudar com a reducció prèvia).
  • Regularització: penalitzar els pesos grans del model per forçar-lo a solucions més suaus. És el remei estrella en models lineals i xarxes, i té lliçó pròpia — Ridge, Lasso i Elastic Net a 07-01 —, així que aquí només la deixem apuntada.
  • Early stopping (esmentat): en models que entrenen per iteracions (MLP, i el gradient boosting de 07-03), aturar l'entrenament quan l'error de validació deixa de millorar, encara que el d'entrenament continuï baixant.
  • Ensembles: combinar molts models d'alta variància fa la mitjana dels seus errors individuals (la variància es cancel·la). És la idea del Random Forest i companyia — 07-02.

Contra l'underfitting (entrenament i validació malament per igual)

  • Augmentar la complexitat: més profunditat, més neurones, un kernel no lineal a l'SVM, un algorisme més expressiu.
  • Millors features: sovint el coll d'ampolla no és el model sinó la informació que rep. L'enginyeria de característiques de 03-06 (ràtios, agregats RFM, interaccions) sol moure més l'agulla que qualsevol canvi d'algorisme.
  • Menys regularització (si n'hi ha) i, en models iteratius, entrenar més temps.
  • El que no funciona: afegir més files. Un model que no captura el patró amb 10.000 exemples tampoc no ho farà amb 100.000 — ho confirma la corba d'aprenentatge convergida a nivell baix.
Diagnòstic Palanques principals On es desenvolupen
Overfitting Més dades, menys complexitat, regularització, early stopping, ensembles 07-01, 07-02, 07-03
Underfitting Més complexitat, millors features, menys regularització 03-06, mòdul 7

Tancament del mòdul: checklist d'avaluació honesta

Aquest mòdul va començar amb la pregunta que va deixar oberta el mòdul 5: "és bo de veritat el meu model?". Ja podem respondre-la amb mètode. La checklist, lliçó a lliçó:

  1. Divisió neta (06-01): prova apartada des del principi i tocada una sola vegada; stratify amb classes desequilibrades; divisió cronològica si hi ha temps pel mig; sense duplicats repartits; cap feature que no existís en el moment de predir.
  2. Mètrica pactada per endavant (06-02): triada amb el negoci segons els costos de FP i FN (recall per al churn de MercaFresh), mai a posteriori; matriu de confusió sempre a la vista.
  3. Baseline (06-02, reprenent 01-04): DummyClassifier/DummyRegressor avaluats amb la mateixa mètrica; el model els ha de guanyar amb claredat o no hi ha història per explicar.
  4. Validació creuada (06-03): mitjana ± desviació, mateixos folds per a tots els candidats, Pipeline dins de la CV; diferències entre models jutjades amb l'escepticisme de 02-04.
  5. Llindar operatiu (06-04): triat en validació segons costos i capacitat, no heretat del 0.5; AUC per comparar, corba per decidir.
  6. Diagnòstic entrenament vs. validació (06-05): bretxa vigilada, corba de validació per a la complexitat, corba d'aprenentatge abans de demanar més dades.
  7. Escepticisme final: un resultat massa bo (accuracy 99 %, AUC 0.99) s'investiga com un bug — gairebé sempre ho és (fuita de dades).

Un model que passa aquesta checklist té un rendiment creïble. La següent frontera és fer-lo millor, i d'això tracta el mòdul 7.

Errors Comuns i Consells

  • Mirar només l'error de validació i ignorar el d'entrenament. Sense els dos números no hi ha diagnòstic: no sabràs si atacar el biaix o la variància, i els remeis són oposats.
  • Tractar tot mal resultat com a overfitting. L'underfitting és igual de freqüent i es cura amb el contrari (més complexitat, no menys). Diagnostica abans de medicar.
  • Perseguir la bretxa zero. Una bretxa petita és normal i sana; un model amb entrenament = validació exactes sol estar subajustat. El que s'optimitza és l'error de validació, no la bretxa.
  • Afegir dades sense mirar la corba d'aprenentatge. Si les corbes ja han convergit, aquells mesos de recollida no mouran la mètrica.
  • Ajustar la complexitat mirant la prova. Les corbes de validació es construeixen amb CV sobre l'entrenament; la prova continua dins la seva caixa forta fins al final (06-01).
  • Consell: imprimeix sempre la parella (mètrica entrenament, mètrica validació) a cada experiment, des del primer dia. És un hàbit d'una línia de codi que detecta el 90 % dels problemes de modelatge a la primera.

Exercicis

Exercici 1

Diagnostica cada escenari (overfitting, underfitting, punt dolç o sospita de bug) i proposa la primera acció correctora:

  • (a) K-NN amb k=1 sobre el churn: F1 entrenament = 0.99, F1 validació = 0.55.
  • (b) Regressió lineal de la despesa mensual amb només l'edat com a feature: R² entrenament = 0.12, R² validació = 0.11.
  • (c) Logística amb features RFM: F1 entrenament = 0.68, F1 validació = 0.64.
  • (d) Arbre sobre un dataset amb la columna motiu_baixa: F1 entrenament = 0.99, F1 validació = 0.99.

Exercici 2

Escriu el codi que calcula la corba de validació de l'hiperparàmetre n_neighbors (valors 1 a 30) d'un KNeighborsClassifier (amb escalat en Pipeline) sobre el churn, amb CV de 5 folds i scoring="f1", i imprimeix la k òptima. Indica quin extrem del rang esperes que sobreajusti i per què.

Exercici 3

La corba d'aprenentatge del model de churn mostra: amb el 100 % de les dades, F1 entrenament = 0.91, F1 validació = 0.63, i la corba de validació porta creixent des del 40 % de les dades sense aplanar-se. MercaFresh pot (a) comprar 6 mesos més d'historial o (b) pagar una consultoria per provar més algorismes. Quina opció avala el gràfic i per què?

Solucions

Solució 1.

  • (a) Overfitting de llibre: k=1 memoritza cada client (màxima variància). Primera acció: augmentar k (la corba de validació sobre n_neighbors diria quant).
  • (b) Underfitting: entrenament i validació igual de baixos; l'edat sola no explica la despesa. Primera acció: millors features (les RFM de 03-06), no més complexitat sobre una feature pobra.
  • (c) Punt dolç: bon nivell de validació i bretxa petita (0.04). Acció: cap d'urgent; afinar amb les tècniques del mòdul 7 si se'n vol treure més suc.
  • (d) Sospita de bug: rendiment gairebé perfecte també en validació. motiu_baixa només s'emplena després de la baixa: és la fuita d'informació futura de 06-01. Primera acció: eliminar la columna i reavaluar.

Solució 2.

from sklearn.model_selection import validation_curve
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
import numpy as np

pipe = Pipeline([("sc", StandardScaler()), ("knn", KNeighborsClassifier())])
ks = range(1, 31)

train_sc, val_sc = validation_curve(
    pipe, X_entrenament, y_entrenament,
    param_name="knn__n_neighbors",   # sintaxi pas__parametre del Pipeline
    param_range=ks, cv=5, scoring="f1",
)
va_m = val_sc.mean(axis=1)
print(f"k optima: {list(ks)[np.argmax(va_m)]}  (F1 val = {va_m.max():.3f})")

Sobreajusta l'extrem k petita (k=1 en particular): cada predicció depèn d'un únic veí, així que el model reprodueix el soroll individual de l'entrenament (alta variància). Amb k molt gran passa el contrari: la predicció s'assembla cada vegada més a "la classe majoritària de l'entorn ampli" i apareix underfitting.

Solució 3. El gràfic avala l'opció (a), més dades: hi ha una bretxa gran entre entrenament (0.91) i validació (0.63) — senyal d'overfitting — i la corba de validació continua pujant en afegir dades, és a dir, encara no ha convergit: cada exemple addicional continua millorant la generalització. Provar més algorismes (b) sense atacar la variància probablement reproduiria el mateix patró. Si la corba de validació estigués plana des del 40 %, la resposta seria la contrària: més historial no aportaria res i caldria canviar de model o de features.

Conclusió

Overfitting i underfitting són les dues maneres de fracassar d'un model — memoritzar l'examen o no estudiar-lo — i ja sabem distingir-les amb la parella d'errors entrenament/validació, entendre-les amb el compromís biaix-variància, localitzar el punt dolç de complexitat amb validation_curve, decidir si més dades ajudarien amb learning_curve i aplicar el remei correcte a cada diagnòstic. Amb aquesta lliçó es tanca el mòdul 6 i la seva checklist d'avaluació honesta: divisió neta, mètrica pactada, baseline, validació creuada, llindar amb criteri de negoci i diagnòstic d'ajust. La pregunta "és bo de veritat el meu model?" ja té resposta metodològica; la següent és "puc fer-lo encara millor?", i a això dediquem el mòdul 7: regularització per domar l'overfitting amb precisió quirúrgica, ensembles i gradient boosting per combinar models, xarxes profundes i l'optimització sistemàtica d'hiperparàmetres que automatitza les cerques que aquí hem fet a mà.

Curs de Machine Learning

Mòdul 1: Introducció al Machine Learning

Mòdul 2: Fonaments d'Estadística i Probabilitat

Mòdul 3: Preprocessament de Dades

Mòdul 4: Algorismes de Machine Learning Supervisat

Mòdul 5: Algorismes de Machine Learning No Supervisat

Mòdul 6: Avaluació i Validació de Models

Mòdul 7: Tècniques Avançades i Optimització

Mòdul 8: Implementació i Desplegament de Models

Mòdul 9: Projectes Pràctics

Mòdul 10: Recursos Addicionals

© Copyright 2026. Tots els drets reservats