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)
默认情况下,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)