如何在 scikit SVC 中打印相应的特征权重?
How to print corresponding weights of features in scikit SVC?
和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 中,请注意结果是一个超平面,它尽可能地分离 classes。权重代表这个超平面,通过给你一个与超平面正交的向量的坐标——这些是 svm.coef_
给出的系数
10*2 矩阵的原因:(你的 classes 数是 5,特征数是 2)
(sklearn 的文档清晰且有用)
SVC 为多 class class 化实现了“one-against-one”。如果 n_class 是 classes 的数量,那么 n_class * (n_class - 1) / 2 classifiers 被构建并且每个训练来自两个的数据classes。
SVM 的 coef_ 属性输出相同,数组为:[n_class * (n_class-1) / 2, n_features]
如果您只想拥有 5 个 class 转化器而不是 10 个,您可以:
- 使用 decision_function_shape = "ovr" 而你 define/fit 你的 clf.
- 或者您可以使用线性 SVC (lin_clf = svm.LinearSVC())(这将默认使用 ovr)
和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 中,请注意结果是一个超平面,它尽可能地分离 classes。权重代表这个超平面,通过给你一个与超平面正交的向量的坐标——这些是 svm.coef_
给出的系数10*2 矩阵的原因:(你的 classes 数是 5,特征数是 2) (sklearn 的文档清晰且有用)
SVC 为多 class class 化实现了“one-against-one”。如果 n_class 是 classes 的数量,那么 n_class * (n_class - 1) / 2 classifiers 被构建并且每个训练来自两个的数据classes。
SVM 的 coef_ 属性输出相同,数组为:[n_class * (n_class-1) / 2, n_features]
如果您只想拥有 5 个 class 转化器而不是 10 个,您可以:
- 使用 decision_function_shape = "ovr" 而你 define/fit 你的 clf.
- 或者您可以使用线性 SVC (lin_clf = svm.LinearSVC())(这将默认使用 ovr)