【问题标题】:Does scikit-learn use One-Vs-Rest by default in multi-class classification?scikit-learn 在多类分类中是否默认使用 One-Vs-Rest?
【发布时间】:2019-02-02 23:03:10
【问题描述】:

我正在处理一个多类问题(4 个类),我正在尝试使用 Python 中的 scikit-learn 来解决它。

我看到我有三个选择:

  1. 我只是实例化一个分类器,然后我适合训练并通过测试评估;

    classifier = sv.LinearSVC(random_state=123)
    classifier.fit(Xtrain, ytrain)
    classifier.score(Xtest, ytest)
    
  2. 我将实例化的分类器“封装”在 OneVsRest 对象中,生成一个用于训练和测试的新分类器;

    classifier = OneVsRestClassifier(svm.LinearSVC(random_state=123))
    classifier.fit(Xtrain, ytrain)
    classifier.score(Xtest, ytest)
    
  3. 我将实例化的分类器“封装”在 OneVsOne 对象中,生成一个用于训练和测试的新分类器。

    classifier = OneVsOneClassifier(svm.LinearSVC(random_state=123))
    classifier.fit(Xtrain, ytrain)
    classifier.score(Xtest, ytest)
    

我了解 OneVsRest 和 OneVsOne 之间的区别,但我无法理解在第一种情况下我在做什么,我没有明确选择这两个选项中的任何一个。在这种情况下 scikit-learn 会做什么?它是否隐式使用 OneVsRest?

任何关于此事的澄清将不胜感激。

最好, 先生

编辑: 为了清楚起见,我对 SVM 的情况并不特别感兴趣。例如,RandomForest 呢?

【问题讨论】:

  • 格式化您的代码
  • 你是对的。我做了很多次,不知何故代码格式化不起作用,所以我最终放弃了。
  • 在 scikit-learn 文档中有基本解释:Multiclass and multilabel algorithms

标签: python machine-learning scikit-learn multiclass-classification


【解决方案1】:

更新答案:正如 cmets 和编辑中所阐明的那样,问题更多是关于 sklearn 的一般设置,而不是关于 LinearSVC 的具体情况,下文将对此进行解释。

这里的主要区别在于,您可以使用的一些分类器具有“内置的多类分类支持”,即该算法可以区分两个以上的类默认情况下。例如,随机森林或具有多个输出节点的多层感知器 (MLP) 就是一个示例。

在这些情况下,根本不需要 OneVs 对象,因为您已经在解决您的任务。事实上,使用这样的策略甚至可能会降低您的性能,因为您通过让算法仅在单个二进制实例之间做出决定来“隐藏”算法的潜在相关性。

另一方面,像SVCLinearSVC 这样的算法只支持二进制分类。因此,为了扩展这些(性能良好的)算法类别,我们不得不依赖从最初的多类分类任务简化为二元分类任务。

据我所知,最完整的概述可以找到here: 如果向下滚动一点,您可以看到其中一种算法本质上是多类的,或者默认使用其中一种策略。
请注意,OVO 下列出的所有算法现在实际上都默认采用了 OVR 策略!在这方面这似乎有点过时了。

初步回答

这是一个可以通过查看the relevant scikit-learn documentation 轻松回答的问题。
通常,对 Stackoverflow 的期望是您至少自己完成了某种形式的研究,因此请考虑先查看现有文档。

multi_class:字符串、'ovr' 或'crammer_singer'(默认='ovr')

如果 y 包含两个以上的类,则确定多类策略。 "ovr" 训练 n_classes one-vs-rest 分类器,而 "crammer_singer" 优化所有类的联合目标。尽管 从理论的角度来看,crammer_singer 很有趣 一致,它很少在实践中使用,因为它很少导致更好的 准确性,并且计算成本更高。如果"crammer_singer" 是 选择,选项损失,惩罚和对偶将被忽略。

所以,很明显,它使用一对一休息。

顺便说一句,“常规”SVC 也是如此。

【讨论】:

  • 感谢您的快速回复,但我也告诉您我不喜欢这种态度。我做了之前的研究,我找不到信息。事实上,虽然我在示例中使用了 svm,但我使用的是 RandomForest,但我没有看到 RF 的那个参数。那么答案是什么呢?
  • @rusiano 就您最初的问题而言,答案是正确的。 在提供答案后更改问题远非良好做法;如果您仍有问题,请接受答案并提出不同的问题。
  • 我从未说过我有兴趣明确了解 SVM。问题仍然存在,只是您的回答不完整。
  • @rusiano 1) “但我无法理解我在第一个场景中在做什么 [...] 在这种情况下 scikit-learn 会做什么?” - 您的第一个场景明确涉及 SVM 2) 请尝试以 富有成效 的方式进行辩论(我们都会犯错误,重点是不要毫无意义地为它们辩护),并记住这里的人是 自愿试图帮助 3) 将我视为第三方观察员(答案是不是我的)...
  • 在这里插话:我也理解了 SVM 案例,所以感谢您澄清这一点。我目前正在研究如何在这个(更一般的)上下文中最好地解释 OVO/OVR 的概念,所以我希望稍后会更新答案。我对搜索的严厉回应是,在我看来,它实际上只是在寻找 SVM。在更一般的情况下,我认为这是一个更准确和相关的问题。
猜你喜欢
  • 2017-02-27
  • 2014-06-14
  • 2012-05-18
  • 2012-11-11
  • 2016-10-17
  • 2016-03-02
  • 2016-05-25
  • 1970-01-01
相关资源
最近更新 更多