我试图解释通过拟合线性 SVM 给出的可变权重。
(我正在使用scikit-learn):
from sklearn import svm
svm = svm.SVC(kernel='linear')
svm.fit(features, labels)
svm.coef_
我在文档中找不到任何具体说明如何计算或解释这些权重的内容。
体重的符号和等级有关系吗?
我试图解释通过拟合线性 SVM 给出的可变权重。
(我正在使用scikit-learn):
from sklearn import svm
svm = svm.SVC(kernel='linear')
svm.fit(features, labels)
svm.coef_
我在文档中找不到任何具体说明如何计算或解释这些权重的内容。
体重的符号和等级有关系吗?
对于一般内核,很难解释 SVM 权重,但是对于线性 SVM,实际上有一个有用的解释:
1) 回想一下,在线性 SVM 中,结果是一个尽可能最好地分离类的超平面。权重代表这个超平面,通过给你一个与超平面正交的向量的坐标——这些是 svm.coef_ 给出的系数。我们称这个向量为 w。
2)我们可以用这个向量做什么?它的方向给了我们预测的类,所以如果你用向量取任意点的点积,你可以知道它在哪一边:如果点积是正的,它属于正类,如果是负的,它属于负类。
3)最后,您甚至可以了解每个功能的重要性。这是我自己的解释,所以先说服自己。假设 svm 只会找到一个对分离数据有用的特征,那么超平面将与该轴正交。因此,您可以说系数相对于其他系数的绝对大小表明了该特征对于分离的重要性。例如,如果仅使用第一个坐标进行分隔,则 w 的形式为 (x,0),其中 x 是某个非零数,然后 |x|>0。
我试图解释通过拟合线性 SVM 给出的可变权重。
了解如何计算权重以及如何在线性 SVM 的情况下解释权重的一个好方法是在一个非常简单的示例中手动执行计算。
考虑以下线性可分的数据集
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 的权重与该决策线的方程(更高维度的超平面)成比例,使用参数的第一个猜测是
SVM 理论告诉我们,边距的“宽度”由下式给出. 使用上面的猜测,我们将获得宽度. 其中,通过检查是不正确的。宽度是
回想一下,将边界缩放一个因子不改变边界线,因此我们可以将方程推广为
回到我们得到的宽度的方程
Hence the parameters (or coefficients) are in fact
(I'm using scikit-learn)
So am I, here's some code to check our manual calculations
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]
- Indices of support vectors = [2 3]
- Support vectors = [[ 2. 3.] [ 6. -1.]]
- Number of support vectors for each class = [1 1]
- Coefficients of the support vector in the decision function = [[0.0625 0.0625]]
Does the sign of the weight have anything to do with class?
Not really, the sign of the weights has to do with the equation of the boundary plane.
The documentation is pretty complete: for the multiclass case, SVC which is based on the libsvm library uses the one-vs-one setting. In the case of a linear kernel, n_classes * (n_classes - 1) / 2
individual linear binary models are fitted for each possible class pair. Hence the aggregate shape of all the primal parameters concatenated together is [n_classes * (n_classes - 1) / 2, n_features]
(+ [n_classes * (n_classes - 1) / 2
intercepts in the intercept_
attribute).
For the binary linear problem, plotting the separating hyperplane from the coef_
attribute is done in this example.
If you want the details on the meaning of the fitted parameters, especially for the non linear kernel case have a look at the mathematical formulation and the references mentioned in the documentation.
Check this paper on feature selection. The authors use square of weights (of attributes) as assigned by a linear kernel SVM as ranking metric for deciding the relevance of a particular attribute. This is one of the highly cited ways of selecting genes from microarray data.