在多类分类中,默认情况下,scikit-learn是否使用One-Vs-Rest?

rus*_*ano 3 python machine-learning scikit-learn multiclass-classification

我正在处理一个多类问题(4个类),并且试图通过python中的scikit-learn解决它。

我看到我有三个选择:

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

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

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

    classifier = OneVsOneClassifier(svm.LinearSVC(random_state=123))
    classifier.fit(Xtrain, ytrain)
    classifier.score(Xtest, ytest)
    
    Run Code Online (Sandbox Code Playgroud)

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

对此事项的任何澄清将不胜感激。

最好,先生

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

den*_*ger 5

更新的答案:正如评论和编辑所阐明的那样,问题更多地是关于sklearn的常规设置,而不是关于sklearn的具体情况。LinearSVC解释下文。

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

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

另一方面,类似SVCLinearSVC仅支持二进制分类的算法。因此,为了扩展这些类别的(性能良好的)算法,我们不得不从最初的多类分类任务开始,依靠归纳到二进制分类任务。

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

初步答案

通过查看相关的scikit-learn文档,可以很容易地回答这个问题。
通常,对Stackoverflow的期望是您至少自己进行了某种形式的研究,因此请考虑首先查看现有文档。

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

如果y包含两个以上类别,则确定多类别策略。"ovr"训练n_class相对于rest的分类器,同时 "crammer_singer"优化所有类的联合目标。尽管从理论上讲crammer_singer很有趣,因为它是一致的,但实际上很少使用它,因为它很少导致更好的准确性,并且计算成本更高。如果"crammer_singer"选择,则将忽略损失,惩罚和双重选择权。

因此,很明显,它使用了一对多。

对于“常规” SVC也是一样

  • 让我感谢你的快速回复,但让我也告诉你我不喜欢这种态度。我之前做过研究,但找不到相关信息。事实上,虽然我在示例中使用了 svm,但我使用的是 RandomForest,但我没有看到 RF 的参数。那答案是什么? (3认同)