Tres mòduls preparant les dades de MercaFresh i per fi arriba la recompensa: entrenar un model. Comencem per la regressió lineal, l'algorisme supervisat més antic i més simple — i precisament per això el millor lloc per entendre, sense caixes negres, què vol dir que una màquina aprengui. En aquesta lliçó construiràs la intuïció geomètrica (una recta que travessa un núvol de punts), veuràs quin error minimitza i com el minimitza (mínims quadrats i descens de gradient), aprendràs a llegir els coeficients com a afirmacions de negoci, i entrenaràs el teu primer model real: predir la despesa mensual dels clients de MercaFresh.
Contingut
- La intuïció geomètrica: la recta que millor ajusta
- L'equació: regressió simple i múltiple
- Mínims quadrats: què vol dir "millor ajust"
- Descens de gradient: com es troba el mínim
- Implementació amb scikit-learn: despesa mensual a MercaFresh
- Interpretació dels coeficients
- Supòsits del model a la pràctica
- Limitacions i quan desconfiar-ne
La intuïció geomètrica: la recta que millor ajusta
Imagina un gràfic de dispersió amb els clients de MercaFresh: a l'eix X, les seves comandes per mes; a l'eix Y, la seva despesa mensual en euros. El núvol de punts puja cap a la dreta — més comandes, més despesa — però no forma una línia perfecta: hi ha clients de moltes comandes petites i clients de poques comandes enormes.
La regressió lineal respon una pregunta molt concreta: de totes les rectes possibles que podrien travessar aquest núvol, quina passa "més a prop" de tots els punts alhora? Aquesta recta és el model. Un cop la tens, predir és trivial: per a un client nou amb 6 comandes/mes, puges verticalment des de x=6 fins a la recta i llegeixes la despesa estimada.
Fixa't que això encaixa exactament amb la definició de Mitchell del mòdul 1:
- Tasca T: predir la despesa mensual d'un client.
- Experiència E: els clients històrics amb la seva despesa coneguda.
- Mesura P: quant s'equivoquen les prediccions (ho formalitzem d'aquí a dos apartats).
"Aprendre" és, literalment, moure la recta fins que la mesura P sigui tan bona com sigui possible sobre l'experiència E.
L'equació: regressió simple i múltiple
Regressió simple (una variable)
La recta de tota la vida:
$$\hat{y} = w_0 + w_1 x$$
| Símbol | Nom | Lectura a MercaFresh |
|---|---|---|
| $\hat{y}$ | Predicció | Despesa mensual estimada (el barret indica "estimat", no real) |
| $x$ | Feature | Comandes per mes del client |
| $w_1$ | Pendent (coeficient) | Euros addicionals de despesa per cada comanda mensual extra |
| $w_0$ | Intercepte (biaix) | Despesa base estimada quan x = 0 |
Els paràmetres que el model aprèn són només dos números: $w_0$ i $w_1$. Res més. Tot el "coneixement" del model hi cap.
Regressió múltiple (diverses variables)
A la pràctica mai no prediràs amb una sola feature. La despesa d'un client depèn de les seves comandes, la seva recència, el seu pla... L'equació es generalitza sumant un terme per feature:
$$\hat{y} = w_0 + w_1 x_1 + w_2 x_2 + \dots + w_n x_n$$
Geomètricament ja no és una recta sinó un hiperplà: amb 2 features és un pla en 3D; amb les features del dataset de MercaFresh, un hiperplà en un espai que no podem dibuixar però que funciona amb la mateixa lògica. Cada $w_i$ continua sent "quant canvia la predicció quan $x_i$ puja una unitat, mantenint la resta constant" — aquesta coda final serà clau a l'hora d'interpretar.
Mínims quadrats: què vol dir "millor ajust"
"La recta que passa més a prop de tots els punts" sona bé però és ambigu. Cal definir a prop amb una fórmula. La definició clàssica:
- Per a cada client $i$, calcula el residu: $e_i = y_i - \hat{y}_i$ (despesa real menys despesa predita). És la distància vertical del punt a la recta.
- Eleva cada residu al quadrat: $e_i^2$. Així els errors positius i negatius no es cancel·len, i els errors grans pesen desproporcionadament més (equivocar-se per 20 € compta 4 vegades més que equivocar-se per 10 €).
- Fes-ne la mitjana: això és l'error quadràtic mitjà (MSE), la funció de cost.
$$MSE(w) = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$$
La recta de mínims quadrats és la que fa aquest número tan petit com sigui possible. Ara "aprendre" té una definició operativa exacta: trobar els valors de $w_0, \dots, w_n$ que minimitzen el MSE sobre les dades d'entrenament. Al mòdul 6 (06-02) veurem el MSE i els seus parents com a mètriques d'avaluació amb detall; aquí ens en basta el paper com a funció de cost — l'objectiu que l'algorisme persegueix.
Un detall que convé saber: per a la regressió lineal existeix una fórmula tancada (l'"equació normal") que dona els pesos òptims d'una tacada, i és el que scikit-learn fa servir per sota. Però val la pena entendre el mètode general, perquè gairebé cap altre model del curs no té fórmula tancada.
Descens de gradient: com es troba el mínim
El descens de gradient és el mètode iteratiu universal per minimitzar funcions de cost, i reapareixerà a la regressió logística (04-02) i a les xarxes neuronals (04-07). La intuïció:
Imagina el MSE com un paisatge: cada punt del terreny és una combinació de pesos $(w_0, w_1)$, i l'alçada en aquest punt és l'error que produeix aquesta combinació. Per a la regressió lineal, aquest paisatge és una vall en forma de bol, amb un únic fons. Ets al vessant, amb boira, i vols arribar a baix:
- Comença en qualsevol lloc: pesos aleatoris.
- Mira el pendent sota els teus peus: el gradient indica cap on puja més l'error.
- Fes un pas en la direcció contrària, de mida proporcional a la taxa d'aprenentatge (learning rate).
- Repeteix fins que el terreny sigui pla: has arribat al mínim.
flowchart TD
A["Pesos inicials aleatoris<br/>w0, w1"] --> B["Calcular prediccions<br/>i el MSE actual"]
B --> C["Calcular el gradient:<br/>en quina direccio creix l'error"]
C --> D["Actualitzar pesos:<br/>pas en direccio contraria<br/>w = w - taxa * gradient"]
D --> E{"L'error ja<br/>gairebe no baixa?"}
E -- "No" --> B
E -- "Si" --> F["Pesos finals:<br/>model entrenat"]
La taxa d'aprenentatge és el compromís central: passos massa petits triguen una eternitat; passos massa grans salten d'un vessant a l'oposat sense baixar mai. És el primer hiperparàmetre que veus al curs — un número que tu fixes abans d'entrenar, no una cosa que el model aprèn (la seva optimització sistemàtica arriba a 07-05).
Implementació amb scikit-learn: despesa mensual a MercaFresh
Objectiu de negoci: MercaFresh vol estimar la despesa mensual futura de cada client per dimensionar campanyes i estoc. És una regressió: l'etiqueta és un número continu. Fem servir features derivades de la taula RFM que vam construir a 03-06:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
rng = np.random.default_rng(42)
n = 500
# Simulem la taula de clients de MercaFresh (features de 03-06)
clients = pd.DataFrame({
"comandes_per_mes": rng.gamma(3, 1.2, n).round(1),
"despesa_mitjana_comanda": rng.gamma(9, 5, n).round(2),
"recencia_dies": rng.integers(1, 120, n),
"antiguitat_mesos": rng.integers(3, 60, n),
})
# Despesa mensual real: comandes x tiquet, penalitzada per inactivitat, mes soroll
clients["despesa_mensual"] = (
clients["comandes_per_mes"] * clients["despesa_mitjana_comanda"]
- 0.8 * clients["recencia_dies"]
+ rng.normal(0, 15, n)
).clip(lower=0).round(2)
X = clients[["comandes_per_mes", "despesa_mitjana_comanda",
"recencia_dies", "antiguitat_mesos"]]
y = clients["despesa_mensual"]
# Divisio entrenament/prova: entrenem amb el 80% i comprovem amb el 20%
# que el model mai no ha vist (el perque en profunditat, a 06-01)
X_entrenament, X_prova, y_entrenament, y_prova = train_test_split(
X, y, test_size=0.2, random_state=42)
model = LinearRegression()
model.fit(X_entrenament, y_entrenament) # aqui passa l'"aprenentatge"
prediccions = model.predict(X_prova)
mse = mean_squared_error(y_prova, prediccions)
print(f"MSE en prova: {mse:.1f}")
print(f"Error tipic: ~{np.sqrt(mse):.1f} EUR")Explicació pas a pas per a qui entrena per primera vegada:
train_test_split: aparta un 20% de clients que el model no veurà durant l'entrenament, per mesurar l'error sobre dades noves — la mateixa disciplina fit-en-entrenament que vam aplicar a l'escalat a 03-05. El mòdul 6 desenvolupa aquesta idea a fons.model.fit(X_entrenament, y_entrenament): la línia on passa tot. scikit-learn calcula els pesos que minimitzen el MSE sobre l'entrenament. És la mateixa interfíciefitque feies servir aSimpleImputeroStandardScaler: ajustar paràmetres a partir de dades.model.predict(X_prova): aplica l'equació $\hat{y} = w_0 + w_1 x_1 + \dots$ a cada client de prova.mean_squared_error: el MSE de l'apartat 3, ara com a jutge. La seva arrel quadrada retorna l'error a euros, la unitat original: "ens equivoquem típicament en uns 15 €".
Nota pràctica que reprèn 03-05: LinearRegression funciona sense escalar les features (la solució exacta no depèn de l'escala), però si entrenessis amb descens de gradient o hi afegissis regularització (07-01), escalar seria imprescindible. Escalar per defecte, com fa el nostre preprocessador del mòdul 3, no fa nosa mai.
Interpretació dels coeficients
La gran virtut de la regressió lineal és que el model entrenat es pot llegir:
coefs = pd.Series(model.coef_, index=X.columns).round(3)
print(coefs)
print(f"Intercepte: {model.intercept_:.2f}")Sortida típica (els teus números variaran lleugerament):
| Feature | Coeficient | Lectura de negoci |
|---|---|---|
comandes_per_mes |
+44.1 | Cada comanda mensual addicional suma ~44 € de despesa estimada, a igualtat de la resta |
despesa_mitjana_comanda |
+3.6 | Cada euro extra de tiquet mitjà suma ~3.6 € al mes |
recencia_dies |
−0.81 | Cada dia sense comprar resta ~0.81 € de despesa mensual esperada |
antiguitat_mesos |
~0.0 | L'antiguitat gairebé no aporta res un cop conegudes les altres |
Tres advertències d'ofici:
- "A igualtat de la resta" no és una coda decorativa: el coeficient de
recencia_diescompara clients amb les mateixes comandes i tiquet però diferent recència. Si les features estan correlacionades entre si (i les de RFM ho estan, com vam veure al heatmap de 02-03), els coeficients individuals es tornen inestables i cal llegir-los amb cautela. - Les unitats importen: un coeficient de 44 sobre "comandes" i un de 3.6 sobre "euros de tiquet" no són comparables directament — mesuren coses en unitats diferents. Per comparar importàncies, entrena sobre features estandarditzades (03-05).
- Correlació no és causalitat (02-03): el model diu que una recència alta acompanya una despesa baixa, no que forçar una compra hagi de rejovenir el client.
Supòsits del model a la pràctica
La regressió lineal assumeix coses sobre les dades. No cal la formalitat estadística completa; sí que cal saber comprovar les dues que més mal fan a la pràctica:
- Linealitat: la relació real entre features i objectiu ha de ser aproximadament una suma d'efectes lineals. Comprovació: gràfic de dispersió de cada feature contra l'objectiu. Si hi veus una corba (rendiments decreixents de la despesa amb la freqüència, per exemple), la recta es quedarà curta — les transformacions log de 03-03 o les interaccions de 03-06 poden linealitzar la relació.
- Residus sense estructura: els errors del model haurien de semblar soroll — centrats en zero, sense patró, amb variància estable. La comprovació és un gràfic de residus contra prediccions:
import matplotlib.pyplot as plt
residus = y_prova - prediccions
plt.scatter(prediccions, residus, alpha=0.5)
plt.axhline(0, color="red", linestyle="--")
plt.xlabel("Despesa predita (EUR)")
plt.ylabel("Residu (real - predit)")
plt.show()Com llegir-lo: un núvol horitzontal i amorf al voltant de zero és bon senyal. Una forma d'U diu "hi ha no-linealitat que no estic capturant"; un embut (residus que creixen amb la predicció) diu "predic molt pitjor els clients grans" — l'histograma i el boxplot de 02-01 aplicats als residus completen el diagnòstic.
Limitacions i quan desconfiar-ne
| Limitació | Per què passa | Mitigació |
|---|---|---|
| No captura relacions no lineals | El model és un hiperplà | Transformar features (03-03), interaccions (03-06), o models no lineals (04-03 en endavant) |
| Sensible a outliers | El quadrat del residu fa que un punt extrem estiri la recta amb moltíssima força | La neteja d'outliers de 03-01 abans d'entrenar |
| Coeficients inestables amb features correlacionades | Diverses features "competeixen" per explicar el mateix | Filtre de correlació de 03-06; la regularització Ridge/Lasso (07-01) estén la regressió lineal penalitzant pesos grans i estabilitza justament aquest problema |
| Extrapola alegrement | La recta continua recta fora del rang d'entrenament | Desconfiar de prediccions per a clients molt diferents dels vistos |
La primera limitació és la més important conceptualment: hi ha problemes on cap recta no funciona. El més notori: predir una categoria (aquest client abandonarà, sí o no?). Aquí la regressió lineal fracassa per disseny — i aquest fracàs és exactament on comença la lliçó següent.
Errors Comuns i Consells
- Fer servir regressió lineal per classificar (churn sí/no codificat com a 0/1 i endavant). Produeix prediccions absurdes com "probabilitat 1.4". L'eina correcta arriba a 04-02.
- Interpretar coeficients de features correlacionades com a veritats aïllades. Amb
comandes_per_mesidespesa_totalalhora al model, els seus coeficients es reparteixen l'efecte de manera arbitrària. Revisa el heatmap de correlacions (02-03) abans de llegir coeficients. - Oblidar-se de mirar els residus. Un MSE acceptable pot amagar un model que falla sistemàticament en un segment (per exemple, tots els clients premium). El gràfic de residus costa tres línies i ho revela.
- Ajustar el model amb outliers sense depurar. Un sol client corporatiu amb una despesa de 10 000 €/mes desplaça la recta per a tothom. Reprèn el tractament IQR/z-score de 03-01.
- Consell: comença sempre per la regressió lineal encara que planegis fer servir models complexos. És la línia base: barata, interpretable, i si un model sofisticat no la supera clarament, no paga la seva complexitat.
Exercicis
Exercici 1. Amb el model entrenat a la lliçó, calcula a mà (sense predict) la despesa mensual estimada d'un client amb 4 comandes/mes, tiquet mitjà de 30 €, recència de 10 dies i 24 mesos d'antiguitat. Fes servir model.intercept_ i model.coef_. Comprova-ho després amb model.predict.
Exercici 2. Afegeix al dataset una feature nova, interaccio = comandes_per_mes * despesa_mitjana_comanda (la interacció triada a mà, com a 03-06), reentrena i compara el MSE en prova. Per què aquesta interacció ajuda tant en aquest dataset concret?
Exercici 3. Introdueix artificialment un outlier: un client amb despesa_mensual = 50000 al conjunt d'entrenament. Reentrena i compara els coeficients amb els originals. Quin coeficient canvia més i per què?
Solucions
Exercici 1
client = np.array([4, 30, 10, 24])
prediccio_manual = model.intercept_ + np.dot(model.coef_, client)
print(f"A ma: {prediccio_manual:.2f} EUR")
client_df = pd.DataFrame([[4, 30, 10, 24]], columns=X.columns)
print(f"Amb predict: {model.predict(client_df)[0]:.2f} EUR")Tots dos valors coincideixen exactament: predict no fa res més que l'equació de l'hiperplà. Interioritzar-ho desmitifica el model — tota la "intel·ligència" són cinc números.
Exercici 2
X2 = X.copy()
X2["interaccio"] = X2["comandes_per_mes"] * X2["despesa_mitjana_comanda"]
X2_entrenament, X2_prova, y_entrenament, y_prova = train_test_split(
X2, y, test_size=0.2, random_state=42)
model2 = LinearRegression().fit(X2_entrenament, y_entrenament)
mse2 = mean_squared_error(y_prova, model2.predict(X2_prova))
print(f"MSE sense interaccio: {mse:.1f} | amb interaccio: {mse2:.1f}")El MSE cau dràsticament perquè la despesa real es va generar com a comandes × tiquet: una relació multiplicativa que cap hiperplà de features soltes no pot expressar, però que es torna lineal tan bon punt la interacció existeix com a columna. Moralitat: l'enginyeria de característiques (03-06) pot convertir un problema no lineal en un de lineal.
Exercici 3
X_out, y_out = X_entrenament.copy(), y_entrenament.copy()
y_out.iloc[0] = 50000
model3 = LinearRegression().fit(X_out, y_out)
print(pd.DataFrame({"original": model.coef_, "amb_outlier": model3.coef_},
index=X.columns).round(2))Els coeficients de les features on aquell client té valors alts es disparen: el residu de 50 000 € al quadrat domina la funció de cost, i al model li compensa desajustar els altres 399 clients a canvi d'acostar-se una mica a aquell un. És la sensibilitat als outliers en acció — i l'argument definitiu per a la neteja de 03-01.
Conclusió
Ja has entrenat el teu primer model de debò: saps que la regressió lineal busca l'hiperplà que minimitza el MSE, que el descens de gradient és el mètode general per trobar aquest mínim (i tornarà una vegada i una altra al llarg del curs), que els coeficients es llegeixen com a afirmacions de negoci — amb les cauteles de la correlació entre features —, i que els residus són el delator dels supòsits trencats. També n'has vist els límits: no-linealitat, outliers, i sobretot la seva incapacitat per respondre preguntes de sí o no.
I aquesta darrera limitació és la porta de la lliçó següent: MercaFresh no només vol saber quant gastarà un client, sinó si abandonarà. Per a això necessitem doblegar la recta en una corba en forma de S que parli l'idioma de les probabilitats: la regressió logística.
Curs de Machine Learning
Mòdul 1: Introducció al Machine Learning
- Què és el Machine Learning?
- Història i evolució del Machine Learning
- Tipus de Machine Learning
- Aplicacions del Machine Learning
- El flux de treball d'un projecte de Machine Learning
Mòdul 2: Fonaments d'Estadística i Probabilitat
- Conceptes bàsics d'estadística
- Distribucions de probabilitat
- Correlació i covariància
- Inferència estadística
- Teorema de Bayes
Mòdul 3: Preprocessament de Dades
- Neteja de dades
- Gestió de dades mancants
- Transformació de dades
- Codificació de variables categòriques
- Normalització i estandardització
- Enginyeria de característiques
Mòdul 4: Algorismes de Machine Learning Supervisat
- Regressió lineal
- Regressió logística
- Arbres de decisió
- Màquines de suport vectorial (SVM)
- K veïns més propers (K-NN)
- Naive Bayes
- Xarxes neuronals
Mòdul 5: Algorismes de Machine Learning No Supervisat
- Clustering: K-means
- Clustering jeràrquic
- Anàlisi de components principals (PCA)
- Anàlisi d'agrupament DBSCAN
- Visualització de dades amb t-SNE i UMAP
Mòdul 6: Avaluació i Validació de Models
- Divisió de dades: entrenament, validació i prova
- Mètriques d'avaluació
- Validació creuada
- Corba ROC i AUC
- Overfitting i underfitting
Mòdul 7: Tècniques Avançades i Optimització
- Regularització: Ridge, Lasso i Elastic Net
- Ensemble Learning
- Gradient Boosting
- Xarxes neuronals profundes (Deep Learning)
- Optimització d'hiperparàmetres
Mòdul 8: Implementació i Desplegament de Models
- Frameworks i biblioteques populars
- Implementació de models en producció
- Manteniment i monitoratge de models
- Consideracions ètiques i de privadesa
Mòdul 9: Projectes Pràctics
- Projecte 1: Predicció de preus d'habitatges
- Projecte 2: Classificació d'imatges
- Projecte 3: Anàlisi de sentiments a les xarxes socials
- Projecte 4: Detecció de fraus
- Projecte 5: Segmentació de clients
