La SVM va tancar la lliçó anterior amb una idea en germen: classificar per similitud amb altres punts. K veïns més propers (K-NN, K-Nearest Neighbors) construeix un algorisme sencer sobre aquesta idea i res més: per classificar un client nou de MercaFresh, busca els K clients històrics més semblants a ell i vota — si la majoria va abandonar, prediu churn. Sense equació, sense coeficients, sense entrenament real. Aquesta simplicitat radical el converteix en el millor model per entendre què vol dir "semblant" en un espai de features — i en un laboratori perfecte per a dos temes que travessen tot el ML: l'elecció de la distància (i per què l'escalat de 03-05 torna a ser vital) i la maledicció de la dimensionalitat.
Contingut
- Aprenentatge mandrós: un model que no entrena
- Mètriques de distància: euclidiana i Manhattan
- L'escalat torna a ser crític
- L'elecció de K: petit, gran i senar
- K-NN per a classificació i per a regressió
- Implementació amb scikit-learn: churn de MercaFresh
- Cost en predicció i la maledicció de la dimensionalitat
- K-NN és supervisat (i K-means no)
Aprenentatge mandrós: un model que no entrena
Tots els models vistos fins ara comprimeixen el dataset en uns pocs paràmetres durant fit: la regressió lineal en pesos, l'arbre en regles, la SVM en vectors de suport. K-NN no comprimeix res: el seu fit es limita a guardar el dataset d'entrenament (com a molt, indexar-lo per buscar ràpid). Per això se l'anomena aprenentatge mandrós (lazy learning): tota la feina es posposa al moment de predir.
El procediment de predicció, complet:
- Arriba un client nou $\mathbf{x}$.
- Calcula la distància de $\mathbf{x}$ a cada client de l'entrenament.
- Selecciona els K més propers (els "veïns").
- Classificació: vota la classe majoritària entre els veïns (o fa la mitjana de les seves proporcions per donar probabilitat). Regressió: fa la mitjana dels seus valors.
flowchart LR
A["Client nou<br/>recencia=70, tendencia=0.5"] --> B["Distancia als<br/>800 clients de l'entrenament"]
B --> C["K=5 veins<br/>mes propers"]
C --> D["Votacio:<br/>4 churn / 1 fidel"]
D --> E["Prediccio: CHURN<br/>p(churn) = 4/5 = 0.8"]
La hipòtesi implícita és pur sentit comú de negoci: clients amb features semblants es comporten de manera semblant. Si els cinc clients històricament més similars a la Marta van abandonar, la Marta està en risc. És la mateixa lògica que va fer servir KNNImputer a 03-02 per omplir nuls amb els valors dels veïns — aquell imputador era, literalment, un K-NN de regressió aplicat a la columna incompleta.
Mètriques de distància: euclidiana i Manhattan
"Més proper" exigeix definir distància. Les dues protagonistes:
| Mètrica | Fórmula (2 features) | Intuïció | metric= |
|---|---|---|---|
| Euclidiana | $\sqrt{(a_1-b_1)^2 + (a_2-b_2)^2}$ | Línia recta, "a vol d'ocell" | "euclidean" (per defecte, p=2) |
| Manhattan | $|a_1-b_1| + |a_2-b_2|$ | Suma de trams, "en quadrícula de carrers" | "manhattan" (p=1) |
Diferència pràctica: l'euclidiana eleva al quadrat, així que una sola feature molt discrepant domina la distància (com el MSE amb els outliers a 04-01); la Manhattan reparteix el pes linealment i és una mica més robusta a diferències extremes en una coordenada. En datasets tabulars com el de MercaFresh, l'euclidiana és el punt de partida estàndard; provar Manhattan és un experiment barat quan hi ha features amb valors extrems.
L'escalat torna a ser crític
Tercera aparició estel·lar de 03-05, i la més dramàtica. Calcula la distància euclidiana entre dos clients sense escalar:
- Client A: recència 30 dies, ratio_inactivitat 0.10
- Client B: recència 90 dies, ratio_inactivitat 0.95
$d = \sqrt{(90-30)^2 + (0.95-0.10)^2} = \sqrt{3600 + 0.72} \approx 60.006$
El ratio_inactivitat — que distingeix radicalment els dos clients — aporta un 0.01% de la distància. Per a un K-NN sense escalar, aquesta feature no existeix: els veïns es trien només per recència. Després d'un StandardScaler o RobustScaler, totes dues features parlen en unitats comparables i totes dues opinen. Regla absoluta: K-NN mai sense escalat — com la SVM (04-04), i a diferència de l'arbre (04-03).
L'elecció de K: petit, gran i senar
K és l'únic hiperparàmetre essencial, i el seu efecte és un estira-i-arronsa entre flexibilitat i estabilitat:
| K | Comportament | Frontera de decisió | Risc |
|---|---|---|---|
| 1 | Copia el veí únic més proper | Rugosíssima, illes al voltant de cada punt | Sobreajustament: el soroll mana (06-05) |
| 5–20 (típic) | Vota un veïnat raonable | Suau però sensible a l'estructura local | — |
| n (tots) | Sempre prediu la classe majoritària global | Plana: ignora les features | Underfitting total |
Visualitza-ho amb una imatge: amb K=1, cada client atípic de l'entrenament — el fidel amb perfil de churner — crea al seu voltant una petita illa de prediccions errònies; un sol punt mal etiquetat contamina el seu veïnat. Amb K=25, aquesta anècdota queda ofegada per la votació i la frontera s'allisa; però si K continua creixent, la votació inclou clients cada cop menys semblants i la frontera perd el detall real. L'elecció sistemàtica de K es fa amb validació creuada (06-03); l'heurística inicial habitual és $K \approx \sqrt{n}$ i provar-hi al voltant.
Dos consells concrets:
- K senar en classificació binària: evita empats 2-2 en la votació (sklearn els resol, però millor no tenir-los).
weights="distance": dona més vot als veïns més pròxims — útil quan K és gran i no vols que els veïns de la vora del veïnat pesin igual que els enganxats al punt.
K-NN per a classificació i per a regressió
La classificació (churn) és el cas estrella i el del nostre exemple. La versió de regressió és idèntica canviant la votació per una mitjana: per estimar la despesa mensual d'un client (el problema de 04-01), KNeighborsRegressor fa la mitjana de la despesa dels seus K veïns. Produeix prediccions localment adaptatives sense assumir linealitat — però, com l'arbre de regressió (04-03), no extrapola: la despesa predita mai no sortirà del rang de despeses dels veïns.
Implementació amb scikit-learn: churn de MercaFresh
Mateix patró professional que a 04-02 i 04-04: el preprocessador de 03-06 (amb el seu escalat) i el model, encadenats:
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.neighbors import KNeighborsClassifier
# 'preprocessador': el ColumnTransformer de 03-06, amb RobustScaler inclos
X_entrenament, X_prova, y_entrenament, y_prova = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42)
knn = Pipeline([
("prep", preprocessador),
("model", KNeighborsClassifier(n_neighbors=11, weights="distance")),
])
knn.fit(X_entrenament, y_entrenament) # "fit": nomes preprocessar i memoritzar
print(f"Accuracy en prova: {knn.score(X_prova, y_prova):.2%}")
# La probabilitat es la proporcio (ponderada) de veins churn
p_churn = knn.predict_proba(X_prova)[:, 1]
# Efecte de K: la corba del compromis
for k in [1, 5, 11, 51, 201]:
m = Pipeline([("prep", preprocessador),
("model", KNeighborsClassifier(n_neighbors=k))])
m.fit(X_entrenament, y_entrenament)
print(f"K={k:3} | entrenament: {m.score(X_entrenament, y_entrenament):.2%}"
f" | prova: {m.score(X_prova, y_prova):.2%}")El que veuràs en executar el bucle:
- K=1: accuracy d'entrenament = 100% sempre (el veí més proper d'un punt de l'entrenament és ell mateix). Prova, clarament pitjor: la signatura del sobreajustament.
- K intermedi: la millor prova — el veïnat fa la mitjana del soroll sense diluir el patró.
- K=201: totes dues accuracies cauen cap a la proporció de la classe majoritària — el model ja gairebé no mira el client.
A més, predict_proba surt gratis i amb lectura directa: "8 dels teus 11 veïns van abandonar" és un argument que l'equip de retenció entén — la interpretabilitat de K-NN no és en coeficients ni regles, sinó en poder ensenyar els veïns que van motivar cada predicció (kneighbors() els retorna).
Cost en predicció i la maledicció de la dimensionalitat
Cost invertit. K-NN inverteix el perfil de cost de tots els models anteriors:
| Entrenar | Predir un punt | Memòria | |
|---|---|---|---|
| Regressió logística | Iteratiu (moderat) | Instantani: una equació | Uns quants pesos |
| K-NN | Instantani: memoritzar | Car: distàncies contra l'entrenament | El dataset sencer |
Per a un sistema en producció que puntua cada client a cada visita (08-02), pagar la cerca de veïns a cada predicció — i carregar amb tot l'històric en memòria — pot ser prohibitiu. Els índexs espacials (algorithm="kd_tree"/"ball_tree") acceleren la cerca amb poques dimensions, però perden eficàcia a mesura que aquestes creixen... cosa que enllaça amb el problema profund.
La maledicció de la dimensionalitat. En espais de moltes features, la geometria traeix la intuïció: el volum creix exponencialment amb la dimensió, els punts es dispersen, i les distàncies entre tots els parells es tornen gairebé iguals — el veí "més proper" gairebé no és més proper que el més llunyà. Quan això passa, "semblant" deixa de significar res i K-NN (i tot mètode basat en distàncies, la SVM RBF inclosa) degenera.
Regles de butxaca: amb les ~15 features del dataset de churn, K-NN respira bé; amb centenars de features (text vectoritzat, genòmica), pateix. Les cures: la selecció de features de 03-06 (menys dimensions, més senyal) i la reducció de dimensionalitat amb PCA, que veurem a 05-03 precisament com a antídot habitual abans d'aplicar mètodes de distància.
K-NN és supervisat (i K-means no)
Aclariment obligat abans del mòdul 5, perquè la coincidència de la lletra K confon tothom:
| K-NN (aquesta lliçó) | K-means (05-01) | |
|---|---|---|
| Tipus | Supervisat: necessita etiquetes (churn sí/no) | No supervisat: sense etiquetes |
| Què fa | Prediu l'etiqueta d'un punt nou mirant veïns etiquetats | Descobreix K grups naturals en dades sense etiquetar |
| Què significa K | Nombre de veïns consultats | Nombre de grups a formar |
K-NN respon "abandonarà aquest client?" fent servir l'històric etiquetat; K-means respondrà "quins segments de clients existeixen?" sense que ningú li digui què buscar. Comparteixen la noció de distància (i l'obligació d'escalar), res més. Ho deixem aquí: K-means té la seva lliçó sencera en obrir el mòdul 5.
Errors Comuns i Consells
- Oblidar l'escalat. En K-NN no és que el model rendeixi pitjor: és que les features de rang petit desapareixen de facto del càlcul. Sempre dins del
Pipelineamb el preprocessador de 03-06. - Avaluar K=1 sobre el mateix entrenament i celebrar el 100%. És un miratge per construcció (cada punt és el seu propi veí). Tota comparació de K s'ha de fer sobre dades apartades — o millor, amb validació creuada (06-03).
- Fer servir K-NN amb features one-hot dominants. Moltes columnes binàries de
ciutat_*poden pesar tant com totes les numèriques juntes en la distància euclidiana. Vigila la proporció de features binàries o pondera/selecciona (03-06). - Desplegar-lo sense mesurar la latència de predicció. Funciona de meravella al notebook amb 800 clients i s'arrossega amb 2 milions. Abans de proposar-lo per a producció, cronometra
predictamb el volum real. - Consell: fes servir K-NN com a sonda del problema. Si amb un bon escalat no supera clarament predir la classe majoritària, les teves features no defineixen una noció útil de "semblant" — i això és un diagnòstic sobre les dades (torna a 03-06) que cap model sofisticat no arreglarà tot sol.
Exercicis
Exercici 1. A mà: client nou amb (recencia_escalada = 0.0, tendencia_escalada = 0.0). Veïns candidats de l'entrenament: A(0.1, 0.2, fidel), B(−0.3, 0.1, fidel), C(0.8, −0.9, churn), D(0.2, −0.1, churn), E(−1.5, 1.2, fidel). Calcula les distàncies euclidianes, classifica amb K=3 i amb K=5, i dona la probabilitat de churn en cada cas.
Exercici 2. Repeteix la classificació K=3 de l'exercici 1 amb distància Manhattan. Canvia algun veí del top-3? Canvia la predicció?
Exercici 3. Explica per què KNNImputer (03-02) necessitava que les features estiguessin en escales comparables, fent servir el que has après en aquesta lliçó. Quina feature del dataset de MercaFresh hauria dominat la imputació si no s'hagués escalat?
Solucions
Exercici 1
Distàncies a l'origen: A: $\sqrt{0.01+0.04}=0.224$; B: $\sqrt{0.09+0.01}=0.316$; C: $\sqrt{0.64+0.81}=1.204$; D: $\sqrt{0.04+0.01}=0.224$; E: $\sqrt{2.25+1.44}=1.921$.
- K=3: veïns A (fidel), D (churn), B (fidel) → votació 2-1 → fidel, p(churn) = 1/3 ≈ 0.33.
- K=5: hi entren també C (churn) i E (fidel) → 3 fidels, 2 churn → fidel, p(churn) = 2/5 = 0.40.
Fixa't com la probabilitat canvia amb K encara que l'etiqueta no: la granularitat de p és 1/K, una altra raó per no fer servir una K minúscula si necessites probabilitats fines.
Exercici 2
Manhattan: A: 0.1+0.2=0.3; B: 0.3+0.1=0.4; C: 0.8+0.9=1.7; D: 0.2+0.1=0.3; E: 1.5+1.2=2.7. El top-3 continua sent {A, D, B} i la predicció continua sent fidel (2-1). En aquest cas no canvia res — les dues mètriques solen coincidir quan els veïns són clars; divergeixen sobretot quan algun candidat deu la seva proximitat euclidiana a compensar una coordenada molt discrepant amb altres de molt semblants (el quadrat perdona menys que el valor absolut).
Exercici 3
KNNImputer omple el nul d'un client amb la mitjana d'aquesta columna en els seus K veïns més propers — i "propers" es decideix amb distància euclidiana sobre les altres features. És exactament el K-NN de regressió d'aquesta lliçó. Sense escalar, la feature de més rang numèric del dataset de MercaFresh — despesa_total (centenars o milers d'euros) o si no recencia_dies (fins a ~180) — hauria monopolitzat la distància: els "veïns" serien simplement els clients de despesa similar, ignorant tendència, ràtios i satisfacció, i les imputacions heretarien aquest biaix. Per això a 03-02 imputàvem dins d'un flux que escala — i per això l'ordre de les branques del preprocessador importa.
Conclusió
K-NN t'ha mostrat el ML en la seva expressió mínima: memoritzar el passat i predir per semblança. Pel camí has consolidat tres idees transversals: la distància és una decisió de disseny (euclidiana vs. Manhattan), sense escalat no hi ha distància que valgui (03-05 una altra vegada), i K és l'enèsim comandament del compromís entre memoritzar i generalitzar (06-05). També n'has vist les factures — predicció cara, memòria voraç, i la maledicció de la dimensionalitat que motivarà el PCA de 05-03 — i ha quedat clara la frontera amb K-means: mateix cognom, famílies diferents.
Fins ara, tots els nostres classificadors decideixen mesurant — distàncies, marges, impureses. La pròxima lliçó recupera un camí completament diferent que vam deixar obert a 02-05: decidir calculant probabilitats amb el teorema de Bayes, com feia el nostre detector de frau. Convertir aquell teorema en un classificador complet — ràpid, frugal i sorprenentment eficaç — només requereix una suposició descaradament falsa que funciona: la ingenuïtat de Naive Bayes.
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
