scikit-learn在多类分类中默认使用One-Vs-Rest吗?



我正在处理一个多类问题(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?

如能就此事作出任何澄清,将不胜感激。

最好 先生

编辑: 只是为了澄清一点,我对支持向量机的情况并不特别感兴趣。例如,RandomForest呢?

更新的答案:正如评论和编辑中所澄清的那样,问题更多地是关于 sklearn 的一般设置,而不是关于下面解释的LinearSVC具体情况。

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

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

另一方面,SVCLinearSVC等算法仅支持二元分类。因此,为了扩展这些类(性能良好(算法,我们必须依靠从最初的多类分类任务简化为二元分类任务。

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

初始答案

这是一个可以通过查看相关的scikit-learn文档轻松回答的问题。
一般来说,对 Stackoverflow 的期望是你至少自己做了某种形式的研究,所以请考虑先查看现有的文档。

multi_class:字符串,"ovr"或"crammer_singer"(默认值="ovr"(

如果 y 包含两个以上的类,则确定多类策略。"ovr"训练n_classes一对余分类器,而"crammer_singer"优化了所有类的联合目标。而 从理论角度来看,crammer_singer很有趣 一致,在实践中很少使用,因为它很少导致更好的 准确性,计算成本更高。如果"crammer_singer"是 选择后,期权损失、罚金和双重将被忽略。

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

顺便说一下,"常规"SVC 也是如此。

相关内容

  • 没有找到相关文章

最新更新