python - 如何在scikit SVC中打印相应的特征权重?

标签 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] 值。

最佳答案

在线性 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)

关于python - 如何在scikit SVC中打印相应的特征权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56052431/

相关文章:

python - opencv中的while循环导致错误

machine-learning - 如何计算 BCubed 精度和召回率

machine-learning - 句子相似度算法的探讨

python - scikit-learn 与 make_scorer 的斗争

python-3.x - 为什么单层 MLP 在数字分类器中优于多层?

python - 我如何使用 python 检测到有东西插入了 linux 上的音频插孔?

python - 用python计算平均值

java - 如何从Python程序创建的文件中读取java程序中的RDD

python - CNN模型预测

python - 将分类器投入生产