一对一还是一对一?

时间:2017-02-05 20:16:25

标签: machine-learning r-caret

我在R中使用CARET包进行多类分类。我有3个课程,我使用方法 train 进行培训。这是代码:

trained.model.rf <- train(x = dataset.train[,-c(ncol(dataset.train))], y = dataset.train[,ncol(dataset.train)],method='rf',
                        trControl=trainControl(method="cv",number=10), allowParallel=TRUE, tuneLength = 6)
model.rf <- trained.model.rf$finalModel
result.rf <- predict(model.rf, dataset.test, type="response")

对于 dataset.train ,我将三个类放在一起。 我如何判断这是一对一还是一对一的方式?

1 个答案:

答案 0 :(得分:1)

修改

经过第二次阅读后,我意识到你可能只是在问Caret在做什么,而不是你应该选择哪一个。可悲的是我无法回答这个问题,我必须补充说,Caret的文档非常糟糕(他们可以从scikit-learn中学到一些东西)!

如果没有具体原因,我会在你的情况下不会那么在意(少数类+随机森林;使用SVM或有很多课程虽然看看有什么用途会很有意思)

<强> /修改

使用良好工作的基础分类器reference在性能方面没有太大差异。

One-vs-All通常是我尝试的大多数库中的默认值。

但是在考虑基础分类器和数据集时可能存在权衡:

让我们调用 N 类的数量。您的数据集样本称为 M

One vs. All

  • 将在整个数据集上训练N个分类器
  • 后果:
    • 它正在进行线性大小的分类学习,可以很好地与课程数量进行比较
      • 这可能是它经常违约的原因,因为它也可以很好地使用100个或更多类
    • 它正在学习整个数据集,如果基础分类器的复杂性受样本大小限制,这可能是一个问题
      • 热门示例: SVM O(m^2)-O(m^3)之间是复杂的(取决于内核和内核缓存;忽略基于SGD的方法)
      • 因此,在庞大的数据集上学习SVM会很麻烦(与下面的OvO相比)

一对一

  • 将在某些部分数据集上训练N over 2个分类器
  • 后果
    • 它正在进行分类学习的指数大小(关于课程数量),这些课程的数量非常糟糕
    • 如果您的数据集是平衡的,那么它正在处理M/N*2个样本(仅使用两个选定对的样本)
      • 如果分类器复杂度由样本大小决定(如上所述),这可以比OvA更有帮助

在你的情况下,你有一小组课程。如果你的图书馆支持两种方法,我会首先使用OvO。但是,这就像解释一样,取决于你的分类器和类统计。

虽然上面提到的论文说OvA不应该比OvO差,但我可以想象如果你的设置不完美(分类器性能差,......)后者可以提供更多的安全性。