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

42

Estoy tratando de interpretar los pesos variables dados ajustando un SVM lineal.

(Estoy usando scikit-learn ):

from sklearn import svm

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

svm.fit(features, labels)
svm.coef_

No puedo encontrar 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?

Austin Richardson
fuente

Respuestas:

55

Para un kernel general es difícil interpretar los pesos SVM, sin embargo, para el SVM lineal, en realidad hay una interpretación útil:

1) Recuerde que en SVM lineal, el resultado es un hiperplano que separa las clases lo mejor posible. Los pesos representan este hiperplano, al darle 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 pronosticada, así que si tomas el producto de punto de cualquier punto con el vector, puedes decir de qué lado está: si el producto de punto es positivo, pertenece a la clase positiva, si es negativo pertenece a la clase negativa.

3) Finalmente, incluso puedes aprender algo sobre la importancia de cada característica. Esta es mi propia interpretación, así que convéncete primero. Digamos que svm encontraría solo una característica útil para separar los datos, luego el hiperplano sería ortogonal a ese eje. Por lo tanto, 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 solo se usa la primera coordenada para la separación, w tendrá la forma (x, 0) donde x es un número distinto de cero y luego | x |> 0.

Bitwise
fuente
3
El punto 3 es la base para el algoritmo RFE que usa el vector de peso de un SVM lineal para la selección de características (genes): consulte Guyon axon.cs.byu.edu/Dan/778/papers/Feature%20Selection/guyon2.pdf
B_Miner
1
@B_Miner gracias! Me preocupaba que, dado que pensaba en esto por mi cuenta, podría estar mal (no soy de CS "puro"), pero supongo que es correcto.
Bitwise
1
¿Cuál es el significado de 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 general de predicción de clase?
Austin Richardson
Para explicar si el signo del peso se relaciona con la clase (en el caso lineal), depende de las características. Por ejemplo, si las características predictivas toman solo valores no negativos ( ), los pesos negativos contribuyen a una clasificación negativa de los puntos de datos. 0 0
Kdawg
@B_Miner, creo que querías vincular este documento en lugar del otro de Guyon.
ijoseph
11

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

Para el problema lineal binario, coef_en este ejemplo se traza el hiperplano de separación del atributo .

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

ogrisel
fuente
1
En la documentación de Sklearn, el atributo coef_ es de forma = [n_class-1, n_features]. Creo que es un error.
Naomi
6

Estoy tratando de interpretar los pesos variables dados ajustando un SVM lineal.

Una buena manera de entender cómo se calculan los pesos y cómo interpretarlos en el caso de SVM lineal es realizar los cálculos a mano en un ejemplo muy simple.

Ejemplo

Considere 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

Resolviendo el problema SVM por inspección

X2=X1-3wTX+si=0 0

w=[1,-1]  si=-3

2El |El |wEl |El |22=24 42

do

doX1-doX2-3do=0 0
w=[do,-do]  si=-3do

Conectando nuevamente a la ecuación para el ancho que obtenemos

2El |El |wEl |El |=4 4222do=4 42do=14 4

w=[14 4,-14 4]  si=-34 4


(Estoy usando scikit-learn)

Yo también, aquí hay un código para verificar 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 vectores de soporte = [2 3]
  • Vectores de soporte = [[2. 3.] [6. -1.]]
  • Número de vectores de soporte para cada clase = [1 1]
  • Coeficientes del vector de 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

Xavier Bourret Sicotte
fuente
5

Consulte este documento sobre la selección de funciones . Los autores usan el cuadrado de los pesos (de los atributos) según lo asignado por un núcleo lineal SVM como métrica de clasificación para decidir la relevancia de un atributo particular. Esta es una de las formas muy citadas de seleccionar genes a partir de datos de microarrays.

abhinna11
fuente
3

Un gran artículo de Guyon y Elisseeff (2003). Una introducción a la selección de variables y características. 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. Seleccionar las variables más relevantes generalmente es subóptimo para construir un predictor, particularmente si las variables son redundantes. Por el contrario, un subconjunto de variables útiles puede excluir muchas variables redundantes, pero relevantes ".

Por lo tanto, se recomienda precaución al interpretar los pesos de los modelos lineales en general (incluida la regresión logística, la regresión lineal y el kernel lineal SVM). Los pesos SVM podrían compensar si los datos de entrada no se normalizaron. El peso 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.

petra
fuente