我在使用线性内核的sklearn.svm.SVC,我想得到特征的重要性,所以我使用了属性coeff_(如这里的解释)。https:/scikit-learn.orgstablemodulesgeneratedsklearn.svm.SVC.html。)是一个形状为[n_class * (n_class-1) 2, n_features]的数组,比如我的情况,我有10个类和54个特征,所以形状为[45,54]。
为什么我得到45个权重数组? 这些数组中的每一个数组有什么意义?因为从直觉上讲,我希望有10个权重数组,每个类有一个。
形状是 果然 [n_class * (n_class-1) / 2, n_features]
但为什么呢?
这是因为如果你有 两班以上 即如果你有一个问题是 不 二进制 那么 多类支持的函数是按照一个对一个的方案来处理的。
例如:如果你有3个类,比如说 1,2,3
则将对这些情况进行拟合。1vs2
, 1vs3
和 2vs3
. 所以在这里,我们有 n_class * (n_class-1) / 2 = 3 * (3-1) / 2 = 3
.
我们来验证一下上面的内容。
import numpy as np
from sklearn.svm import SVC
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 3]) # 3 classes
clf = SVC(kernel='linear')
clf.fit(X, y)
print(clf.coef_)
[[-0.5 -0.5 ]
[-0.46153846 -0.30769231]
[-1. 0. ]]
这里,在 clf.coef_
,每一行对应上述情况 1vs2
, 1vs3
和 2vs3
,分别是。所以,第一行即 [-0.5, -0.5]
给出了第一、二个特征变量的系数,对于这种情况下的 1vs2
分类拟合。
P.S:如果是二元分类,则是 print(clf.coef_)
将只返回一行 1vs2
分类情况。
关于行的顺序。
在 "一对一 "SVC的情况下,属性的布局会更复杂一些。在有线性内核的情况下,属性coef_和intercept_的形状分别是[n_class * (n_class - 1) 2,n_features]和[n_class * (n_class - 1) 2]。 这与上面描述的LinearSVC的布局类似,现在每一行对应一个二进制分类器。类0到n的顺序是 "0 vs 1","0 vs 2",...... "0 vs n","1 vs 2","1 vs 3","1 vs n",......。"n-1与n"。
段落见于:...... "0与n"、"1与2"、"1与3"、"1与n"、...... "n-1与n"。https:/scikit-learn.orgstablemodulessvm.html。