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.
@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
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.
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])
Resolviendo el problema SVM por inspección
X2= x1- 3wTx + b = 0
w = [ 1 , - 1 ] b = - 3
2El | El | w | El |22√= 2-√4 2-√
do
c x1- c x2- 3 c = 0
w = [ c , - c ] b = - 3 c
Conectando nuevamente a la ecuación para el ancho que obtenemos
2El | El | w | El |22-√doc = 14 4= 4 2-√= 4 2-√
w = [ 14 4, - 14 4] b = - 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.
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.
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.
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) / 2
se 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) / 2
intercepta en elintercept_
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.
fuente
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
Resolviendo el problema SVM por inspección
Conectando nuevamente a la ecuación para el ancho que obtenemos
Yo también, aquí hay un código para verificar nuestros cálculos manuales
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
fuente
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.
fuente
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.
fuente