带有 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 多类分类时,如何将SVC
与OneVsRestClassifier
结合使用仍然不清楚。也不清楚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