A la lliçó anterior vam entrenar el primer model del curs: un arbre que aprenia, a partir de comandes etiquetades com a retornades o no, a predir l'etiqueta de comandes noves. Aquest és només un dels tipus de problema que el machine learning sap resoldre. Quan la Marta revisa la llista dels nou casos d'ús de NovaMarket descobreix que no tots tenen la mateixa forma: en uns hi ha una resposta correcta coneguda per a cada exemple històric (es va retornar?, quantes unitats es van vendre?), en d'altres no hi ha cap etiqueta i el que es busca és estructura (quins tipus de clients tenim?), i en d'altres ni tan sols hi ha un dataset fix, sinó un sistema que actua i rep premis o càstigs (quin cupó convé oferir?). Aquesta lliçó presenta els quatre grans paradigmes de l'aprenentatge automàtic (supervisat, no supervisat, semi i autosupervisat, i per reforç), els compara en una taula i els il·lustra amb codi sobre les dades de NovaMarket. És important perquè la primera decisió de qualsevol projecte és identificar quin tipus de problema tenim: en depenen les dades que cal reunir, els algorismes aplicables i la manera de mesurar l'èxit.

Contingut

  1. Els quatre paradigmes d'un cop d'ull
  2. Aprenentatge supervisat: classificació i regressió
  3. Aprenentatge no supervisat: clustering, reducció de dimensionalitat i anomalies
  4. Semisupervisat i autosupervisat
  5. Aprenentatge per reforç
  6. Taula comparativa de paradigmes
  7. Exemples en Python: classificació, regressió, clustering i un bandit multibraç
  8. Errors Comuns i Consells
  9. Exercicis
  10. Conclusió

  1. Els quatre paradigmes d'un cop d'ull

La manera més útil de classificar els problemes de ML és preguntar-se quina informació de "resposta correcta" tenim a les dades:

flowchart TD
    Q{Què sabem de cada exemple?}
    Q -->|Característiques + resposta correcta| S[Supervisat]
    Q -->|Només característiques, sense resposta| U[No supervisat]
    Q -->|Resposta només en una part dels exemples| SS[Semisupervisat /<br/>autosupervisat]
    Q -->|No hi ha dataset fix: el sistema actua<br/>i rep recompenses| R[Reforç]
    S --> S1[Classificació: la resposta és una categoria]
    S --> S2[Regressió: la resposta és un nombre]
    U --> U1[Clustering: agrupar]
    U --> U2[Reducció de dimensionalitat: comprimir]
    U --> U3[Detecció d'anomalies: el que és rar]

En el vocabulari de 04-01: el paradigma depèn de si tenim l'etiqueta (y), de si la tenim per a totes les instàncies o només per a algunes, o de si l'"etiqueta" és una recompensa que arriba després d'actuar.

  1. Aprenentatge supervisat: classificació i regressió

És el paradigma més utilitzat a l'empresa i el que ocuparà la major part del mòdul. Supervisat vol dir que cada exemple d'entrenament porta la seva resposta correcta, com si un supervisor hagués corregit l'exercici: el model aprèn la funció que va de les característiques a l'etiqueta i després l'aplica a exemples nous.

Es divideix en dos segons el tipus d'etiqueta:

Classificació Regressió
L'etiqueta és... Una categoria d'un conjunt finit Un nombre continu
Pregunta típica De quin tipus és? Sí o no? Quant? Quan?
Sortida del model Classe (i normalment una probabilitat per classe) Un valor numèric
Exemples NovaMarket Es retornarà la comanda? (cas 3) · La ressenya és positiva/neutra/negativa? (cas 4) · A quina categoria d'incidència pertany aquest tiquet? (cas 9) Quantes unitats vendrem la setmana que ve? (cas 2) · Quin serà l'import de la propera compra d'aquest client? · Quants dies trigarà el lliurament?
Com es mesura (04-05) Encerts, precisió, sensibilitat, AUC Error mitjà (MAE), error quadràtic (RMSE), R²

Matisos que convé tenir clars:

  • Binària vs multiclasse. "Retornat sí/no" és classificació binària; "ressenya positiva/neutra/negativa" és multiclasse (tres classes excloents). Hi ha a més la classificació multietiqueta, en què un exemple pot tenir diverses etiquetes alhora (una incidència pot ser "retard" i "producte danyat").
  • La frontera és la pregunta, no la dada. L'import d'una comanda és un nombre; predir-lo és regressió. Però "la comanda superarà els 100 €?" és classificació. Una mateixa dada admet totes dues formulacions, i triar bé depèn de la decisió de negoci que es prendrà.
  • La previsió de demanda és regressió sobre sèries temporals. Té una peculiaritat, l'ordre en el temps, que obliga a validar de manera especial (04-05) i que ofereix característiques pròpies (setmana de l'any, vendes de la setmana anterior: 04-03).

  1. Aprenentatge no supervisat: clustering, reducció de dimensionalitat i anomalies

Aquí no hi ha etiqueta. Només tenim les característiques de cada exemple, i el que demanem a l'algorisme és que descobreixi estructura: grups, direccions principals, casos rars. És la situació més freqüent a la pràctica (etiquetar costa diners: algú ha de llegir i classificar cada ressenya) i la que més cura exigeix a l'hora d'interpretar, perquè no hi ha resposta correcta amb què comprovar.

Tres tasques principals:

Tasca Què fa Exemple NovaMarket Algorismes típics
Clustering (agrupament) Reparteix els exemples en grups de manera que els d'un mateix grup s'assemblin entre si més que als dels altres Segmentar els clients de clients.csv en "ocasionals", "habituals" i "grans compradors" per adaptar el recomanador (cas 1) i les campanyes k-means, clustering jeràrquic, DBSCAN
Reducció de dimensionalitat Comprimeix moltes columnes en poques conservant l'essencial, per visualitzar o per simplificar un model posterior Resumir 50 variables de comportament de compra en 2 eixos per dibuixar el mapa de clients PCA, t-SNE, UMAP
Detecció d'anomalies Troba exemples que s'aparten del patró general Comandes amb una combinació d'import, hora i adreça mai vista (possible frau, cas 3, quan no hi ha etiquetes de frau confirmat) Isolation Forest, One-Class SVM, distància als veïns

Un avís que la Marta repetirà al Diego: un algorisme de clustering sempre retorna grups, encara que les dades no tinguin estructura. Que k-means digui que hi ha tres segments no demostra que existeixin; cal mirar-los, posar-los nom de negoci i comprovar que es comporten de manera diferent (a la secció 7 ho farem). A 04-04 veurem com funciona k-means per dins i com triar el nombre de grups.

  1. Semisupervisat i autosupervisat

Entre els dos extrems hi ha situacions intermèdies molt comunes:

  • Semisupervisat. Tenim etiquetes per a una part petita de les dades i molts exemples sense etiquetar. És la situació d'incidencies.csv a NovaMarket: l'equip de suport ha classificat a mà la meitat dels tiquets de l'últim trimestre (retard, producte danyat, error de comanda, garantia...) i l'altra meitat està sense categoria. En comptes de llençar la meitat sense etiqueta, els mètodes semisupervisats la fan servir per aprendre millor l'estructura del text i propagar les etiquetes als exemples semblants (per exemple, entrenar amb els etiquetats, predir la resta, quedar-se amb les prediccions més segures com a "pseudoetiquetes" i reentrenar).
  • Autosupervisat. No hi ha etiquetes humanes, però la mateixa dada proporciona el senyal de supervisió: s'oculta una part de l'exemple i es demana al model que la reconstrueixi. És com els grans models de llenguatge aprenen a partir de text sense etiquetar (predir la paraula següent o la paraula tapada), i com es preentrenen molts models d'imatge. És la raó que la IA generativa hagi enlairat: converteix oceans de dades sense etiquetar en experiència útil. Es desenvolupa a 05-05.

Tots dos apareixen aquí només perquè reconeguis la situació quan la trobis; en aquest curs treballarem sobretot amb supervisat i no supervisat.

  1. Aprenentatge per reforç

El quart paradigma és diferent dels anteriors: no hi ha un dataset fix. Hi ha un agent (02-01) que actua en un entorn, observa l'estat, tria una acció i rep una recompensa (positiva o negativa), i el seu objectiu és aprendre una política (quina acció prendre en cada estat) que maximitzi la recompensa acumulada a llarg termini.

Els elements, amb l'exemple conceptual d'un agent que decideix quin cupó oferir a cada client en el moment del pagament:

Element Definició Exemple del cupó
Agent Qui decideix El sistema de cupons del web
Entorn Tot el que l'agent no controla però l'afecta Els clients i el seu comportament
Estat La informació que veu l'agent en decidir Import de la cistella, si el client és nou, hora, categoria
Acció El que pot fer No oferir cupó / 5 % / enviament gratis / 10 %
Recompensa El senyal que indica com de bé va anar l'acció Marge de la compra (més venda, menys cost del cupó); 0 si abandona
Política La regla apresa estat → acció "A cistelles grans de clients nous, enviament gratis; a habituals, res"

Dues idees pròpies del reforç:

  • Exploració davant explotació. L'agent només aprèn de les accions que prova. Si des del principi es queda amb el cupó que sembla millor (explotar), mai no sabrà si un altre hauria funcionat més; si prova a l'atzar tota l'estona (explorar), malbarata recompensa. Cal equilibrar: l'estratègia més simple, epsilon-greedy, explora una fracció ε de les vegades i explota la resta. La veurem en codi.
  • Recompensa retardada. Sovint el premi arriba molt després de l'acció que el va causar (als escacs, la victòria arriba després de quaranta jugades). Assignar el mèrit a les accions correctes (el credit assignment) és la part difícil, i la resolen algorismes com Q-learning o els mètodes de gradient de política, fora de l'abast d'aquest curs.

Connexions amb el que ja hem vist: el marc agent-entorn-recompensa és el PEAS de 02-01 amb la mesura de rendiment convertida en senyal d'aprenentatge; i AlphaGo (01-01, 03-03) va combinar la cerca amb adversari que vam estudiar amb minimax amb xarxes neuronals entrenades per reforç jugant milions de partides contra si mateix. També s'aplica en robòtica, control de sistemes (refrigeració de centres de dades, trànsit) i, més recentment, en l'ajust fi dels grans models de llenguatge a partir de preferències humanes (05-05).

  1. Taula comparativa de paradigmes

Paradigma Tipus de dades Objectiu Exemples NovaMarket Algorismes típics Com s'avalua
Supervisat: classificació Característiques + etiqueta categòrica Predir la classe Devolució sí/no; sentiment de ressenyes; tipus d'incidència Regressió logística, arbres, boscos, SVM, k-NN, xarxes Encerts, precisió/sensibilitat, AUC (04-05)
Supervisat: regressió Característiques + etiqueta numèrica Predir un valor Demanda setmanal; import de la propera compra; dies de lliurament Regressió lineal, arbres/boscos de regressió, gradient boosting, xarxes MAE, RMSE, R² (04-05)
No supervisat Només característiques Trobar estructura Segments de clients; anomalies en comandes; compressió de variables k-means, jeràrquic, DBSCAN, PCA, Isolation Forest Cohesió dels grups, interpretació de negoci; no hi ha "encert"
Semi / autosupervisat Poques etiquetes + molts sense etiquetar; o la dada com la seva pròpia etiqueta Aprofitar les dades sense etiquetar Incidències a mig etiquetar; preentrenar sobre tot el text de ressenyes Autoentrenament, propagació d'etiquetes; models preentrenats Com el supervisat en la part etiquetada
Reforç Interacció: estat, acció, recompensa Aprendre una política que maximitzi la recompensa acumulada Quin cupó oferir; ajust dinàmic de preus; control de la flota Bandits, Q-learning, gradient de política Recompensa acumulada davant d'una política de referència

  1. Exemples en Python: classificació, regressió, clustering i un bandit multibraç

Els quatre exemples són deliberadament curts: l'objectiu és reconèixer la forma de cada tipus de problema. Els algorismes s'expliquen a 04-04 i l'avaluació correcta a 04-05; aquí farem servir mesures provisionals. Suposem que la funció generar_comandes_ml de 04-01 està desada a novamarket_ml.py.

7.1 Classificació: retornat sí/no

Repetim el problema de 04-01 amb un altre algorisme (regressió logística) per comprovar que la interfície és idèntica:

from novamarket_ml import generar_comandes_ml
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

comandes = generar_comandes_ml(3000, 42)
columnes = ["import_comanda", "num_articles", "dies_lliurament", "client_nou"]
X_train, X_test, y_train, y_test = train_test_split(
    comandes[columnes], comandes["retornat"], test_size=0.25, random_state=42,
    stratify=comandes["retornat"])

clf = LogisticRegression(max_iter=1000).fit(X_train, y_train)   # entrenar
print("Encerts en test:", round(clf.score(X_test, y_test), 3))

exemple = X_test.iloc[[0]]              # la primera comanda del conjunt de test
print(exemple)
print("Prediccio:", clf.predict(exemple), "Probabilitats:", clf.predict_proba(exemple).round(3))

Sortida:

Encerts en test: 0.883
      import_comanda  num_articles  dies_lliurament  client_nou
1965           87.57             5                7           0
Prediccio: [0] Probabilitats: [[0.938 0.062]]

L'etiqueta és una categoria (0/1) i la sortida, una classe més una probabilitat per classe: la signatura de la classificació. La regressió logística encerta una mica més que l'arbre de 04-01 (88,3 % davant 86,8 %), però recorda l'advertència sobre l'exactitud amb classes desequilibrades: no concloguis res fins a 04-05.

7.2 Regressió: previsió de la demanda setmanal

Necessitem una sèrie de vendes. La funció generar_demanda_setmanal crea les unitats venudes per setmana d'un producte fictici (el robot aspirador NovaClean) amb una tendència creixent, una estacionalitat anual, el pic del Black Friday i soroll. Afegeix-la també a novamarket_ml.py:

import numpy as np
import pandas as pd

def generar_demanda_setmanal(setmanes=104, llavor=42):
    """Unitats venudes per setmana del robot aspirador NovaClean (fictici)."""
    rng = np.random.default_rng(llavor)
    t = np.arange(setmanes)
    tendencia = 400 + 2.5 * t                                  # creixement lent
    estacionalitat = 60 * np.sin(2 * np.pi * (t - 13) / 52)    # pic anual
    black_friday = np.where(t % 52 == 47, 250, 0)              # setmana del Black Friday
    soroll = rng.normal(0, 25, setmanes)
    unitats = np.round(tendencia + estacionalitat + black_friday + soroll).astype(int)
    dates = pd.date_range("2024-01-01", periods=setmanes, freq="W-MON")
    return pd.DataFrame({"setmana": t + 1, "data": dates, "unitats": unitats})

I el model, una regressió lineal que fa servir només el número de setmana com a característica:

from sklearn.linear_model import LinearRegression

demanda = generar_demanda_setmanal(104, 42)      # dos anys de vendes
print(demanda.head(3))

train = demanda[demanda["setmana"] <= 78]        # primers 18 mesos per entrenar
test = demanda[demanda["setmana"] > 78]          # ultims 6 mesos per comprovar

reg = LinearRegression().fit(train[["setmana"]], train["unitats"])
print("Pendent:", reg.coef_.round(2), "Ordenada:", round(reg.intercept_, 1))

previsio = reg.predict(test[["setmana"]])
error_mitja = np.abs(previsio - test["unitats"]).mean()
print("Error mitja en test:", round(error_mitja, 1), "unitats")
print("Previsio setmana 105:", reg.predict(pd.DataFrame({"setmana": [105]})).round(0))

Sortida:

   setmana       data  unitats
0        1 2024-01-01      348
1        2 2024-01-08      317
2        3 2024-01-15      366
Pendent: [2.74] Ordenada: 391.0
Error mitja en test: 47.3 unitats
Previsio setmana 105: [679.]

Explicació:

  • L'etiqueta (unitats) és un nombre: regressió. LinearRegression aprèn una recta unitats ≈ 391 + 2,74 × setmana; el pendent 2,74 s'acosta a la tendència real de 2,5 unitats per setmana que vam amagar al generador.
  • Dividim per temps, no a l'atzar: entrenem amb el passat (setmanes 1-78) i provem amb el futur (79-104). Barrejar setmanes mesclaria futur i passat, i el resultat seria enganyosament bo. És la validació temporal de 04-05.
  • L'error mitjà de 47 unitats és gran perquè la recta ignora l'estacionalitat i el Black Friday. A 04-03 i 04-04 afegirem característiques (setmana de l'any, vendes de la setmana anterior) per capturar-los. El que importa ara és la forma del problema: entrada numèrica, sortida numèrica.

7.3 Clustering: segmentar clients amb k-means

Ara no hi ha etiqueta. Generem clients ficticis amb tres característiques de comportament (despesa anual, nombre de comandes, antiguitat en mesos) i demanem a k-means que trobi tres grups. Afegeix la funció a novamarket_ml.py:

def generar_clients_ml(n=600, llavor=42):
    """Clients ficticis de NovaMarket per a segmentacio (sense etiqueta)."""
    rng = np.random.default_rng(llavor)
    # tres tipus "ocults": ocasionals, habituals, grans compradors
    tipus = rng.choice([0, 1, 2], size=n, p=[0.55, 0.35, 0.10])
    despesa = np.where(tipus == 0, rng.normal(150, 50, n),
               np.where(tipus == 1, rng.normal(700, 150, n), rng.normal(2200, 400, n)))
    comandes = np.where(tipus == 0, rng.poisson(2, n),
                np.where(tipus == 1, rng.poisson(9, n), rng.poisson(20, n)))
    antiguitat = np.where(tipus == 0, rng.integers(1, 18, n),
                  np.where(tipus == 1, rng.integers(6, 48, n), rng.integers(12, 72, n)))
    return pd.DataFrame({
        "despesa_anual": np.clip(despesa, 10, None).round(2),
        "num_comandes": np.clip(comandes, 1, None),
        "antiguitat_mesos": antiguitat,
    })
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

clients = generar_clients_ml(600, 42)
print(clients.head(3))

escalador = StandardScaler()                     # posa les 3 columnes a la mateixa escala
X_clients = escalador.fit_transform(clients)

kmeans = KMeans(n_clusters=3, n_init=10, random_state=42)
clients["segment"] = kmeans.fit_predict(X_clients)   # no hi ha y: nomes X

resum = clients.groupby("segment").agg(
    n=("despesa_anual", "size"), despesa_mitjana=("despesa_anual", "mean"),
    comandes_mitjanes=("num_comandes", "mean"), antiguitat_mitjana=("antiguitat_mesos", "mean")
).round(1)
print(resum)

Sortida:

   despesa_anual  num_comandes  antiguitat_mesos
0         722.29             7                27
1         137.37             3                15
2         762.62             7                37
         n  despesa_mitjana  comandes_mitjanes  antiguitat_mitjana
segment
0      351            185.8                2.5                 9.5
1       52           2206.7               20.0                38.9
2      197            699.9                9.2                28.5

Explicació:

  • Fixa't que fit_predict rep només X: no hi ha etiqueta a aprendre. L'algorisme assigna cada client al grup el centre del qual és més a prop (04-04 n'explica el detall).
  • StandardScaler és necessari perquè k-means mesura distàncies: sense escalar, la despesa anual (centenars o milers d'euros) dominaria del tot davant del nombre de comandes (unitats). Escalat i distàncies es tracten a 04-03.
  • La interpretació la posa el negoci, no l'algorisme. Mirant el resum, la Marta bateja els segments: el 0 són ocasionals (351 clients, gasten 186 € l'any en 2-3 comandes, porten menys d'un any), el 2 són habituals (197 clients, uns 700 € en 9 comandes, més de dos anys) i l'1 són grans compradors (52 clients, 2.200 € en 20 comandes). Per al recomanador (cas 1) això vol dir, per exemple, que als ocasionals convé suggerir-los productes d'entrada i als grans compradors novetats i accessoris de gamma alta. Els números dels segments (0, 1, 2) són arbitraris: si canvies la llavor es poden permutar.
  • Els grups que k-means ha trobat coincideixen amb els tres "tipus ocults" del generador; en un dataset real no tindríem aquesta confirmació, i caldria validar els segments amb l'equip comercial i amb el mètode del colze (04-04).

7.4 Reforç en miniatura: un bandit multibraç per als cupons

El "bandit multibraç" és el problema de reforç més simple: diverses màquines escurabutxaques (braços) amb probabilitats de premi desconegudes, i cal decidir quina accionar a cada ronda per guanyar el màxim. No hi ha estat (sempre és la mateixa situació) i la recompensa és immediata, així que només queda el dilema exploració-explotació. El programem en Python pur per als quatre cupons de NovaMarket; la recompensa és 1 si el client torna a comprar el mes següent:

import random

def simular_cupons(epsilon, rondes=5000, llavor=1):
    rng = random.Random(llavor)
    # Taxes REALS de recompra despres de cada cupo: l'agent NO les coneix
    taxes_reals = {"sense cupo": 0.05, "5 %": 0.08, "enviament gratis": 0.11, "10 %": 0.09}
    cupons = list(taxes_reals)
    vegades = {c: 0 for c in cupons}      # quantes vegades s'ha provat cada cupo
    exits = {c: 0 for c in cupons}        # quantes recompres ha produit
    total = 0
    for _ in range(rondes):
        if rng.random() < epsilon:                                    # EXPLORAR
            triat = rng.choice(cupons)
        else:                                                         # EXPLOTAR
            triat = max(cupons, key=lambda c: exits[c] / vegades[c] if vegades[c] else 0)
        recompensa = 1 if rng.random() < taxes_reals[triat] else 0    # l'entorn respon
        vegades[triat] += 1
        exits[triat] += recompensa
        total += recompensa
    return total, vegades

for eps in (0.0, 0.1, 0.5):
    total, vegades = simular_cupons(eps)
    print(f"epsilon={eps}: {total} recompres; proves per cupo: {vegades}")

Sortida:

epsilon=0.0: 294 recompres; proves per cupo: {'sense cupo': 5000, '5 %': 0, 'enviament gratis': 0, '10 %': 0}
epsilon=0.1: 510 recompres; proves per cupo: {'sense cupo': 411, '5 %': 123, 'enviament gratis': 4091, '10 %': 375}
epsilon=0.5: 505 recompres; proves per cupo: {'sense cupo': 620, '5 %': 610, 'enviament gratis': 3118, '10 %': 652}

Explicació:

  • L'agent manté, per a cada cupó, una estimació de la seva taxa d'èxit (exits / vegades). Amb probabilitat epsilon tria un cupó a l'atzar (explora); si no, tria el de millor estimació (explota). L'estimació s'actualitza amb cada recompensa: això és l'aprenentatge.
  • Amb epsilon=0 (només explotar) l'agent prova "sense cupó" a la primera ronda, obté una estimació positiva abans que les altres i mai més no torna a provar una altra cosa: 294 recompres. És la trampa de no explorar, la versió de reforç de l'òptim local de 03-04.
  • Amb epsilon=0.1 descobreix aviat que l'enviament gratis funciona millor (11 %) i el fa servir 4.091 vegades: 510 recompres, un 73 % més. Amb epsilon=0.5 explora massa i perd una mica (505). El valor d'ε és un hiperparàmetre i el seu ajust és un problema clàssic.
  • Un sistema real hi afegiria l'estat (el cupó òptim depèn de la cistella i del client: "bandit contextual") i el cost del cupó a la recompensa. Però l'essència ja hi és: aprendre actuant, sense dataset previ, equilibrant exploració i explotació.

Errors Comuns i Consells

  • Confondre classificació amb regressió pel tipus de dada. La pregunta defineix el problema: "quant" és regressió, "quin/si" és classificació. Predir l'import és regressió; predir si supera un llindar és classificació.
  • Fer servir clustering esperant "la resposta". k-means sempre troba grups; el seu valor depèn que siguin interpretables i accionables. Posa'ls nom, compara'ls i valida amb negoci.
  • Barrejar sèries temporals. En demanda, entrenar amb el passat i avaluar amb el futur; mai train_test_split amb barreja (04-05 ho formalitza amb TimeSeriesSplit).
  • Oblidar escalar abans d'agrupar. Sense StandardScaler, la columna de més magnitud decideix els grups.
  • Pensar que reforç és "millor" perquè sona avançat. Necessita moltes interaccions i un entorn on equivocar-se sigui barat (o simulable). Per a la majoria dels casos de NovaMarket, supervisat i no supervisat són la resposta; el reforç té sentit en decisions repetides amb retroalimentació ràpida (cupons, preus).
  • Ignorar les dades sense etiquetar. Si la meitat d'incidencies.csv està sense categoria, no la descartis sense pensar: pot servir per a semisupervisat o, si més no, per entendre la distribució.

Exercicis

Exercici 1. Classifica cadascun dels nou casos d'ús de NovaMarket (recomanació, previsió de demanda, frau/devolucions, classificació de ressenyes, rutes, assignació de comandes, assistent, regles de devolucions/garanties, diagnòstic d'incidències) segons el paradigma o tècnica principal que hi aplicaries: supervisat (classificació o regressió), no supervisat, reforç, o "no és ML" (cerca/optimització del mòdul 3, lògica del mòdul 6, IA generativa del mòdul 5). Justifica cadascun en una línia.

Exercici 2. A la regressió de la secció 7.2, canvia el tall temporal per entrenar només amb el primer any (setmana <= 52) i avaluar amb el segon. Empitjora o millora l'error mitjà? Després, comet expressament l'error de barrejar: substitueix el model per KNeighborsRegressor(n_neighbors=3) (de sklearn.neighbors, que prediu amb la mitjana de les 3 setmanes més semblants) i compara'l amb la divisió temporal (setmanes 1-78 / 79-104) i amb una divisió barrejada train_test_split(demanda[["setmana"]], demanda["unitats"], test_size=0.25, random_state=42). Per què l'error surt menor amb la barreja i per què és enganyós?

Exercici 3. Modifica simular_cupons perquè l'exploració canviï amb el temps: durant les primeres 400 rondes tria sempre a l'atzar (ε = 1) i a partir d'aquí explota gairebé sempre (ε = 0,02). Compara les recompres totals amb epsilon=0.1 per a diverses llavors (llavor=1..5). Prova també una ε que decreixi ràpid, epsilon = max(0.01, 1 / (ronda + 1) ** 0.5). Quina estratègia funciona millor i per què?

Solucions

Solució 1. (1) Recomanació: no supervisat (segmentació) i supervisat (predir la probabilitat de compra), de vegades amb reforç per triar què mostrar. (2) Previsió de demanda: supervisat, regressió sobre sèrie temporal. (3) Frau/devolucions: supervisat, classificació; detecció d'anomalies (no supervisat) quan no hi ha etiquetes de frau. (4) Classificació de ressenyes: supervisat, classificació multiclasse sobre text (amb models preentrenats autosupervisats, mòdul 5). (5) Rutes: no és ML, és cerca/optimització (03-02, 03-04). (6) Assignació de comandes: optimització (03-04); s'hi podria afegir ML per preveure temps. (7) Assistent: IA generativa (LLM, 05-05), no ML clàssic entrenat per la Marta. (8) Regles de devolucions/garanties: lògica i sistemes experts (mòdul 6), no ML. (9) Diagnòstic d'incidències: supervisat (classificació de tiquets), amb semisupervisat si falten etiquetes; també sistemes experts per a la part de regles (06-04).

Solució 2. Entrenant només amb el primer any, la recta s'ajusta amb menys punts i la tendència estimada és pitjor, així que l'error al segon any creix (unes 59 unitats davant 47). Amb KNeighborsRegressor(n_neighbors=3), la divisió temporal dona un error mitjà d'unes 36 unitats i la barrejada, d'unes 29: la barreja sembla millor. És enganyós perquè, en barrejar, les "3 setmanes més semblants" d'una setmana de test són les seves veïnes immediates, que el model ha vist en entrenament; en producció, per preveure la setmana 105 no disposes de les vendes de la 104 ni, encara menys, de la 106. La divisió temporal reprodueix la situació real (predir el futur amb el passat) i per això és l'única honesta; a 04-05 la formalitzarem amb TimeSeriesSplit.

Solució 3. L'estratègia "explorar 400 rondes i després explotar" iguala o supera ε = 0,1 en la majoria de les llavors (a les nostres proves, 512/551/517/493/534 recompres davant 510/552/461/409/508): després de 400 proves repartides (unes 100 per cupó) l'estimació de cada taxa ja és raonable i no val la pena continuar gastant el 10 % de les rondes a explorar. En canvi, l'ε que decreix com 1/√ronda funciona pitjor (unes 380 recompres amb la llavor 1): baixa tan de pressa que al cap de poques desenes de rondes ja gairebé no explora, i es queda "enganxada" al cupó que va tenir sort al principi, amb estimacions basades en molt poques proves. La lliçó és doble: cal explorar prou abans de comprometre's (l'equivalent als reinicis aleatoris de 03-04) i, si l'entorn canvia (un cupó deixa de funcionar), una ε gairebé nul·la triga molt a assabentar-se'n; a la pràctica es manté sempre una exploració mínima.

Conclusió

En aquesta lliçó hem organitzat el machine learning en els seus grans paradigmes: el supervisat (classificació quan l'etiqueta és una categoria, regressió quan és un nombre), el no supervisat (clustering, reducció de dimensionalitat, detecció d'anomalies, on no hi ha etiqueta i la interpretació la posa el negoci), els intermedis semisupervisat i autosupervisat, i l'aprenentatge per reforç, en què un agent aprèn actuant i rebent recompenses, amb el dilema exploració-explotació com a tret distintiu. Els hem comparat en una taula i els hem vist en codi sobre NovaMarket: la regressió logística per a les devolucions, la regressió lineal per a la demanda del NovaClean (amb la nova funció generar_demanda_setmanal), k-means per segmentar clients (amb generar_clients_ml) en ocasionals, habituals i grans compradors, i un bandit epsilon-greedy per triar cupons.

Ja sabem quin tipus de problema és cada cas d'ús. Però, abans d'entrenar res seriós, cal fer la feina que a 04-01 vam dir que s'emporta la major part del temps: a la lliçó següent, Preparació de Dades i Característiques, agafarem una versió "bruta" de les comandes de NovaMarket (valors absents, un import impossible, categories en text, dates) i construirem pas a pas el pipeline que les converteix en la matriu numèrica que els algorismes necessiten, evitant pel camí la fuita d'informació que arruïna tants projectes.

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