La regressió logística (04-02) separa les classes amb un hiperplà, però es conforma amb qualsevol hiperplà que minimitzi la log-loss. Les màquines de vectors de suport (SVM, Support Vector Machines) fan una pregunta més exigent: de tots els hiperplans que separen els clients fidels dels que abandonen, quin ho fa amb el màxim marge de seguretat? I quan cap tall recte no basta, despleguen la seva arma característica — el truc del kernel — per separar en un espai de més dimensions allò que a l'original era inseparable. En aquesta lliçó construiràs aquesta intuïció geomètrica pas a pas, entendràs quin paper hi juguen els vectors de suport i el paràmetre C, i aplicaràs SVC al churn de MercaFresh — amb les dades escalades, perquè poques famílies de models són tan sensibles a l'escala com aquesta.
Contingut
- L'hiperplà de marge màxim
- Vectors de suport: els clients que defineixen la frontera
- Marge tou: el paràmetre C
- El truc del kernel: separar l'inseparable
- Implementació amb scikit-learn: SVC sobre el churn
- Sensibilitat a l'escala i cost computacional
- Quan triar (i quan no) una SVM
L'hiperplà de marge màxim
Imagina el churn de MercaFresh amb només dues features: recencia_dies i tendencia. Els clients fidels s'agrupen a baix a la dreta (recència baixa, tendència alta); els que abandonen, a dalt a l'esquerra. Entre els dos grups hi caben infinites rectes separadores: una d'enganxada als fidels, una altra d'enganxada als que se'n van, i totes les intermèdies.
Quina preferir? La intuïció de la SVM: la recta que passa tan lluny com sigui possible dels punts més propers d'ambdues classes. Aquesta distància — de la frontera al punt més pròxim de cada costat — és el marge, i maximitzar-lo és tot l'objectiu de l'algorisme.
Per què importa el marge? Perquè les dades futures no cauran exactament on les d'entrenament. Una frontera enganxada als clients fidels classificarà malament el primer client fidel nou que caigui un mil·límetre més enllà. La frontera de marge màxim deixa la "zona d'amortiment" més gran possible a cada costat: és l'aposta geomètrica per la generalització — el mateix objectiu que perseguíem en vigilar el sobreajustament de l'arbre a 04-03, ara incorporat al mateix criteri d'entrenament.
flowchart LR
subgraph "Frontera qualsevol"
A["Separa l'entrenament...<br/>pero frega una classe:<br/>fragil davant dades noves"]
end
subgraph "Frontera de marge maxim"
B["Equidistant dels punts<br/>critics de les dues classes:<br/>maxim marge per generalitzar"]
end
A -.->|"la SVM tria"| B
Vectors de suport: els clients que defineixen la frontera
Aquí arriba la propietat més elegant del model. La posició de l'hiperplà de marge màxim depèn només dels punts que toquen el marge — els més propers a la frontera. Aquests punts són els vectors de suport (donen nom a l'algorisme: literalment sostenen la frontera).
Conseqüències pràctiques:
- Els punts llunyans no importen: el client fidelíssim amb recència de 2 dies podria moure's o desaparèixer i la frontera no canviaria ni un mil·límetre. Compara-ho amb la regressió lineal de 04-01, on tots els punts estiren la recta (i un outlier la segresta).
- El model és "dispers": de 800 clients d'entrenament, potser només 60 són vectors de suport. La resta és irrellevant per predir.
- Els vectors de suport són els casos frontera del negoci: els clients ambigus, ni clarament fidels ni clarament perduts. Inspeccionar-los (
model.support_vectors_) és mirar exactament la zona grisa on la campanya de retenció es juga el pressupost.
Marge tou: el paràmetre C
Amb dades reals, gairebé mai no existeix un hiperplà que separi les classes a la perfecció: sempre hi ha algun client fidel amb perfil de churner i viceversa (soroll, etiquetes dubtoses, encavalcament genuí). Exigir separació perfecta — el marge dur — o és impossible o produeix fronteres retorçades per complaure excepcions.
La solució és el marge tou: permetre que alguns punts violin el marge (o fins i tot caiguin al costat equivocat), pagant una penalització per cada violació. El paràmetre C regula el preu:
| C | Actitud | Frontera resultant | Risc |
|---|---|---|---|
| Petit (0.01) | Tolerant: marge ample encara que hi hagi errors a dins | Suau, general | Quedar-se curt (underfitting) |
| Intermedi (1, el valor per defecte) | Equilibrat | — | — |
| Gran (1000) | Estricte: gairebé cap error tolerat | Ajustada a cada punt de l'entrenament | Sobreajustament (06-05) |
C és el comandament del compromís entre ajustar l'entrenament i mantenir marge — la mateixa tensió que max_depth a l'arbre, amb una altra disfressa. Trobar-ne el valor òptim de manera sistemàtica (juntament amb els del kernel) és matèria de 07-05; en aquesta lliçó el mourem a mà per veure'n l'efecte.
El truc del kernel: separar l'inseparable
El cas que trenca tot l'anterior: dades on cap recta no funciona. Exemple clàssic amb sabor MercaFresh: els clients que abandonen són els de despesa molt baixa (no els interessa) i els de despesa molt alta (els capta la competència amb ofertes agressives), mentre que els de despesa mitjana es queden. A l'eix de la despesa, la classe "churn" ocupa els dos extrems: impossible separar-la amb un únic tall.
La idea salvadora: afegir una dimensió. Si a cada client li afegim la feature despesa² (distància al centre), els churners dels dos extrems queden a dalt (despesa² gran) i els fidels a baix — i en aquest espai ampliat, un pla els separa netament. La frontera lineal de l'espai ampliat, vista des de l'espai original, és una corba.
El truc del kernel fa això sense construir les features noves: les matemàtiques de la SVM només necessiten productes escalars entre punts, i una funció kernel calcula directament "el producte escalar que tindrien els punts a l'espai ampliat" sense visitar-lo mai. És com obtenir el benefici de PolynomialFeatures (03-06) amb infinites features i el cost d'unes poques.
| Kernel | kernel= |
Espai implícit | Quan fer-lo servir |
|---|---|---|---|
| Lineal | "linear" |
L'original | Moltes features, poques mostres; text; primera prova |
| Polinòmic | "poly" |
Productes i potències fins a grau d | Interaccions d'ordre conegut |
| RBF (gaussià) | "rbf" (per defecte) |
Dimensió infinita: similitud local tipus campana | Opció per defecte per a problemes no lineals |
El kernel RBF mereix una frase més: classifica cada punt nou segons la seva similitud (una campana gaussiana, parent de la normal de 02-02) amb els vectors de suport — pot dibuixar fronteres arbitràriament corbes, fins i tot illes. El seu paràmetre gamma controla l'abast d'aquesta similitud: gamma gran = campanes estretes = frontera molt flexible (i procliu al sobreajustament); gamma petit = campanes amples = frontera suau.
Implementació amb scikit-learn: SVC sobre el churn
La SVM calcula distàncies entre punts, així que l'escalat no és opcional: sense ell, despesa_mitjana_comanda (desenes d'euros) aixafaria ratio_inactivitat (0–1) en qualsevol distància. Recuperem el preprocessador complet de 03-06 — amb el seu RobustScaler — dins del Pipeline, igual que a 04-02:
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
# 'preprocessador' es el ColumnTransformer de 03-06 (el mateix de 04-02),
# amb imputacio, Yeo-Johnson, RobustScaler i codificacio categorica
X_entrenament, X_prova, y_entrenament, y_prova = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42)
svm_rbf = Pipeline([
("prep", preprocessador),
("model", SVC(kernel="rbf", C=1.0, gamma="scale", probability=True)),
])
svm_rbf.fit(X_entrenament, y_entrenament)
print(f"SVM RBF - accuracy en prova: {svm_rbf.score(X_prova, y_prova):.2%}")
# Comparativa rapida de kernels i valors de C
for kernel in ["linear", "rbf"]:
for C in [0.1, 1, 100]:
m = Pipeline([("prep", preprocessador),
("model", SVC(kernel=kernel, C=C))])
m.fit(X_entrenament, y_entrenament)
print(f"kernel={kernel:6s} C={C:5} | "
f"entrenament: {m.score(X_entrenament, y_entrenament):.2%} | "
f"prova: {m.score(X_prova, y_prova):.2%} | "
f"vectors de suport: {m.named_steps['model'].n_support_.sum()}")Claus de lectura:
gamma="scale": heurística de sklearn que adapta gamma a la variància de les dades; bon punt de partida.probability=True: la SVM nativa retorna distàncies a la frontera, no probabilitats; aquesta opció afegeix un calibratge intern (costós) per poder fer servirpredict_probacom a 04-02. Si només necessites l'etiqueta o el rànquing perdecision_function, omet-la.- A la comparativa, observa el patró: amb C = 100, l'accuracy d'entrenament puja i la de prova sol baixar — el sobreajustament traient el cap —, mentre que el nombre de vectors de suport cau (marge estricte, menys punts a dins). Amb C = 0.1, marge ample, més vectors de suport i fronteres més suaus.
- Si
linearrendeix ~igual querbf, queda't amblinear: més ràpid, més interpretable (té coeficients com 04-02) i menys hiperparàmetres.
Sensibilitat a l'escala i cost computacional
Dues advertències d'enginyeria abans d'enamorar-se del model:
Escala. La demostració de per què el RobustScaler de 03-05 no és decoratiu:
sense_escalar = Pipeline([
("prep", prep_arbre), # el preprocessador SENSE escalat de 04-03
("model", SVC(kernel="rbf")),
])
sense_escalar.fit(X_entrenament, y_entrenament)
print(f"SVM sense escalar: {sense_escalar.score(X_prova, y_prova):.2%}")
# Tipicament diversos punts pitjor que amb el preprocessador complet:
# les distancies les domina la feature de mes rang numericCost. L'entrenament d'una SVM amb kernel creix aproximadament entre O(n²) i O(n³) amb el nombre de mostres — duplicar clients multiplica el temps per 4-8. Ordres de magnitud pràctics:
| Mida del dataset | SVM kernel RBF | Alternativa raonable |
|---|---|---|
| < 10 000 files | Còmoda | — |
| 10 000 – 100 000 | Lenta; considerar LinearSVC |
Regressió logística, arbres |
| > 100 000 | Impracticable amb kernel | Models lineals, ensembles (07-02) |
A més, predir requereix comparar cada punt nou amb tots els vectors de suport: un model amb milers de vectors és lent també en producció (08-02).
Quan triar (i quan no) una SVM
| A favor de la SVM | En contra |
|---|---|
| Datasets petits o mitjans amb frontera complexa | Datasets grans (cost d'entrenament) |
| Moltes features i poques mostres (el kernel lineal brilla) | Necessitat de probabilitats ben calibrades de sèrie |
| Robustesa davant de punts llunyans (només manen els vectors de suport) | Necessitat d'interpretabilitat tipus regles (fes servir 04-03) o coeficients (04-02, kernel lineal a banda) |
| Màxima capacitat de separació amb poques dades | Moltíssim preprocessament obligatori: escalar sempre |
Regla d'ofici: en un problema tabular de mida MercaFresh (milers de clients), prova la logística com a línia base, l'arbre per interpretabilitat, i la SVM RBF quan sospitis fronteres corbes que als altres se'ls escapen. Si la SVM guanya amb claredat, sol assenyalar que hi ha estructura no lineal que també explotaran els ensembles (07-02, 07-03).
Errors Comuns i Consells
- Entrenar sense escalar. L'error número u amb SVM, i silenciós: el model entrena, prediu i rendeix malament sense avisar del perquè. El
Pipelineamb el preprocessador de 03-06 ho fa estructuralment impossible. - Saltar directament al kernel RBF amb C i gamma a l'atzar. Dos comandaments sensibles alhora produeixen des d'underfitting sever fins a memorització total. Comença amb els valors per defecte (
C=1, gamma="scale") i compara amb el kernel lineal abans de sofisticar-te; l'ajust fi sistemàtic arriba a 07-05. - Fer servir
predict_probasense saber que costa.probability=Trueentrena un calibratge addicional amb validació interna: multiplica el temps d'entrenament. Per a rànquings (a qui trucar primer) n'hi ha prou ambdecision_function, gratis. - Ignorar el desequilibri de classes. Amb un 90% de clients fidels, el marge òptim pot sacrificar completament la classe minoritària.
SVC(class_weight="balanced")reequilibra les penalitzacions; el diagnòstic fi, a 06-02. - Consell: mira sempre
n_support_. Si la majoria de l'entrenament són vectors de suport, el model està memoritzant (C o gamma massa alts) o les classes s'encavalquen de debò — en tots dos casos, és una alarma que cap altre número no et dona tan barata.
Exercicis
Exercici 1. Conceptual: al dataset de churn hi ha un client fidel claríssim (recència 1 dia, tendència 2.0) molt lluny de la frontera, i un client ambigu (recència 55, tendència 0.8) enganxat a ella. Quin dels dos afecta la frontera de la SVM si l'elimines de l'entrenament? I en una regressió logística? Justifica-ho.
Exercici 2. Amb el Pipeline de la lliçó, entrena SVM RBF amb gamma a [0.01, 0.1, 1, 10] (amb C=1 fix) i mostra l'accuracy en entrenament i prova per a cada valor. Interpreta el patró en termes d'"abast de la campana de similitud".
Exercici 3. MercaFresh obre línia majorista i el seu dataset passa de 5 000 a 2 000 000 de comandes etiquetades. L'equip proposa reentrenar la SVM RBF tal qual. Dona dues raons per desaconsellar-ho i dues alternatives concretes del curs.
Solucions
Exercici 1
El client llunyà no és vector de suport: eliminar-lo no canvia la frontera en absolut — la SVM només depèn dels punts que sostenen el marge. L'ambigu gairebé segur que sí que ho és: treure'l pot desplaçar la frontera visiblement. A la regressió logística tots dos compten (tots els punts aporten a la log-loss), encara que el llunyà aporti un gradient minúscul: la frontera es mouria, poc però una mica, en tots dos casos. Moralitat: la SVM concentra la seva atenció exactament en la zona grisa; la logística escolta tothom.
Exercici 2
for gamma in [0.01, 0.1, 1, 10]:
m = Pipeline([("prep", preprocessador),
("model", SVC(kernel="rbf", C=1, gamma=gamma))])
m.fit(X_entrenament, y_entrenament)
print(f"gamma={gamma:5} | entrenament: {m.score(X_entrenament, y_entrenament):.2%}"
f" | prova: {m.score(X_prova, y_prova):.2%}")Patró esperat: amb gamma = 0.01 les campanes són tan amples que tot s'assembla a tot — frontera gairebé plana, rendiment mediocre en tots dos conjunts (underfitting). En pujar gamma, la prova millora fins a un màxim. Amb gamma = 10 les campanes són tan estretes que cada vector de suport només "veu" el seu veïnat immediat: l'entrenament es dispara cap al 100% i la prova cau — el model ha dibuixat una illa al voltant de cada client de l'entrenament. És la corba de 06-05 una altra vegada, ara amb gamma com a comandament de complexitat.
Exercici 3
Raons en contra: (1) cost d'entrenament ~O(n²)-O(n³): passar de 5 000 a 2 000 000 de files multiplica el temps per centenars de milers — de minuts a mesos; (2) el model resultant tindria una enormitat de vectors de suport, fent també la predicció lenta i el model pesat en producció (08-03 tractarà aquest manteniment). Alternatives del curs: regressió logística (04-02), que escala linealment i dona probabilitats; arbres (04-03) i els seus ensembles (07-02, 07-03), que manegen milions de files i no-linealitat; o si més no LinearSVC, la variant lineal sense kernel, si es vol conservar la filosofia de marge. Amb moltíssimes dades, els models simples atrapen els complexos: l'avantatge de la SVM amb kernel viu en el règim de dades escasses.
Conclusió
Les SVM t'han donat la tercera geometria del mòdul: on la logística ajusta un hiperplà probabilístic i l'arbre trosseja l'espai en rectangles, la SVM busca el tall de màxim marge sostingut només pels punts frontera, tolera excepcions a un preu regulat per C, i — amb el truc del kernel — separa en espais implícits allò que a l'original era inseparable. A canvi exigeix respecte: escalat sempre, cautela amb C i gamma, i consciència del seu cost quan les dades creixen.
Fixa't en l'ingredient que el kernel RBF va posar sobre la taula: classificar segons la similitud amb altres punts. La pròxima lliçó porta aquesta idea a la seva expressió més pura i radical: un model sense entrenament, sense equació i sense frontera explícita, que classifica cada client nou preguntant simplement als seus veïns més propers què són ells. És K veïns més propers, l'algorisme més intuïtiu de tot el mòdul.
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
