Las máquinas de soporte vectorial, conocidas como SVM, son modelos de clasificación que buscan separar las clases con una frontera lo más sólida posible.
La intuición principal no es solo “separar”, sino separar con margen. Es decir, elegir una frontera que deje la mayor distancia posible entre los grupos.
Imaginemos dos grupos de puntos: compradores y no compradores. Muchas líneas podrían separarlos. SVM intenta elegir la que deje el espacio más amplio posible entre ambos grupos.
Ese espacio se llama margen. Cuanto mayor sea, más robusta tiende a ser la separación frente a pequeñas variaciones en los datos.
No todos los puntos del dataset influyen igual. Los más importantes para definir la frontera son los que quedan más cerca del borde entre clases.
Esos puntos se llaman vectores de soporte. Son los ejemplos que “sostienen” la frontera de decisión.
Por eso el algoritmo lleva ese nombre.
SVM puede rendir muy bien cuando:
Es un modelo especialmente conocido por su buen desempeño en muchos problemas de clasificación, incluso cuando las relaciones no son triviales.
SVM depende mucho de distancias y geometría del espacio de variables. Por eso, cuando unas columnas tienen escalas muy distintas de otras, el resultado puede distorsionarse.
En la práctica, es muy común usar SVM junto con StandardScaler. No es un detalle menor: en muchos casos mejora claramente el comportamiento del modelo.
Uno de los parámetros más importantes de SVM es C. De forma intuitiva:
C grande penaliza más los errores y busca ajustar más estrictamente los datos;C más chico permite una frontera más flexible y tolera más errores.No hace falta profundizar demasiado todavía. Lo importante es entender que C controla el equilibrio entre ajuste y generalización.
Vamos a predecir si un cliente comprará según dos variables:
Usaremos un Pipeline con StandardScaler y SVC. También activaremos probability=True para obtener probabilidades estimadas.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
clientes = pd.DataFrame({
"paginas_vistas": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 5, 8],
"minutos_sitio": [1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 3, 4],
"compra": [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1]
})
X = clientes[["paginas_vistas", "minutos_sitio"]]
y = clientes["compra"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y
)
modelo = Pipeline([
("escalador", StandardScaler()),
("svm", SVC(kernel="rbf", C=1.0, probability=True, random_state=42))
])
modelo.fit(X_train, y_train)
y_pred = modelo.predict(X_test)
print("Valores reales:", y_test.values)
print("Predicciones:", y_pred)
print("Exactitud:", accuracy_score(y_test, y_pred))
nuevo_cliente = pd.DataFrame({
"paginas_vistas": [7],
"minutos_sitio": [4]
})
prediccion = modelo.predict(nuevo_cliente)[0]
probabilidad = modelo.predict_proba(nuevo_cliente)[0, 1]
print("Predicción para el nuevo cliente:", prediccion)
print(f"Probabilidad de compra: {probabilidad:.3f}")
Salida resumida esperada:
Valores reales: [...]
Predicciones: [...]
Exactitud: ...
Predicción para el nuevo cliente: ...
Probabilidad de compra: ...
El modelo primero escala las variables para que páginas vistas y minutos en el sitio queden en magnitudes comparables. Después, SVM busca una frontera que separe compradores y no compradores con el mejor margen posible.
Como usamos un kernel rbf, el modelo puede capturar relaciones no lineales de forma más flexible que una simple línea recta.
El kernel define la forma de la frontera de decisión. Para comenzar, alcanza con esta idea:
linear: intenta separar con una frontera lineal;rbf: permite fronteras más flexibles;poly: usa una forma polinómica.En la práctica introductoria, rbf es una opción muy común porque puede adaptarse a más situaciones.
StandardScaler(): escala las variables antes de entrenar SVM.SVC(...): crea el clasificador SVM.kernel="rbf": permite una frontera no lineal.probability=True: habilita el cálculo de probabilidades estimadas.Pipeline([...]): garantiza que el mismo flujo se aplique en entrenamiento, prueba y predicción.Ventajas:
Limitaciones: