En tancar el mòdul 3 vam deixar una promesa: en comptes de programar nosaltres l'algorisme que resol el problema, donaríem al sistema dades històriques perquè aprengués la regla pel seu compte. Aquesta lliçó compleix aquella promesa i obre el mòdul 4. Veurem què significa exactament "aprendre de dades" (amb la definició clàssica de Tom Mitchell), fixarem el vocabulari que farem servir en tot el mòdul (dataset, característica, etiqueta, model, paràmetres, pèrdua, generalització...), dibuixarem el flux de treball complet d'un projecte de machine learning com a mapa de les lliçons que vindran i discutirem quan val la pena fer servir ML i quan és millor una regla fixa. Acabarem entrenant el primer model "de debò" del curs amb scikit-learn: un predictor de devolucions de NovaMarket que compararem amb la regla manual del Diego ("risc si l'import supera els 300 €") i amb el llindar que vam aprendre a mà a 01-02. És important perquè tot el que ve després (tipus d'aprenentatge, preparació de dades, algorismes, avaluació, xarxes neuronals) es recolza en les idees i en el vocabulari d'aquesta lliçó.

Contingut

  1. Què és aprendre de dades: la definició de Mitchell
  2. D'aprendre_llindar a machine learning: res de nou sota el sol
  3. Vocabulari essencial
  4. El flux de treball d'un projecte de ML: mapa del mòdul
  5. Quan fer servir ML i quan no
  6. Exemple en Python: les dades de NovaMarket i el primer model amb scikit-learn
  7. Errors Comuns i Consells
  8. Exercicis
  9. Conclusió

  1. Què és aprendre de dades: la definició de Mitchell

A 01-02 vam veure que un programa tradicional rep dades + regles i produeix resultats, mentre que el machine learning rep dades + resultats i produeix regles (un model). Aquesta imatge és útil, però necessitem una definició operativa, que ens digui quan un programa "ha après". La més citada és la de Tom Mitchell (1997):

Un programa aprèn de l'experiència E respecte a una tasca T i una mesura de rendiment P si el seu rendiment en T, mesurat per P, millora amb E.

Aplicada al cas 3 de NovaMarket (predir si una comanda serà retornada):

Element Significat general A NovaMarket
Tasca T El que el sistema ha de fer Donada una comanda acabada de fer, dir si es retornarà (sí/no)
Experiència E Les dades de les quals aprèn L'històric de comandes.csv: comandes passades amb les seves característiques i si finalment es van retornar
Rendiment P Com mesurem si ho fa bé Percentatge d'encerts sobre comandes que el sistema no ha vist (i, més endavant, mesures millors que veurem a 04-05)

La definició té dues conseqüències pràctiques que convé interioritzar des del primer dia:

  • Sense mesura de rendiment no hi ha aprenentatge. "El model sembla que funciona" no vol dir res; cal definir P abans de començar. És la mateixa exigència de la mesura de rendiment de l'agent racional de 02-01.
  • La millora s'ha de mesurar amb dades noves. Un sistema que memoritza l'històric i encerta el 100 % de les comandes que ja ha vist no ha après res d'útil: el que importa és què fa amb la comanda de demà. Aquesta capacitat l'anomenarem generalització, i serà el fil de 04-05 i 04-06.

Fixa't que Mitchell no diu res d'"intel·ligència", ni de com s'aprèn. És una definició funcional: si el rendiment millora amb l'experiència, hi ha aprenentatge. Això encaixa amb la visió d'"actuar racionalment" que vam adoptar a 01-02.

  1. D'aprendre_llindar a machine learning: res de nou sota el sol

Ja vas fer machine learning a 01-02 sense dir-ne així. Recorda la funció aprendre_llindar(dades): recorria les 13 comandes històriques, provava cada import com a llindar candidat de la regla import_comanda > llindar, comptava els encerts de cadascun i es quedava amb el millor (120 €, que encertava 11 de 13, davant dels 7 de 13 de la regla del Diego). En termes de Mitchell:

  • T: decidir si una comanda té risc de devolució.
  • E: les 13 comandes amb el seu resultat real.
  • P: nombre d'encerts.

I en termes del mòdul 3, aprendre_llindar era una cerca exhaustiva (03-01) en un espai de 13 candidats amb una funció objectiu (els encerts) que calia maximitzar (03-04). Això és, exactament, el que fa qualsevol algorisme de machine learning, amb tres diferències de grau:

  1. La família de regles candidates és molt més rica que "un llindar sobre una columna": combinacions de moltes columnes, arbres de preguntes, sumes ponderades, xarxes de neurones.
  2. L'espai de cerca és tan gran (sovint infinit) que no es pot recórrer sencer; es fan servir les estratègies de 03-04, com l'ascens seguint el gradient, en lloc de la força bruta.
  3. La mesura de rendiment es calcula sobre dades apartades que l'algorisme no ha vist, per mesurar generalització i no memòria.

Per això vam tancar 03-04 amb la frase "aprendre és optimitzar": entrenar un model és cercar, en un espai enorme de models possibles, el que minimitza una funció d'error sobre les dades d'entrenament, i confiar que aquest model també funcioni amb dades noves. Tot el mòdul 4 és la versió adulta d'aprendre_llindar.

  1. Vocabulari essencial

Aquests són els termes que apareixeran a cada lliçó del mòdul. Els exemples estan trets del predictor de devolucions que construirem a la secció 6.

Terme Què és En el predictor de devolucions
Dataset (conjunt de dades) Taula amb els exemples dels quals s'aprèn Les 3.000 comandes d'un dia de NovaMarket
Instància / exemple / mostra Una fila del dataset Una comanda concreta
Característica (feature, atribut, variable d'entrada) Una columna que descriu la instància i que el model pot fer servir import_comanda, num_articles, dies_lliurament, client_nou, categoria
Etiqueta / objectiu (label, target, variable de sortida) El que volem predir retornat (1 = es va retornar, 0 = no)
Model La regla (funció) que va de les característiques a l'etiqueta "Si import > 195 € i client nou → retornat", o una suma ponderada de columnes
Paràmetres Els nombres interns del model que l'algorisme ajusta a partir de les dades El llindar 195 €, els pesos de cada columna
Hiperparàmetres Els ajustos de l'algorisme que fixa la persona abans d'entrenar Profunditat màxima de l'arbre, nombre de veïns, força de la regularització
Entrenament (ajust, fit) El procés de cercar els paràmetres que millor expliquen les dades model.fit(X_train, y_train)
Inferència / predicció Fer servir el model entrenat amb instàncies noves model.predict(comanda_de_dema)
Funció de pèrdua (cost, error) El nombre que l'entrenament intenta minimitzar: mesura quant s'equivoca el model en l'entrenament Nombre de comandes mal classificades; en logística, la "pèrdua logarítmica"
Generalització Que el model funcioni bé amb dades que no ha vist Encertar en les comandes de demà, no només en les d'ahir

Dos aclariments que estalvien confusions freqüents:

  • Paràmetres davant hiperparàmetres. A aprendre_llindar, el llindar era el paràmetre (el triaven les dades); si haguéssim decidit "només provarem llindars múltiples de 10", això hauria estat un hiperparàmetre (el triem nosaltres). Els paràmetres s'aprenen; els hiperparàmetres s'ajusten provant i validant (04-06).
  • Pèrdua davant mesura de rendiment. La pèrdua és el que l'algorisme minimitza per dins durant l'entrenament; la mesura de rendiment (P) és el que a nosaltres ens importa al final (encerts, euros estalviats). De vegades coincideixen i de vegades no: es minimitza una pèrdua matemàticament còmoda i s'avalua amb la mètrica de negoci (04-05).

Un últim conveni de notació que veuràs a tota la literatura i a scikit-learn: la taula de característiques s'anomena X (majúscula, perquè és una matriu de files × columnes) i el vector d'etiquetes s'anomena y (minúscula, perquè és una sola columna).

  1. El flux de treball d'un projecte de ML: mapa del mòdul

Entrenar el model és només un pas, i ni tan sols el més llarg, d'un projecte de machine learning. El flux complet s'assembla molt al cicle de l'agent de 02-01, però aplicat a construir el model:

flowchart LR
    A[1. Definir el problema<br/>T, E, P] --> B[2. Obtenir les dades]
    B --> C[3. Preparar dades i<br/>característiques]
    C --> D[4. Entrenar el model]
    D --> E[5. Avaluar i validar]
    E -->|no n'hi ha prou| C
    E -->|no n'hi ha prou| D
    E -->|és suficient| F[6. Desplegar]
    F --> G[7. Monitorar]
    G -->|les dades canvien| B

Cada pas té la seva lliçó en aquest mòdul o en un altre del curs:

Pas Què es fa On s'aprofundeix
1. Definir el problema Traduir la necessitat de negoci a T, E, P; decidir si és classificació, regressió, agrupament... Aquesta lliçó i 04-02 (tipus d'aprenentatge)
2. Obtenir les dades Localitzar les fonts, unir-les, comprovar volum, qualitat, biaix i aspectes legals 02-03 (ja vist)
3. Preparar dades i característiques Netejar, codificar, escalar, crear variables noves, evitar fuites d'informació 04-03
4. Entrenar el model Triar un algorisme i ajustar-lo a les dades 04-04 (algorismes clàssics), mòdul 5 (xarxes neuronals)
5. Avaluar i validar Mesurar el rendiment amb dades no vistes amb les mètriques adequades; comparar amb una línia base 04-05
5 bis. Ajustar Detectar sobreajust, regularitzar, ajustar hiperparàmetres, tornar a entrenar 04-06
6. Desplegar Integrar el model en el sistema (el web, el gestor de comandes), amb revisió humana on toqui 08-01 i 09-04
7. Monitorar Vigilar que el rendiment no es degradi quan canvien les dades (productes nous, nova temporada) 08-01

Dues observacions sobre el diagrama:

  • És un cicle, no una línia. Gairebé mai s'encerta a la primera: l'avaluació revela que falten característiques, que hi ha una fuita d'informació o que el model se sobreajusta, i es torna enrere. La Marta ha de planificar iteracions.
  • L'entrenament és la part petita. En un projecte real, el pas 3 s'emporta la major part del temps, i el 7 és el que s'oblida més sovint i més car surt. La lliçó 08-01 recorre aquest mateix flux com un projecte complet, amb rols, lliurables i decisions.

  1. Quan fer servir ML i quan no

El Diego, amb raó, pregunta per què NovaMarket necessita un model quan ja té una regla que "funciona". El machine learning no és sempre la resposta; de vegades una regla fixa (o una consulta SQL) és millor. Aquests són els senyals:

Situació Regles fixes (programació tradicional) Machine learning
La regla és coneguda, simple i estable Sí. "Si la comanda pesa més de 30 kg, va per transportista" no necessita aprendre res No aporta i afegeix incertesa
La regla és difícil d'escriure però hi ha exemples abundants Centenars d'if fràgils Sí: reconèixer un frau, classificar una ressenya, preveure la demanda
Els patrons canvien amb el temps Cal reescriure la regla cada vegada Sí: es reentrena amb dades noves
Hi ha moltes variables que interactuen Inabastable a mà Sí: el model combina desenes de columnes
Hi ha poques dades o de mala qualitat Sí, recolzada en coneixement expert (mòdul 6) Risc alt: aprendrà soroll
S'exigeix explicació exacta de cada decisió (legal, contractual) Sí, o ML amb models interpretables i revisió humana (02-04) Depèn del model: un arbre s'explica; una xarxa profunda, molt menys
El cost d'un error és catastròfic Regles verificables, o ML només com a suport Només amb validació molt rigorosa i humà al bucle

Aplicat als nou casos d'ús de NovaMarket que vam catalogar a 01-03: la predicció de devolucions (3), la previsió de demanda (2), la recomanació (1) i la classificació de ressenyes (4) són candidats clars a ML (molts exemples, patrons difícils d'escriure, canvien amb el temps). Les rutes (5) i l'assignació (6) les vam resoldre al mòdul 3 amb optimització, sense aprendre res. Les regles de devolucions i garanties (8) són, precisament, regles fixes: es resolen amb lògica i sistemes experts (mòdul 6). Triar bé l'eina és la primera decisió del pas 1 del flux.

Una regla d'or pràctica: comença sempre per la regla més simple possible com a línia base (la del Diego, per exemple) i exigeix al model que la superi de manera mesurable. Ho farem ara mateix.

  1. Exemple en Python: les dades de NovaMarket i el primer model amb scikit-learn

Com a la resta del curs, no disposem del comandes.csv real, així que generarem comandes fictícies amb codi. L'important és que la funció generadora sigui reproduïble (mateixa llavor, mateixes dades) i que codifiqui una relació realista però amb soroll, com passa a la realitat: les comandes cares, de clients nous, amb lliuraments lents i d'electrònica es retornen més, però cap regla encerta sempre. Reutilitzarem aquesta funció a totes les lliçons del mòdul, així que desa-la en un fitxer novamarket_ml.py.

6.1 La funció generadora generar_comandes_ml

import numpy as np
import pandas as pd

def generar_comandes_ml(n=3000, llavor=42):
    """Genera n comandes ficticies de NovaMarket amb l'etiqueta 'retornat' (1 = retornada)."""
    rng = np.random.default_rng(llavor)           # generador reproduible
    import_comanda = np.round(rng.gamma(shape=2.0, scale=60.0, size=n) + 5, 2)   # euros, cua llarga
    num_articles = rng.integers(1, 6, size=n)     # d'1 a 5 articles
    dies_lliurament = rng.integers(1, 8, size=n)  # d'1 a 7 dies
    client_nou = rng.random(n) < 0.30             # el 30 % son clients nous
    categoria = rng.choice(["electronica", "llar", "informatica", "accessoris"],
                           size=n, p=[0.35, 0.30, 0.20, 0.15])
    zona = rng.choice(["A", "B", "C"], size=n, p=[0.40, 0.35, 0.25])
    # "Veritat oculta": probabilitat de devolucio que el model haura de descobrir
    z = (-3.4
         + 0.010 * (import_comanda - 100)         # mes import, mes risc
         + 1.6 * client_nou                       # els clients nous retornen mes
         + 0.35 * (dies_lliurament - 4)           # els lliuraments lents es retornen mes
         + 1.0 * (categoria == "electronica")
         + 0.5 * (categoria == "informatica")
         - 0.2 * (num_articles - 2)               # comandes grans, una mica menys
         + 1.2 * client_nou * (import_comanda - 100) / 100)   # nou + car: risc extra
    prob = 1 / (1 + np.exp(-z))                   # sigmoide: de z a probabilitat
    retornat = (rng.random(n) < prob).astype(int) # sorteig amb aquesta probabilitat (soroll)
    return pd.DataFrame({
        "import_comanda": import_comanda,
        "num_articles": num_articles,
        "dies_lliurament": dies_lliurament,
        "client_nou": client_nou.astype(int),
        "categoria": categoria,
        "codi_postal_zona": zona,                 # NO influeix en la devolucio
        "retornat": retornat,
    })

comandes = generar_comandes_ml(3000, 42)
print(comandes.head())
print(comandes["retornat"].value_counts(normalize=True).round(3))

Sortida:

   import_comanda  num_articles  dies_lliurament  client_nou    categoria codi_postal_zona  retornat
0          130.51             4                4           1         llar                B         0
1          175.12             5                7           0  informatica                B         0
2          115.23             2                2           1  electronica                A         0
3          103.70             3                2           1         llar                C         0
4          189.76             3                6           0   accessoris                A         0
retornat
0    0.836
1    0.164

Explicació línia a línia:

  • np.random.default_rng(llavor) crea un generador de nombres aleatoris amb llavor fixa: cada vegada que cridis la funció amb la mateixa llavor obtindràs exactament les mateixes comandes. És imprescindible perquè els teus resultats i els d'aquesta lliçó coincideixin (llevat de petites diferències entre versions de NumPy).
  • Cada columna es genera amb una distribució raonable: els imports segueixen una distribució gamma (moltes comandes petites i una cua de comandes cares, mitjana al voltant dels 125 €), els articles i els dies de lliurament són enters uniformes, el 30 % de clients són nous, i la categoria i la zona se sortegen amb probabilitats fixes.
  • La variable z és la veritat oculta: una puntuació de risc que combina les columnes amb pesos que nosaltres hem triat. Al món real aquesta fórmula no existeix o ningú no la coneix; aquí l'escrivim per poder comprovar després si el model la descobreix. Fixa't que codi_postal_zona no apareix a z: la zona no influeix en la devolució. Ho fem expressament, recordant el biaix per codi postal de 02-04; a 04-03 comprovarem que un bon model li dona una importància pràcticament nul·la.
  • prob = 1 / (1 + np.exp(-z)) converteix la puntuació en una probabilitat entre 0 i 1 (aquesta funció, la sigmoide, reapareix a 04-04 amb la regressió logística i al mòdul 5).
  • retornat es decideix amb un sorteig segons aquesta probabilitat. Això introdueix soroll: dues comandes idèntiques poden acabar l'una retornada i l'altra no. Cap model, per bo que sigui, encertarà el 100 %; convé saber-ho abans de perseguir impossibles.
  • El resultat és un DataFrame de pandas (una taula), amb un 16,4 % de comandes retornades. A 04-05 veurem que aquest desequilibri (molts més "no" que "sí") condiciona com cal avaluar.

6.2 El primer model: fit, predict, score

Entrenarem un arbre de decisió amb scikit-learn. No entrarem en com funciona per dins (això és 04-04); ara ens interessa el patró d'ús, que és idèntic per a tots els models de la llibreria. Farem servir només les columnes numèriques; les de text (categoria, codi_postal_zona) necessiten una transformació prèvia que veurem a 04-03.

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

columnes = ["import_comanda", "num_articles", "dies_lliurament", "client_nou"]
X = comandes[columnes]         # caracteristiques (matriu de 3000 files x 4 columnes)
y = comandes["retornat"]       # etiqueta (vector de 3000 valors 0/1)

# 1) Apartem el 25 % de les comandes: el model NO les veura durant l'entrenament
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y)

# 2) Triem l'algorisme i els seus hiperparametres
model = DecisionTreeClassifier(max_depth=3, random_state=42)

# 3) Entrenem: l'algorisme cerca els parametres (les preguntes de l'arbre)
model.fit(X_train, y_train)

# 4) Mesurem el rendiment P: proporcio d'encerts
print(f"Encert en entrenament: {model.score(X_train, y_train):.3f}")
print(f"Encert en test:        {model.score(X_test, y_test):.3f}")

# 5) Inferencia amb comandes noves
noves = pd.DataFrame({"import_comanda": [45.0, 350.0, 180.0],
                      "num_articles": [2, 1, 3],
                      "dies_lliurament": [2, 6, 5],
                      "client_nou": [0, 1, 1]})
print(model.predict(noves))                 # 0 = no es retornara, 1 = si
print(model.predict_proba(noves).round(2))  # probabilitat de cada classe

Sortida:

Encert en entrenament: 0.873
Encert en test:        0.868
[0 1 0]
[[0.95 0.05]
 [0.05 0.95]
 [0.52 0.48]]

Pas a pas:

  1. train_test_split barreja les comandes i les reparteix en entrenament (2.250) i test (750). random_state=42 fixa la barreja perquè sigui reproduïble; stratify=y garanteix que tots dos trossos tinguin la mateixa proporció de devolucions (16,4 %). El conjunt de test és l'"experiència futura" amb què mesurarem la generalització; no es toca fins al final. La raó de fons es desenvolupa a 04-05.
  2. DecisionTreeClassifier(max_depth=3) crea el model encara buit. max_depth=3 és un hiperparàmetre: com a màxim tres preguntes encadenades. El triem nosaltres; a 04-06 aprendrem a triar-lo amb dades.
  3. model.fit(X_train, y_train) és l'entrenament: la cerca dels paràmetres (quina columna preguntar a cada node i amb quin llindar) que millor separen les comandes retornades de les no retornades. És la versió sofisticada d'aprendre_llindar, i a 04-04 veurem exactament què optimitza.
  4. model.score(X, y) calcula la proporció d'encerts (accuracy). En entrenament encerta el 87,3 % i en test el 86,8 %: xifres semblants, senyal que el model generalitza i no memoritza (a 04-06 veurem què passa quan no és així).
  5. predict retorna la classe (0 o 1) de cada comanda nova, i predict_proba la probabilitat estimada de cada classe. La comanda de 350 € d'un client nou té un 95 % de probabilitat de devolució; la de 180 € està gairebé al 50 %, un cas clar per a la banda de revisió humana de 02-04.

Aquest patró (fitpredict/predict_probascore) és el mateix per a una regressió logística, un bosc aleatori o una màquina de vectors de suport: canvia l'algorisme, no la interfície. És una de les raons de l'èxit de scikit-learn, que es presenta com a eina a 07-03.

6.3 Comparació amb la regla del Diego i amb la regla de 01-02

Avaluem les regles anteriors sobre el mateix conjunt de test, per comparar en igualtat de condicions:

def encert_regla(llindar):
    prediccio = (X_test["import_comanda"] > llindar).astype(int)   # 1 si supera el llindar
    return (prediccio == y_test).mean()                             # proporcio d'encerts

print(f"Regla del Diego (> 300 €):         {encert_regla(300):.3f}")
print(f"Regla apresa a 01-02 (> 120 €):    {encert_regla(120):.3f}")
print(f"'Mai no es retorna':               {(y_test == 0).mean():.3f}")
print(f"Arbre de decisio:                  {model.score(X_test, y_test):.3f}")

pred_arbre = model.predict(X_test)
pred_diego = (X_test["import_comanda"] > 300).astype(int)
for nom, pred in [("arbre", pred_arbre), ("Diego", pred_diego)]:
    detectades = ((pred == 1) & (y_test == 1)).sum()
    print(f"{nom}: marca {pred.sum()} comandes, {detectades} d'elles retornades de debo "
          f"(hi ha {y_test.sum()} devolucions en test)")

Sortida:

Regla del Diego (> 300 €):         0.843
Regla apresa a 01-02 (> 120 €):    0.627
'Mai no es retorna':               0.836
Arbre de decisio:                  0.868
arbre: marca 52 comandes, 38 d'elles retornades de debo (hi ha 123 devolucions en test)
Diego: marca 37 comandes, 21 d'elles retornades de debo (hi ha 123 devolucions en test)

Lectura dels resultats:

  • La regla del Diego encerta el 84,3 %... però la regla "cap comanda no es retorna" encerta el 83,6 %. Com que només el 16 % de les comandes es retorna, encertar molt és fàcil: n'hi ha prou amb dir sempre que no. El Diego amb prou feines millora aquesta trivialitat. Aquesta trampa de l'exactitud amb classes desequilibrades és el punt de partida de 04-05; de moment, queda't amb la idea que la xifra d'encerts, sola, enganya.
  • La regla de 01-02 (llindar 120 €) surt molt pitjor aquí (62,7 %). No és que aquell aprenentatge estigués malament: és que es va aprendre amb 13 exemples triats amb cura i no generalitza a un històric realista de 3.000 comandes, en què la majoria de les comandes de més de 120 € no es retorna. És la lliçó de la secció 1: poques dades, model poc fiable.
  • L'arbre encerta el 86,8 %, la millor xifra, i sobretot fa una cosa qualitativament diferent: combina l'import amb si el client és nou i amb els dies de lliurament. Marca 52 comandes i encerta en 38 (73 %), mentre que el Diego en marca 37 i encerta en 21 (57 %). Detecta gairebé el doble de devolucions amb menys falses alarmes. Tot i així, se li escapen 85 de les 123 devolucions: la millora és real, però queda molta feina, i aquesta feina és la resta del mòdul (més característiques a 04-03, millors algorismes a 04-04, un llindar ajustat al cost a 04-05, hiperparàmetres a 04-06).

El Diego, escèptic, farà la pregunta correcta: "i què ha après exactament l'arbre?". Ho pots veure amb from sklearn.tree import export_text; print(export_text(model, feature_names=columnes)). Veuràs regles del tipus "si import > 195 € i client nou → retornat; si import > 358 € → retornat". És a dir, l'arbre ha descobert que el Diego no anava desencaminat (les comandes molt cares sí que es retornen), però que per a clients nous el llindar de risc baixa a uns 195 €. A 04-04 llegirem arbres amb detall.

Errors Comuns i Consells

  • Avaluar amb les mateixes dades amb què s'entrena. És l'error número u de qui comença. Un model que memoritza encerta el 100 % del que ja ha vist i falla estrepitosament amb el que és nou. Aparta sempre un conjunt de test abans d'entrenar i no el miris fins al final.
  • Confondre paràmetres amb hiperparàmetres. Els paràmetres els ajusta fit; els hiperparàmetres els fixes tu en crear el model (max_depth=3). Si et trobes "provant valors a mà" d'alguna cosa, és un hiperparàmetre, i 04-06 et donarà el mètode per fer-ho bé.
  • Oblidar la línia base. Compara sempre amb la regla més ximple raonable ("mai no es retorna", "la mitjana de la setmana passada") i amb la regla manual vigent. Un model que no les supera de manera clara no mereix desplegar-se.
  • Refiar-se de la xifra d'encerts. Amb classes desequilibrades, el 84 % de la regla del Diego i el 83,6 % de "mai" són gairebé el mateix. Espera't a 04-05 abans de treure conclusions fortes d'una sola xifra.
  • Saltar directament a l'algorisme. El flux de la secció 4 comença per definir T, E i P i per conèixer les dades. La Marta dedicarà molt més temps a preparar les dades (04-03) que a cridar fit.
  • Fixar la llavor i oblidar-se'n. random_state=42 fa els teus experiments reproduïbles, però no vol dir que el resultat sigui "el bo": prova diverses llavors abans d'afirmar que un model és millor que un altre. Les sortides d'aquesta lliçó poden variar lleugerament segons la versió de NumPy o scikit-learn.

Exercicis

Exercici 1. Formula amb la definició de Mitchell (T, E, P) dos dels casos d'ús de NovaMarket diferents del de devolucions: la previsió de demanda (cas 2) i la classificació de ressenyes (cas 4). Indica en cadascun què serien les característiques, l'etiqueta i una instància.

Exercici 2. Canvia l'hiperparàmetre max_depth de l'arbre a 1 i torna a entrenar. Mostra les regles amb export_text i compara l'encert en test amb la regla "mai no es retorna". Quin llindar ha triat l'arbre d'una sola pregunta? Per què un sol llindar sobre import_comanda no aconsegueix superar "mai" en aquest dataset, quan a 01-02 sí que superava el Diego?

Exercici 3. Genera un segon dataset amb una altra llavor (generar_comandes_ml(3000, 7)) i avalua-hi l'arbre ja entrenat (sense tornar a cridar fit), com si fossin les comandes de la setmana següent. Es manté l'encert? Què et diu això sobre la generalització? Repeteix-ho després avaluant la regla del Diego sobre aquestes mateixes dades.

Solucions

Solució 1.

  • Previsió de demanda. T: predir quantes unitats d'un producte es vendran la setmana que ve. E: l'històric setmanal de vendes (comandes.csv agregat per producte i setmana), amb calendari i promocions. P: error mitjà en unitats entre el que s'ha previst i el que s'ha venut (a 04-05 en direm MAE). Una instància és "producte X, setmana Y"; les característiques, la setmana de l'any, les vendes de les setmanes anteriors, si hi ha promoció; l'etiqueta, les unitats venudes aquella setmana (un nombre, no una categoria: és un problema de regressió, 04-02).
  • Classificació de ressenyes. T: decidir si una ressenya de ressenyes.csv és positiva, neutra o negativa (o si esmenta un problema d'enviament). E: ressenyes passades etiquetades a mà. P: percentatge de ressenyes ben classificades, o millor, mesures per classe (04-05). Una instància és una ressenya; les característiques, el text (transformat en nombres, 04-03) i la puntuació en estrelles; l'etiqueta, la classe assignada.

Solució 2. Amb max_depth=1 l'arbre tria la pregunta import_comanda <= 195.65 i en totes dues branques prediu la classe 0, així que el seu encert en test és 0,836, idèntic al de "mai no es retorna". Fins i tot per sobre de 195 € la majoria de les comandes no es retorna (la taxa allà ronda el 40 %), de manera que, si només es pot fer una pregunta i es busca maximitzar encerts, el millor és dir "no" sempre. A 01-02 l'històric de 13 comandes estava equilibrat (gairebé la meitat retornades), i per això un llindar sí que guanyava. Moralitat: la mateixa família de models es comporta de manera diferent segons la proporció de classes; i per detectar devolucions cal combinar variables (profunditat 3 ja ho aconsegueix) i fer servir mesures millors que l'exactitud (04-05).

Solució 3. Amb noves = generar_comandes_ml(3000, 7) i model.score(noves[columnes], noves["retornat"]) obtindràs al voltant de 0,88, fins i tot una mica per sobre del 0,868 del test: el model generalitza a comandes que mai no ha vist perquè les dades noves segueixen la mateixa "veritat oculta". La regla del Diego es queda de nou a prop del 0,85 (i la de "mai" al voltant de 0,84). Si a la realitat canviessin les condicions (una campanya amb molts clients nous, un nou proveïdor amb més defectes), la generalització deixaria d'estar garantida: per això el pas 7 del flux, el monitoratge, existeix.

Conclusió

En aquesta lliçó hem definit el machine learning amb la fórmula de Mitchell (tasca, experiència, rendiment), hem comprovat que aprendre_llindar de 01-02 ja complia aquesta definició i que "aprendre és optimitzar" (03-04) és literalment el que fa fit, hem fixat el vocabulari del mòdul (dataset, instància, característica, etiqueta, model, paràmetres davant hiperparàmetres, entrenament, inferència, funció de pèrdua, generalització), hem dibuixat el flux de treball complet com a mapa de les lliçons que vindran i hem discutit quan el ML compensa davant d'una regla fixa. En el codi hem creat la funció generar_comandes_ml, que ens acompanyarà tot el mòdul, i hem entrenat el primer model de scikit-learn amb el patró fit/predict/score, que supera la regla del Diego combinant diverses columnes, tot i que encara deixa escapar moltes devolucions i ens ha ensenyat que la xifra d'encerts, sola, enganya.

A la lliçó següent, Tipus d'Aprenentatge Automàtic, classificarem els problemes que pot resoldre el ML: el predictor de devolucions és un exemple d'aprenentatge supervisat de classificació; la previsió de demanda serà supervisat de regressió; la segmentació de clients per al recomanador serà no supervisat; i veurem també l'aprenentatge per reforç, que connecta amb els agents de 02-01 i amb AlphaGo. La Marta i el Diego tindran així un mapa per decidir, davant de cadascun dels nou casos d'ús, quin tipus d'aprenentatge necessiten.

Fonaments d'Intel·ligència Artificial (IA)

Mòdul 1: Introducció a la Intel·ligència Artificial

Mòdul 2: Principis Bàsics de la IA

Mòdul 3: Algorismes en IA

Mòdul 4: Aprenentatge Automàtic (Machine Learning)

Mòdul 5: Xarxes Neuronals i Deep Learning

Mòdul 6: Lògica i Sistemes Experts

Mòdul 7: Eines i Llenguatges de Programació en IA

Mòdul 8: Projectes i Casos d'Estudi

Mòdul 9: Exercicis i Pràctiques

Mòdul 10: Recursos Addicionals

© Copyright 2026. Tots els drets reservats