Multiclass SVM SKLearn 中返回了哪些支​​持向量

Which Support Vectors returned in Multiclass SVM SKLearn

默认情况下,SKLearn 在多类情况下训练 SVM 时使用 One vs One 分类方案。

我有点困惑,当您调用 svm.n_support_ 或 svm.support_vectors_ 等属性时,您得到了哪些支持向量?例如,在 iris 数据集的情况下,有 3 类,因此总共应该构建 3*(3-1)/2 = 3 个不同的 SVM 分类器。您要返回哪个分类器的支持向量?

所有 3 个分类器的所有支持向量。 看看svm.support_.shape是45。 19+19+7 = 45。全部加起来。

此外,如果您查看 svm.support_vectors_.shape,它将是 (45,4) - [n_SV, n_features]。再次有意义,因为我们在 iris 数据集中有 45 个支持向量和 4 个特征。

Update: dual_coef_ is the key, giving you the coefficients of the support vectors in the decision function. "Each of the support vectors is used in n_class - 1 classifiers. The n_class - 1 entries in each row correspond to the dual coefficients for these classifiers." .

Take a look at the very end of this section (1.4.1.1), the table clearly explains it http://scikit-learn.org/stable/modules/svm.html#multi-class-classification)

实现细节也让我很困惑。 multiclass决策函数中支持向量的系数为non-trivial.

但是,每当我想详细了解所选支持向量的特定属性时,我都会使用以下经验法则:

y[svm.support_]

输出:

array([0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

通过这种方式,您可以了解(可能用于调试目的)哪个支持向量对应于哪个 class。当然,您可以检查支持向量:

X[svm.support_]

我的直觉是,正如其名称所示,您获取相关类别样本的子集。假设我们有 3 个类别 A、B 和 C:

  • A vs. B --> 它为您提供了 A 和 B 的多个支持向量 (a,a,a,b,b,...)
  • A vs. C --> 相同...a,a,a,c,c,c,c(可能某些 'a' 与之前重复)
  • B 与 C --> 同上

所以 svm.support_vectors_ returns 所有支持向量 但是它在 decision_function 中的使用方式对我来说仍然很棘手,因为我我不确定在进行 A 对 C 时是否可以使用 A 对 B 的支持向量 - 我找不到实现细节 (http://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsOneClassifier.html#sklearn.multiclass.OneVsOneClassifier.decision_function)