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

  1. L'hiperplà de marge màxim
  2. Vectors de suport: els clients que defineixen la frontera
  3. Marge tou: el paràmetre C
  4. El truc del kernel: separar l'inseparable
  5. Implementació amb scikit-learn: SVC sobre el churn
  6. Sensibilitat a l'escala i cost computacional
  7. 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 servir predict_proba com a 04-02. Si només necessites l'etiqueta o el rànquing per decision_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 linear rendeix ~igual que rbf, queda't amb linear: 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 numeric

Cost. 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 Pipeline amb 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_proba sense saber que costa. probability=True entrena un calibratge addicional amb validació interna: multiplica el temps d'entrenament. Per a rànquings (a qui trucar primer) n'hi ha prou amb decision_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

Mòdul 2: Fonaments d'Estadística i Probabilitat

Mòdul 3: Preprocessament de Dades

Mòdul 4: Algorismes de Machine Learning Supervisat

Mòdul 5: Algorismes de Machine Learning No Supervisat

Mòdul 6: Avaluació i Validació de Models

Mòdul 7: Tècniques Avançades i Optimització

Mòdul 8: Implementació i Desplegament de Models

Mòdul 9: Projectes Pràctics

Mòdul 10: Recursos Addicionals

© Copyright 2026. Tots els drets reservats