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
- Què és aprendre de dades: la definició de Mitchell
- D'
aprendre_llindara machine learning: res de nou sota el sol - Vocabulari essencial
- El flux de treball d'un projecte de ML: mapa del mòdul
- Quan fer servir ML i quan no
- Exemple en Python: les dades de NovaMarket i el primer model amb scikit-learn
- Errors Comuns i Consells
- Exercicis
- Conclusió
- 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.
- D'
aprendre_llindar a machine learning: res de nou sota el sol
aprendre_llindar a machine learning: res de nou sota el solJa 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:
- 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.
- 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.
- 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.
- 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).
- 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.
- 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.
- 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 quecodi_postal_zonano apareix az: 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).retornates 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
DataFramede 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 classeSortida:
Pas a pas:
train_test_splitbarreja les comandes i les reparteix en entrenament (2.250) i test (750).random_state=42fixa la barreja perquè sigui reproduïble;stratify=ygaranteix 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.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.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.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í).predictretorna la classe (0 o 1) de cada comanda nova, ipredict_probala 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ó (fit → predict/predict_proba → score) é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=42fa 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.csvagregat 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
- Conceptes Fonamentals: Agents, Entorns i Racionalitat
- Tipus d'Intel·ligència Artificial
- Les Dades com a Matèria Primera de la IA
- Ètica i Consideracions en IA
Mòdul 3: Algorismes en IA
- Introducció als Algorismes
- Algorismes de Cerca
- Cerca amb Adversari: Jocs i Minimax
- Algorismes d'Optimització
Mòdul 4: Aprenentatge Automàtic (Machine Learning)
- Conceptes Bàsics de Machine Learning
- Tipus d'Aprenentatge Automàtic
- Preparació de Dades i Característiques
- Algorismes de Machine Learning
- Avaluació i Validació de Models
- Sobreajust, Regularització i Ajust d'Hiperparàmetres
Mòdul 5: Xarxes Neuronals i Deep Learning
- Introducció a les Xarxes Neuronals
- Arquitectura de Xarxes Neuronals
- Com Aprèn una Xarxa: Descens del Gradient i Retropropagació
- Deep Learning i les seves Aplicacions
- Transformers, Grans Models de Llenguatge i IA Generativa
Mòdul 6: Lògica i Sistemes Experts
- Lògica en IA
- Sistemes Experts
- Raonament amb Incertesa: Probabilitat i Xarxes Bayesianes
- Aplicacions dels Sistemes Experts
Mòdul 7: Eines i Llenguatges de Programació en IA
- Llenguatges de Programació per a IA
- Python Científic: NumPy, pandas i Matplotlib
- Eines i Llibreries Populars
- Entorns de Desenvolupament
Mòdul 8: Projectes i Casos d'Estudi
Mòdul 9: Exercicis i Pràctiques
- Exercicis d'Algorismes
- Pràctiques de Machine Learning
- Projectes de Xarxes Neuronals
- Projecte Integrador: de la Idea al Prototip
