如何在scikit SVC中打印功能的相应权重?

时间:2019-05-09 04:56:56

标签: python machine-learning scikit-learn svm

如在SVM中,它对应于每个特征f [i],权重w [i]作为系数。当所有特征都按比例缩放后,w [i]必须表示特征f [i]的重要性,因此我希望打印出此重要性顺序。因此,我编写了一个快速代码,并使用clf.coef_获得所有w [i]。但是结果有点奇怪,对于n_features = 2,clf.coef_输出10x2矩阵!

from sklearn import svm
from sklearn.datasets.samples_generator import make_blobs
from pandas import DataFrame
X,Y=make_blobs(n_samples=100, centers=5, n_features=2)

clf=svm.SVC(kernel='linear',probability=True)
clf.fit(X,Y)

print(clf.coef_)

此代码的输出是:-

[[-0.14808725 -0.30415025]
 [ 0.01612808  0.43529163]
 [-1.06694209 -0.27738544]
 [-0.13195668 -0.27799574]
 [ 0.03588147  0.13657989]
 [ 0.04273599  0.65849432]
 [ 0.68017938 -0.64049715]
 [-0.09071154 -0.22828399]
 [-0.01494555 -0.1300181 ]
 [ 0.10260101 -0.36918253]]

那么这个10x2矩阵代表什么,更重要的是我如何获得与每个特征权重相对应的所有w [i]值。

1 个答案:

答案 0 :(得分:0)

在线性SVM中,请注意,结果是一个超平面,该平面将类别尽可能地分开。权重表示此超平面,方法是为您提供与超平面正交的向量的坐标-这些是svm.coef _

给出的系数

10 * 2矩阵的原因 :(类数为5,特征数为2) (并且sklearn的文档清晰且有用)

SVC为多类分类实现“一对一”。如果n_class是类的数目,则构造n_class *(n_class-1)/ 2分类器,每个分类器训练来自两个类的数据。

SVM的coef_属性输出相同,并且数组为:[n_class *(n_class-1)/ 2,n_features]

如果您只需要5个分类器而不是10个,则可以:

  1. 在定义/调整clf时,请使用Decision_function_shape =“ ovr”。
  2. 或者您可以使用线性SVC(lin_clf = svm.LinearSVC())(默认情况下将使用ovr)