OneVsRestClassifier与SVC以及decision_function_shape='ovr'的SVC有什么区别?

17
我原以为它们应该是相同的,但是对于方法decision_function(),我得到了不同的结果。并且只有decision_function_shape='ovr'的SVC速度确实更快。
相关链接:Scikit learn多类支持向量机分类

我在github仓库https://github.com/scikit-learn/scikit-learn/issues/10752和https://github.com/scikit-learn/scikit-learn/issues/5495中发现了这些问题,它们可能相关,但我仍然不太理解,并且没有为OP的问题提供明确的答案。 - PeterB
1
文档提供了一些关于OvO情况的见解,其中指出 sklearn.svm.SVC 支持 Multiclass as One-Vs-One,无需使用任何元估计器(即 OneVsOneClassifier)。然而,当我们想要使用元估计器并进行 OneVsRest 多类分类时,仍然不清楚应该如何将 SVCOneVsRestClassifier 结合使用。此外,在所有这些中,decision_function_shape: 'ovo'/'ovr' 的作用也不清楚。 - PeterB
1个回答

6
我对“查看也可以”标题下的LinearSVC文档中的SVC有些澄清。

SVC

使用libsvm实现支持向量机分类器:

....

....

此外,SVC使用一对一方案实现多类模式,而LinearSVC使用一对其余。 通过使用sklearn.multiclass.OneVsRestClassifier包装器,可以使用SVC实现一对其余。

....

此外,SVC将所有训练委托给底层的libsvm库,该库将多类情况处理为'OvO'(即使decision_function_shape='ovr')。

在@delusionX提到的问题中提到,decision_function_shape只是为了与scikit API兼容。很可能,所有其他估算器都将多类作为OvR处理,因此当SVC与其他内容结合使用时(例如在Pipeline、GridSearchCV或像OneVsRestClassifier这样的包装器中),返回OvO决策函数会破坏其他工作的效果。但我找不到任何明确写明的地方。
有趣的事实:OneVsOneClassifier也返回一个决策函数,它与OvR的形状相符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接