Ir al contenido

Margen suave, C y la pérdida hinge

En simple: lee esto primero

En la vida real las clases se mezclan, así que permitimos que algunos puntos se metan en el pasillo… pagando una multa.

Imagínalo así

Es como un estacionamiento: puedes pisar la línea, pero te ponen una multa proporcional a cuánto te pasaste. C decide qué tan cara es la multa.

Lo que tienes que llevarte
  • C grande: multas caras → casi no se permiten errores → pasillo estrecho (riesgo de memorizar).
  • C chico: multas baratas → pasillo ancho, tolera errores (modelo más simple).
  • La pérdida hinge: 0 si estás bien clasificado y fuera del pasillo; si no, crece en línea recta.
Palabras raras de esta página
holgura (ξ)
cuánto se metió un punto en el pasillo o en el lado equivocado.
C
la perilla que dice cuánto castigar los errores.
pérdida hinge
la «multa» del SVM: cero si todo bien, y crece a medida que te equivocas.

Más abajo viene la versión completa, con fórmulas. Si una palabra aparece subrayada con puntos, pasa el mouse (o tócala) para ver qué significa.

Las clases se traslapan, hay etiquetas mal puestas, un punto raro se mete en la otra clase. Entonces ningún (w,b)(\mathbf{w},b) cumple yif(xi)≥1y_if(\mathbf{x}_i)\ge1 para todos: el margen duro es infactible. Peor: aun cuando separar es posible, insistir puede reducir el margen a una astilla por un solo outlier: overfitting con otro nombre.

Arreglo: dejar de exigir y empezar a cobrar. Un punto puede romper su margen pero paga en proporción a cuánto invade.

yi(w⊤xi+b)≥1−ξi,ξi≥0y_i(\mathbf{w}^\top\mathbf{x}_i+b)\ge 1-\xi_i,\qquad \xi_i\ge0
ξi\xi_iSituación
00cumple la regla original: fuera de la banda
0<ξi≤10<\xi_i\le1entró a la banda pero sigue del lado correcto
ξi>1\xi_i>1cruzó la frontera: mal clasificado

Sin precio, el solver pondría todos los ξi\xi_i enormes y w=0\mathbf{w}=0. Así que se suman al objetivo:

min⁡w,b,ξ 12∥w∥2⏟banda ANCHA+C∑i=1nξi⏟POCAS invasioness.a.yi(w⊤xi+b)≥1−ξi,  ξi≥0\boxed{\min_{\mathbf{w},b,\boldsymbol\xi}\ \underbrace{\tfrac12\|\mathbf{w}\|^2}_{\text{banda ANCHA}}+C\underbrace{\sum_{i=1}^n\xi_i}_{\text{POCAS invasiones}}\quad\text{s.a.}\quad y_i(\mathbf{w}^\top\mathbf{x}_i+b)\ge1-\xi_i,\ \ \xi_i\ge0}

C: el tipo de cambio entre ancho y violaciones

Sección titulada «C: el tipo de cambio entre ancho y violaciones»
  • C grande: invadir es caro ⇒ el optimizador retuerce la frontera para mantener ξ≈0\xi\approx0 ⇒ margen angosto, pocos vectores de soporte, alta varianza. Con C→∞C\to\infty se recupera el margen duro.
  • C pequeño: invadir es barato ⇒ compra una banda ancha y suave, tolera violaciones ⇒ muchos vectores de soporte, alto sesgo.

C es el dial de regularización del SVM, el mismo trade-off sesgo–varianza que λ en ridge, pero invertido: C grande = regularización débil (λ∝1/C\lambda\propto1/C). En la slide: C = 0.05 → margen 2.19, 38 SVs; C = 1 → 0.95, 17 SVs; C = 100 → 0.55, 12 SVs.

Repitiendo la derivación con los ξi\xi_i (y multiplicadores μi≥0\mu_i\ge0 para ξi≥0\xi_i\ge0), ∂L/∂ξi=C−αi−μi=0\partial L/\partial\xi_i = C-\alpha_i-\mu_i=0 agrega una sola restricción nueva, αi≤C\alpha_i\le C:

max⁡α∑iαi−12∑i,jαiαjyiyj xi⊤xjs.a.0≤αi≤C,  ∑iαiyi=0\max_{\boldsymbol\alpha}\sum_i\alpha_i-\frac12\sum_{i,j}\alpha_i\alpha_jy_iy_j\,\mathbf{x}_i^\top\mathbf{x}_j\quad\text{s.a.}\quad \boxed{0\le\alpha_i\le C},\ \ \sum_i\alpha_iy_i=0

Todo lo demás igual: mismo objetivo, misma restricción de balance, solo productos internos. C es un tope a cuánto puede empujar un punto: ningún outlier, por extremo que sea, ejerce más de C unidades de presión. Eso hace robusto al margen suave.

αi\alpha_iCondiciónSignificado
αi=0\alpha_i=0yif(xi)≥1y_if(\mathbf{x}_i)\ge1, ξi=0\xi_i=0sobre o fuera del margen: espectador
0<αi<C0<\alpha_i<Cyif(xi)=1y_if(\mathbf{x}_i)=1, ξi=0\xi_i=0vector de soporte libre, justo sobre la recta
αi=C\alpha_i=Cyif(xi)≤1y_if(\mathbf{x}_i)\le1, ξi≥0\xi_i\ge0dentro de la banda o del lado equivocado: empuja al máximo

Solo el caso del medio da bb: b=yk−w⊤xkb=y_k-\mathbf{w}^\top\mathbf{x}_k en un vector de soporte libre. Si no hay ninguno, bb queda en un intervalo y los solvers toman su punto medio. (Ahora los vectores de soporte incluyen todo punto con ξi>0\xi_i>0, no solo los que tocan el margen.)

Con (w,b)(\mathbf{w},b) fijo, sea mi=yif(xi)m_i=y_if(\mathbf{x}_i). La holgura debe cumplir ξi≥0\xi_i\ge0 y ξi≥1−mi\xi_i\ge1-m_i, y cuesta Cξi>0C\xi_i>0, así que el optimizador toma la mínima legal: ξi⋆=max⁡(0,1−mi)\xi_i^\star=\max(0,1-m_i). Sustituyendo:

min⁡w,b 12∥w∥2⏟regularizacioˊn L2+C∑i=1nmax⁡(0, 1−yif(xi))⏟peˊrdida hinge\min_{\mathbf{w},b}\ \underbrace{\tfrac12\|\mathbf{w}\|^2}_{\text{regularización }L_2}+C\sum_{i=1}^n\underbrace{\max\big(0,\,1-y_if(\mathbf{x}_i)\big)}_{\text{pérdida hinge}}

El SVM no es una especie exótica: es un modelo lineal entrenado con pérdida + penalización, la receta de las sesiones 03–04, donde la pérdida resulta ser la hinge. Los tres casos de holgura son tres tramos de una misma curva: a la derecha de m=1m=1 paga 0; entre 0 y 1 paga pero está bien; a la izquierda de 0 está mal. El costo sube linealmente.

  • 0/1: lo que de verdad nos importa, pero es un escalón (gradiente plano con un salto): imposible de optimizar.
  • Hinge: convexa y exactamente 0 una vez que m≥1m\ge1: los puntos correctos con holgura se ignoran.
  • Logística: convexa, pero nunca llega a 0: todo punto sigue tirando de la frontera para siempre.
  • Cuadrática: vuelve a subir para m>1m>1: castiga por ser demasiado correcto. No sirve para clasificar.

La zona plana de la hinge es la historia de los vectores de soporte vista como pérdida: un punto con pérdida 0 y gradiente 0 no puede influir en el ajuste.

Vista geométricaVista de pérdida
maximizar la banda vacíaminimizar hinge + penalización L2
restricciones y multiplicadoressin restricciones
los vectores de soporte sostienen la fronterapuntos con pérdida 0 tienen gradiente 0
lleva al dual y a los kernelslleva a SGD sobre datos enormes
  1. Estandariza las features: ∥w∥\|\mathbf{w}\| mezcla todas, así que una columna en millones domina el margen en silencio. No es opcional (y el escalador se ajusta solo con los folds de entrenamiento).
  2. Empieza lineal. Si funciona bien, para: más rápido e interpretable.
  3. Si no, RBF y grilla log de C y γ juntos con validación cruzada.
  4. Inspecciona los vectores de soporte: si casi todos lo son, C es muy chico (o γ muy grande).

Lo que el SVM simple no da:

  • Probabilidades: la salida es un score con signo, no P(y=1∣x)P(y=1\mid\mathbf{x}). Las librerías ajustan una logística a los scores (Platt scaling), con CV extra, y puede contradecir el signo del score.
  • Más de dos clases: es binario. One-vs-rest (KK clasificadores) u one-vs-one (K(K−1)/2K(K-1)/2, lo que hace sklearn.svm.SVC) + votación.
  • Entrenamiento barato en datos enormes: kernel SVM cuesta ∼O(n2)\sim O(n^2)–O(n3)O(n^3) y la matriz n×nn\times n. Más allá de ∼105\sim10^5 puntos, SVM lineal con SGD/hinge.

w=(1,1)\mathbf{w}=(1,1), b=−1b=-1, C=1C=1. Puntos: A=(2,1)A=(2,1), y=+1y=+1; B=(0.5,0.3)B=(0.5,0.3), y=+1y=+1; Cp=(1,1)C_p=(1,1), y=−1y=-1. Calcula mim_i, ξi\xi_i y el objetivo.

Ver solución
  • AA: f=2f=2, m=2m=2 ⇒ ξ=0\xi=0 (fuera de la banda).
  • BB: f=−0.2f=-0.2, m=−0.2m=-0.2 ⇒ ξ=1.2>1\xi=1.2>1 (mal clasificado).
  • CpC_p: f=1f=1, m=−1m=-1 ⇒ ξ=2\xi=2 (mal clasificado, lejos).

Objetivo =12⋅2+1⋅(0+1.2+2)=4.2=\tfrac12\cdot2 + 1\cdot(0+1.2+2) = 4.2.

Autoevaluación

0/6 correctas · 0 respondidas
1. Estandarizar las features es opcional en un SVM porque es invariante a la escala.
2. El SVM es un modelo generativo que entrega P(y=1∣x)P(y=1\mid\mathbf{x}).
3. Un punto con ξi=0.4\xi_i = 0.4 está…
4. En el dual de margen suave, el único cambio es…
5. Aumentar C tiende a…
6. La hinge max⁡(0,1−m)\max(0, 1-m) vale 0 cuando…
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC, LinearSVC
from sklearn.model_selection import GridSearchCV
import numpy as np
pipe = make_pipeline(StandardScaler(), SVC(kernel='linear'))
grid = GridSearchCV(pipe, {'svc__C': np.logspace(-2, 3, 11)}, cv=5).fit(X_tr, y_tr)
svm = grid.best_estimator_[-1]
print(grid.best_params_, 'nº de SV por clase:', svm.n_support_)
big = make_pipeline(StandardScaler(), LinearSVC(C=1.0)) # hinge + L2, escala a n grande
proba = make_pipeline(StandardScaler(), SVC(probability=True)) # Platt scaling (CV interna)

Fuente ·ML_Course_SVM.pdf (slides 50–75) · ML_Course/session-06a-margin-and-soft-margin.ipynb · BANCO_DE_PREGUNTAS_ML_PART_1.pdf