scikit-learn - sklearn 中 dual_coef_ 的维度。 SVC

标签 scikit-learn svm

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

最佳答案

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

SVC 识别的支持向量每个都属于某个类。在对偶系数中,它们根据它们所属的类进行排序。
给定一个合适的 SVC 估计器,例如

from sklearn.svm import SVC
svc = SVC()
svc.fit(X, y)

你会找到
svc.classes_   # represents the unique classes
svc.n_support_ # represents the number of support vectors per class

支持向量根据这两个变量进行组织。每个支持向量都被清楚地标识为一个类,很明显它可以隐含在最多 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

为您提供 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

然后看看
svc.coef_

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

根据 doc 权重排序为:
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

关于scikit-learn - sklearn 中 dual_coef_ 的维度。 SVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22816646/

相关文章:

python - 如何在python中的sklearn中获取不同管道中的特征名称

android - OpenCV for Android - 使用 SURF 描述符训练 SVM

python - 快速核矩阵计算 python

matlab - 准备我的数据以在 SVM libsvm matlab 中进行训练

machine-learning - 异构特征空间上的SVM学习

python - 使用 SciLearn Kit 读取 Pandas 数据框时遇到问题

python - 核密度分数 VS score_samples python scikit

machine-learning - 首先做什么 : Feature Selection or Model Parameters Setting?

python - 类型错误 : unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'

opencv - 在opencv中使用SVM技术进行图像分类