Estoy tratando de interpretar los pesos de las variables dadas por el ajuste de una SVM lineal.
Una buena forma de entender cómo se calculan las ponderaciones y cómo interpretarlas en el caso de la SVM lineal es realizar los cálculos a mano en un ejemplo muy sencillo.
Ejemplo
Consideremos el siguiente conjunto de datos que es linealmente separable
import numpy as np
X = np.array([[3,4],[1,4],[2,3],[6,-1],[7,-1],[5,-3]] )
y = np.array([-1,-1, -1, 1, 1 , 1 ])
Resolución del problema de la SVM por inspección
Por inspección podemos ver que la línea límite que separa los puntos con mayor "margen" es la línea $x_2 = x_1 - 3$ . Dado que los pesos de la SVM son proporcionales a la ecuación de esta línea de decisión (hiperplano en dimensiones superiores) utilizando $w^T x + b = 0$ una primera estimación de los parámetros sería
$$ w = [1,-1] \ \ b = -3$$
La teoría de la SVM nos dice que la "anchura" del margen viene dada por $ \frac{2}{||w||}$ . Utilizando la conjetura anterior obtendríamos un anchura de $\frac{2}{\sqrt{2}} = \sqrt{2}$ . lo cual, por inspección, es incorrecto. La anchura es $4 \sqrt{2}$
Recordemos que al escalar el límite por un factor de $c$ no cambia la línea límite, por lo que podemos generalizar la ecuación como
$$ cx_1 - cx_2 - 3c = 0$$ $$ w = [c,-c] \ \ b = -3c$$
Introduciendo de nuevo la ecuación de la anchura obtenemos
\begin{aligned} \frac{2}{||w||} & = 4 \sqrt{2} \\ \frac{2}{\sqrt{2}c} & = 4 \sqrt{2} \\ c = \frac{1}{4} \end{aligned}
Por lo tanto, los parámetros (o coeficientes) son en realidad $$ w = [\frac{1}{4},-\frac{1}{4}] \ \ b = -\frac{3}{4}$$
(Estoy usando scikit-learn)
Yo también, aquí hay un código para comprobar nuestros cálculos manuales
from sklearn.svm import SVC
clf = SVC(C = 1e5, kernel = 'linear')
clf.fit(X, y)
print('w = ',clf.coef_)
print('b = ',clf.intercept_)
print('Indices of support vectors = ', clf.support_)
print('Support vectors = ', clf.support_vectors_)
print('Number of support vectors for each class = ', clf.n_support_)
print('Coefficients of the support vector in the decision function = ', np.abs(clf.dual_coef_))
- w = [[ 0,25 -0,25]] b = [-0,75]
- Índices de los vectores de apoyo = [2 3]
- Vectores soporte = [[ 2. 3.] [ 6. -1.]]
- Número de vectores de soporte para cada clase = [1 1]
- Coeficientes del vector soporte en la función de decisión = [[0,0625 0,0625]]
¿El signo del peso tiene algo que ver con la clase?
En realidad no, el signo de los pesos tiene que ver con la ecuación del plano límite.
Fuente
https://ai6034.mit.edu/wiki/images/SVM_and_Boosting.pdf