Blog
Support Vector Machines (SVM)
- Publicado por: Rafael Fernandez
- Categoría: Machine Learning scikit-learn

-Entenderemos lo que son las maquinas vectoriales de apoyo, sus ventajas, desventajas y clasificación.
-Aprenderemos a usar los métodos SVC, NuSVC y LinearSVC con sus respectivos ejemplos.
Las máquinas vectoriales de apoyo en ingles “Support Vector Machines” (SVMs) son un conjunto de métodos de aprendizaje supervisados utilizados para la clasificación, regresión y detección de valores atípicos.
Las ventajas del Support Vector Machines son:
- Eficaz en espacios de grandes dimensiones.
- Todavía eficaz en casos donde el número de dimensiones es mayor que el número de muestras.
- Utiliza un subconjunto de puntos de entrenamiento en la función de decisión (llamada vectores de soporte), por lo que también es eficiente en memoria.
- Versátil: se pueden especificar diferentes funciones del núcleo para la función de decisión. Se proporcionan kernels comunes, pero también es posible especificar kernels personalizados.
Las desventajas de las máquinas vectoriales de apoyo incluyen:
- Si el número de características es mucho mayor que el número de muestras, evite el exceso de ajuste al elegir las funciones del Kernel y el término de regularización es crucial.
- Los SVMs no proporcionan directamente estimaciones de probabilidad, éstas se calculan utilizando una validación cruzada quíntuple (véase Partituras y probabilidades, más abajo).
Support Vector Machines en scikit-learning soportan tanto vectores de muestra densos (numpy.ndarray y convertibles a eso por numpy.asarray) como escasos (cualquier vector de muestra esporádico) como entrada. Sin embargo, para utilizar una SVM hacer predicciones de datos escasos, debe haber sido adecuada en tales datos. Para un rendimiento óptimo, utilice numpy.ndarray (dense) o scipy. sparse.csr_matrix (sparse) con dtype=float64.
Clasificación de Support Vector Machines
SVC, NuSVC y LinearSVC son clases capaces de realizar la clasificación multiclase en un conjunto de datos.
SVC y NuSVC son métodos similares, pero aceptan conjuntos de parámetros ligeramente diferentes y tienen formulaciones matemáticas diferentes. Por otro lado, LinearSVC es otra implementación de Support Vector Classification para el caso de un núcleo lineal. Tenga en cuenta que LinearSVC no acepta kernel de palabras clave, ya que se supone que es lineal.
Como otros clasificadores, SVC, NuSVC y LinearSVC toman como entradas dos matrices: una matriz X de tamaño[n_muestras, n_features] que contiene las muestras de entrenamiento, y una matriz y de etiquetas de clase (secuencias o enteros), tamaño [n_muestras]:
from sklearn import svm X = [[0, 0], [1, 1]] y = [0, 1] clf = svm.SVC() clf.fit(X, y)
Después del ajuste, el modelo se puede utilizar para predecir nuevos valores:
clf.predict([[3.,3.]])
Resultado
array([1]) perteneze al grupo 1
Multi-class clasificacion
SVC y NuSVC implementan el enfoque “uno contra uno” para la clasificación multiclase. Si n_clase es el número de clases, entonces se construyen n_clase*(n_clase – 1) / 2 clasificadores y cada uno entrena datos de dos clases. Para proporcionar una interfaz coherente con otros clasificadores, la opción decision_function_shape permite agregar los resultados de los clasificadores “uno contra uno” a una función de decisión de forma (n_muestras, n_clases):
from sklearn import svm X = [[0], [1], [2], [3]] Y = [0, 1, 2, 3] clf = svm.SVC(decision_function_shape='ovo') clf.fit(X, Y) dec = clf.decision_function([[1]]) dec.shape[1] # 4 clases: 4*3/2 = 6 clf.decision_function_shape = "ovr" dec = clf.decision_function([[1]]) dec.shape[1] # 4 clases
Por otro lado, LinearSVC implementa la estrategia multiclase “one-vs-the-rest”, por lo que forma modelos n_class. Si sólo hay dos clases, sólo se capacita a un modelo:
lin_clf = svm.LinearSVC() lin_clf.fit(X, Y) dec = lin_clf.decision_function([[1]]) dec.shape[1]
Scores and probabilities
El método SVC decision_function proporciona puntuaciones por clase para cada muestra (o una puntuación única por muestra en el caso binario). Cuando la probabilidad de la opción constructor está configurada en Verdadero, se habilitan las estimaciones de probabilidad de membresía de clase (de los métodos predict_proba y predict_log_proba). En el caso binario, las probabilidades se calibran utilizando la escala Platt: regresión logística en las puntuaciones del SVM, ajustada por una validación cruzada adicional en los datos de entrenamiento. En el caso multiclase, esto se extiende según Wu et al. (2004).
No hace falta decir que la validación cruzada involucrada en el escalado Platt es una operación costosa para grandes conjuntos de datos. Además, las estimaciones de probabilidad pueden ser inconsistentes con las puntuaciones, en el sentido de que el “argmax” de las puntuaciones puede no ser el argmax de las probabilidades. También se sabe que el método de Platt tiene problemas teóricos. Si se requieren puntuaciones de confianza, pero éstas no tienen que ser probabilidades, entonces es aconsejable establecer probability=False y utilizar decision_function en lugar de predict_proba.
Ejemplos SVM: máximo margen de separación del hiperplano
import numpy as np import matplotlib.pyplot as plt from sklearn import svm from sklearn.datasets import make_blobs # creamos 100 puntos X, y = make_blobs(n_samples=100, centers=2, random_state=6) #ajusta el modelo clf = svm.SVC(kernel='linear', C=1000) clf.fit(X, y) plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired) # plotea la decision funcion ax = plt.gca() xlim = ax.get_xlim() ylim = ax.get_ylim() # crea la malla para evaluar el modelo xx = np.linspace(xlim[0], xlim[1], 30) yy = np.linspace(ylim[0], ylim[1], 30) YY, XX = np.meshgrid(yy, xx) xy = np.vstack([XX.ravel(), YY.ravel()]).T Z = clf.decision_function(xy).reshape(XX.shape) # plotea decision margenes y fronteras ax.contour(XX, YY, Z, colors='g', levels=[-1, 0, 1], alpha=0.5, linestyles=['-.', '-', '-.']) # plotea support vectors ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none') plt.show()
➡ Continúa aprendiendo de Machine Learning con nuestro curso:
[…] discriminatorio de clasificadores lineales bajo funciones de pérdida convexa tales como Máquinas Vectoriales de Soporte (lineal) y Regresión Logística. A pesar de que SGD ha estado presente en la comunidad de […]
[…] del lenguaje natural. Para la clasificación, el rendimiento de los modelos clásicos (como las Support Vector Machines) en los datos está en el rango del 70% al 80% (por ejemplo, del 78% al 82%). Una preparación de […]
[…] discriminatorio de clasificadores lineales bajo funciones de pérdida convexa tales como Máquinas Vectoriales de Soporte (lineal) y Regresión Logística. A pesar de que SGD ha estado presente en la comunidad de […]