Python Data Science Program
📓 Abrir notebook en GitHub

Clase 077 — SVM lineal

Parte: 1 — Machine Learning Clásico · Fuente: Géron, cap. 5. ⏱️ Duración estimada: 60 min.

🎯 Objetivo

Entender el principio de maximización del margen que define a las Support Vector Machines lineales, distinguir entre hard margin y soft margin, y entrenar un clasificador con LinearSVC controlando el trade-off bias/varianza mediante el hiperparámetro C.

📚 Resultados de aprendizaje

Al finalizar la clase, podrás:

🗺️ Temas

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. Cargá Iris, quedate con dos features (petal length, petal width) y la clase Virginica como problema binario. Entrená un Pipeline([StandardScaler, LinearSVC(C=1, loss="hinge")]) y reportá accuracy sobre un split train/test.
  2. Repetí el entrenamiento con C=0.1, C=1, C=100. Compará accuracy, número de vectores soporte estimados y ancho del margen. ¿Qué pasa en los extremos?
  3. Graficá la frontera de decisión y el margen para los tres valores de C del ejercicio anterior (scatter de los datos + línea + márgenes punteados).
  4. Agregá un outlier artificial a la clase minoritaria y volvé a entrenar con C alto y C bajo. Mostrá cómo C bajo absorbe mejor el outlier.
  5. Compará tiempo de entrenamiento de LinearSVC vs. SVC(kernel="linear") sobre un dataset de ~10.000 muestras (make_classification). Confirmá que LinearSVC es más rápido.

📝 Homework verificable

Entregá un script tarea_068.py que:

  1. Cargue Iris binarizado (Virginica vs. resto) con petal length y petal width.
  2. Construya un Pipeline con StandardScaler + LinearSVC(C=1, loss="hinge", random_state=42).
  3. Haga train_test_split(test_size=0.2, random_state=42, stratify=y) y entrene.
  4. Imprima accuracy sobre test y los coeficientes del clasificador (coef_, intercept_).

Criterio de aceptación: accuracy >= 0.93 sobre el test set y los coeficientes deben provenir del modelo escalado (no del crudo).

⚠️ Errores comunes

  1. No escalar features. SVM es sensible a la escala; sin StandardScaler el margen lo domina la variable de mayor rango y el modelo rinde mal.
  2. Confundir la dirección de C. C alto = menos regularización (margen estrecho, más overfitting). C bajo = más regularización. Es inversa a alpha de Ridge/Lasso.
  3. Usar SVC(kernel="linear") en datasets grandes. Es O(m²) a O(m³); preferí LinearSVC (basado en liblinear) que escala mejor.
  4. Esperar predict_proba de LinearSVC. No lo soporta directamente. Usá CalibratedClassifierCV o decision_function si necesitás scores.
  5. Olvidar loss="hinge". El default de LinearSVC es "squared_hinge", que no es la pérdida SVM canónica del libro.

❓ Preguntas frecuentes

  1. ¿C alto o bajo? Depende del problema. Empezá con C=1 y ajustá con GridSearchCV. Si hay overfitting, bajá C; si hay underfitting o el modelo es demasiado tolerante, subí C.
  2. ¿Por qué se llaman "vectores soporte"? Porque son los únicos puntos que "sostienen" la frontera: si los movés, el hiperplano cambia. Los demás puntos no afectan al modelo.
  3. ¿SVM lineal sirve si los datos no son linealmente separables? Con soft margin sí, tolera violaciones. Si la separación claramente no es lineal, pasá a kernels (clase 069).
  4. ¿LinearSVC vs. LogisticRegression? Ambos producen fronteras lineales. SVM optimiza margen (hinge loss), LogReg optimiza log-likelihood. En la práctica suelen dar resultados similares; SVM tiende a ser más robusto a outliers cuando C es moderado.
  5. ¿Funciona para multiclase? Sí, vía one-vs-rest automáticamente en LinearSVC.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 078 — SVM no lineal: kernel polinomial y RBF