我正在处理一个多类问题(4个类(,我正在尝试用Python中的scikit-learn来解决它。
我看到我有三个选择:
我只是实例化一个分类器,然后我用训练拟合并通过测试进行评估;
classifier = sv.LinearSVC(random_state=123) classifier.fit(Xtrain, ytrain) classifier.score(Xtest, ytest)
我将实例化的分类器"封装"在 OneVsRest 对象中,生成一个用于训练和测试的新分类器;
classifier = OneVsRestClassifier(svm.LinearSVC(random_state=123)) classifier.fit(Xtrain, ytrain) classifier.score(Xtest, ytest)
我将实例化的分类器"封装"在 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
对象,因为您已经在解决任务。事实上,使用这样的策略甚至可能会降低你的表现,因为你通过让它只在单个二进制实例之间做出决定,从算法中"隐藏"潜在的相关性。
另一方面,SVC
或LinearSVC
等算法仅支持二元分类。因此,为了扩展这些类(性能良好(算法,我们必须依靠从最初的多类分类任务简化为二元分类任务。
据我所知,最完整的概述可以在这里找到: 如果向下滚动一点,您可以看到哪一种算法本质上是多类的,或者默认情况下使用其中一种策略。
请注意,OVO 下列出的所有算法现在实际上默认采用 OVR 策略!在这方面,这似乎是略显过时的信息。
初始答案:
这是一个可以通过查看相关的scikit-learn文档轻松回答的问题。
一般来说,对 Stackoverflow 的期望是你至少自己做了某种形式的研究,所以请考虑先查看现有的文档。
multi_class:字符串,"ovr"或"crammer_singer"(默认值="ovr"(
如果 y 包含两个以上的类,则确定多类策略。
"ovr"
训练n_classes一对余分类器,而"crammer_singer"
优化了所有类的联合目标。而 从理论角度来看,crammer_singer很有趣 一致,在实践中很少使用,因为它很少导致更好的 准确性,计算成本更高。如果"crammer_singer"
是 选择后,期权损失、罚金和双重将被忽略。
所以,很明显,它使用一对一的休息。
顺便说一下,"常规"SVC 也是如此。