67 votos

¿Cómo se interpretan los pesos de las características de la SVM?

Estoy tratando de interpretar los pesos de las variables dadas por el ajuste de una SVM lineal.

(Estoy usando scikit-learn ):

from sklearn import svm

svm = svm.SVC(kernel='linear')

svm.fit(features, labels)
svm.coef_

No encuentro nada en la documentación que indique específicamente cómo se calculan o interpretan estos pesos.

¿El signo del peso tiene algo que ver con la clase?

75voto

Bitwise Puntos 3141

Para un kernel general es difícil interpretar los pesos de la SVM, sin embargo para la SVM lineal existe una interpretación útil:

1) Recordemos que en la SVM lineal, el resultado es un hiperplano que separa las clases lo mejor posible. Los pesos representan este hiperplano, dándole las coordenadas de un vector que es ortogonal al hiperplano - estos son los coeficientes dados por svm.coef_. Llamemos a este vector w.

2) ¿Qué podemos hacer con este vector? Su dirección nos da la clase prevista, por lo que si se toma el producto punto de un punto cualquiera con el vector, se puede saber de qué lado está: si el producto punto es positivo, pertenece a la clase positiva, si es negativo pertenece a la clase negativa.

3) Por último, puedes incluso aprender algo sobre la importancia de cada característica. Esta es mi propia interpretación, así que convénzase usted mismo primero. Digamos que el svm encontraría sólo una característica útil para separar los datos, entonces el hiperplano sería ortogonal a ese eje. Entonces, se podría decir que el tamaño absoluto del coeficiente en relación con los otros da una indicación de la importancia de la característica para la separación. Por ejemplo, si sólo se utiliza la primera coordenada para la separación, w será de la forma (x,0) donde x es algún número no nulo y entonces |x|>0.

5 votos

El punto 3 es la base del algoritmo RFE que utiliza el vector de pesos de una SVM lineal para la selección de características (genes): Véase Guyon axon.cs.byu.edu/Dan/778/papers/Feature%20Selection/guyon2.pdf

1 votos

@B_Miner ¡gracias! Me preocupaba que como se me ocurriera esto por mi cuenta pudiera estar mal (no soy de CS "puro") - pero supongo que es correcto.

1 votos

¿Qué significa la dirección del vector ortogonal si está separando ambas clases? ¿Tiene algo que ver con la contribución del hiperplano de separación a la probabilidad global de predicción de la clase?

27voto

Matryoshka Puntos 53

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 ])

SVM simple

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

12voto

On Freund Puntos 3479

El documentación es bastante completo: para el caso multiclase, SVC que se basa en la biblioteca libsvm utiliza la configuración uno-vs-uno. En el caso de un núcleo lineal, n_classes * (n_classes - 1) / 2 se ajustan modelos lineales binarios individuales para cada par de clases posibles. Por lo tanto, la forma agregada de todos los parámetros primarios concatenados es [n_classes * (n_classes - 1) / 2, n_features] (+ [n_classes * (n_classes - 1) / 2 intercepta en el intercept_ atributo).

Para el problema lineal binario, el trazado del hiperplano de separación del coef_ se hace en este ejemplo .

Si desea conocer los detalles del significado de los parámetros ajustados, especialmente para el caso del núcleo no lineal, eche un vistazo al formulación matemática y las referencias mencionadas en la documentación.

1 votos

En la documentación de Sklearn, el atributo coef_ es de forma = [n_clase-1, n_características]. Creo que es un error.

6voto

Michel Puntos 164

Comprueba esto documento sobre la selección de características . Los autores utilizan el cuadrado de los pesos (de los atributos) asignados por un kernel lineal SVM como métrica de clasificación para decidir la relevancia de un atributo particular. Esta es una de las formas más citadas de seleccionar genes a partir de datos de microarrays.

4voto

petra Puntos 131

Un gran artículo de Guyon y Elisseeff (2003). An introduction to variable and feature selection. Journal of machine learning research, 1157-1182 dice: "La construcción y selección de subconjuntos de características que son útiles para construir un buen predictor contrasta con el problema de encontrar o clasificar todas las variables potencialmente relevantes. La selección de las variables más relevantes suele ser subóptima para construir un predictor, especialmente si las variables son redundantes. A la inversa, un subconjunto de variables útiles puede excluir muchas variables redundantes, pero relevantes."

Por lo tanto, recomiendo tener cuidado al interpretar las ponderaciones de los modelos lineales en general (incluyendo la regresión logística, la regresión lineal y la SVM de núcleo lineal). Las ponderaciones de la SVM pueden compensar si los datos de entrada no se han normalizado. El peso de la SVM para una característica específica depende también de las otras características, especialmente si las características están correlacionadas. Para determinar la importancia de las características individuales, los métodos de clasificación de características son una mejor opción.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X