多对多还是一对多?

我在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$finalModelresult.rf <- predict(model.rf, dataset.test, type="response")

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


回答:

编辑:

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

如果没有特别的原因,在你的情况下(类别数量少+随机森林),我不会太在意(不过,如果使用SVM或有许多类别,了解使用的是什么方法会很有趣)。

/编辑

在性能方面,如果底层分类器工作良好,多对多和一对多之间没有太大区别 参考

一对多通常是大多数库的默认设置。

但在考虑底层分类器和数据集时,可能存在一种权衡:

我们将类别的数量称为N。数据集的样本数量称为M

一对多

  • 将在整个数据集上训练N个分类器
  • 后果:
    • 它进行线性大小的分类学习,随着类别数量的增加,扩展性良好
      • 这可能是它经常被设为默认的原因,因为它在100个或更多类别时也能很好地工作
    • 它在整个数据集上学习,如果底层分类器的复杂度受样本量限制,这可能是一个问题
      • 流行示例:SVM的复杂度在O(m^2)-O(m^3)之间(取决于核函数和核缓存;忽略基于SGD的方法)
      • 因此,SVM在处理大型数据集时可能有麻烦(与OvO相比)

多对多

  • 将在部分数据集上训练N over 2个分类器
  • 后果
    • 它进行指数大小的分类学习(关于类别数量),随着类别数量的增加,扩展性非常差
    • 如果你的数据集是平衡的,它处理M/N*2个样本(仅使用选定对的样本)
      • 如果分类器的复杂度主要由样本量决定(如上所述),这可能会比OvA有帮助

在你的情况下,类别数量较少。如果你的库支持两种方法,我会先使用OvO。但正如解释的那样,这取决于你的分类器和类别统计数据。

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

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注