带有 SVC 的 OneVsRestClassifier 和带有 decision_function_shape='ovr' 的 SVC 有啥区别?

Posted

技术标签:

【中文标题】带有 SVC 的 OneVsRestClassifier 和带有 decision_function_shape=\'ovr\' 的 SVC 有啥区别?【英文标题】:What is the difference between OneVsRestClassifier with SVC and SVC with decision_function_shape='ovr'?带有 SVC 的 OneVsRestClassifier 和带有 decision_function_shape='ovr' 的 SVC 有什么区别? 【发布时间】:2017-01-28 23:46:35 【问题描述】:

我认为它应该是相同的,但是对于方法 decision_function() 我得到不同的结果。而且只有decision_function_shape='ovr' 的 SVC 确实更快。

相关:Scikit learn multi-class classification for support vector machines

【问题讨论】:

我在 github repo github.com/scikit-learn/scikit-learn/issues/10752 和 github.com/scikit-learn/scikit-learn/issues/5495 上发现了这些问题,它们可能是相关的,但我仍然不太明白,也没有为 OP 的问题提供明确的答案。 Documentation 为 OvO 案例提供了一些见解,其中说 sklearn.svm.SVC 支持 Multiclass as One-Vs-One 而无需使用任何元估计器(即OneVsOneClassifier)。然而,当我们确实想要使用元估计器并且例如进行 OneVsRest 多类分类时,如何将SVCOneVsRestClassifier 结合使用仍然不清楚。也不清楚decision_function_shape : ‘ovo’ / ‘ovr’在这一切中扮演什么角色。 【参考方案1】:

我对“另请参阅”标题中的 documentation of LinearSVC 进行了一些澄清,其中提到了 SVC。

SVC

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

....

....

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

....

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

问题中提到@delusionX 提到decision_function_shape 只是为了与scikit API 兼容。最有可能的是,所有其他估计器将多类作为 OvR 处理,因此当 SVC 与其他事物结合使用时,(例如在管道、GridSearchCV 或 OneVsRestClassifier 等包装器中)返回 OvO 决策函数会破坏工作别人的。但我在任何地方都找不到明确写的。

有趣的事实:OneVsOneClassifier 还返回一个与 OvR 形状确认的决策函数。

【讨论】:

以上是关于带有 SVC 的 OneVsRestClassifier 和带有 decision_function_shape='ovr' 的 SVC 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 SVC 估计器的 OneVsRestClassifier 的 GridSearchCV?

iis urlrewrite HTTPS,除了服务(.asmx 和 .svc)或带有参数/值的特定服务

将带有 rbf 内核的 sklearn SVC 移植到 java

带有 rbf 内核的 SVC 的 10 大功能

sklearn.SVC 在使用带有小型平衡数据集的 GridSearchCV 时返回完全不同的预测(模型)

SVC 分类器花费太多时间进行训练