sklearn中dual_coef_的维度.SVC

Chu*_*Nan 3 svm scikit-learn

SVC()多分类中,训练一对一分类器.所以n_class * (n_class - 1)/2总共应该有分类器.但为什么clf.dual_coef_只回归我(n_class - 1) * n_SV?那么每一行代表什么?

eic*_*erg 8

sklearn.svm.SVC在多类设置中的双重系数很难解释.scikit-learn文档中有一个解释.sklearn.svm.SVC使用libsvm进行计算,并对双系数采用相同的数据结构.关于这些系数组织的另一种解释是在FAQ中.对于在拟合的SVC分类器中找到的系数,解释如下:

由SVC识别的支持向量各自属于某一类.在双系数中,它们根据它们所属的类来排序.给出一个拟合的SVC估计器,例如

from sklearn.svm import SVC
svc = SVC()
svc.fit(X, y)
Run Code Online (Sandbox Code Playgroud)

你会找到

svc.classes_   # represents the unique classes
svc.n_support_ # represents the number of support vectors per class
Run Code Online (Sandbox Code Playgroud)

根据这两个变量组织支持向量.每个支持向量都用一个类清楚地标识,很明显它可以隐含在最多n_classes-1一对一问题中,即与所有其他类进行每次比较.但完全有可能在一对一的问题中不会暗示给定的支持向量.

看看

support_indices = np.cumsum(svc.n_support_)
svc.dual_coef_[0:support_indices[0]]  # < ---
                                      # weights on support vectors of class 0
                                      # for problems 0v1, 0v2, ..., 0v(n-1)
                                      # so n-1 columns for each of the 
                                      # svc.n_support_[0] support vectors
svc.dual_coef_[support_indices[1]:support_indices[2]]  
                                      #  ^^^
                                      # weights on support vectors of class 1
                                      # for problems 0v1, 1v2, ..., 1v(n-1)
                                      # so n-1 columns for each of the 
                                      # svc.n_support_[1] support vectors
...
svc.dual_coef_[support_indices[n_classes - 2]:support_indices[n_classes - 1]]
                                      #  ^^^
                                      # weights on support vectors of class n-1
                                      # for problems 0vs(n-1), 1vs(n-1), ..., (n-2)v(n-1)
                                      # so n-1 columns for each of the 
                                      # svc.n_support_[-1] support vectors
Run Code Online (Sandbox Code Playgroud)

给出了各自的一对一问题中0,1,...,n-1类的支持向量的权重.比较除了它自己之外的所有其他类,产生n_classes - 1列.发生这种情况的顺序遵循上面公开的唯一类的顺序.每组中的行数与支持向量一样多.

可能你正在寻找的是生活在特征空间中的原始权重,以便检查它们对于分类的"重要性".这只能通过线性内核实现.试试这个

from sklearn.svm import SVC
svc = SVC(kernel="linear")
svc.fit(X, y)  # X is your data, y your labels
Run Code Online (Sandbox Code Playgroud)

然后看看

svc.coef_
Run Code Online (Sandbox Code Playgroud)

这是一个形状数组((n_class*(n_class -1)/ 2),n_features)并表示上述权重.

根据文件,权重的排序如下:

class 0 vs class 1
class 0 vs class 2
...
class 0 vs class n-1
class 1 vs class 2
class 1 vs class 3
...
...
class n-2 vs class n-1
Run Code Online (Sandbox Code Playgroud)