一对一还是一对一?
One-versus-one or one-versus-all?
我在 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我三个类在一起。
我如何判断这是一对一还是一对一的方法?
编辑:
第二次阅读后,我意识到您可能只是在问 Caret 在做什么,而不是您应该选择哪个。遗憾的是我无法回答这个问题,我必须补充说 Caret 的文档很糟糕(他们可以从 scikit-learn 那里学到一些东西)!
如果没有具体原因,我不会太在意你的情况(少量 类 + random-forest;使用 SVM 或有很多 类 虽然它会看看用了什么很有趣)
/编辑
well-working 基础分类器 reference 在性能方面没有太大差异 reference。
One-vs-All 通常是我尝试过的大多数库中的默认值。
但是在考虑底层分类器和data-sets时有可能trade-off:
我们称类N的号码。你的data-set样本叫做M.
一对一
- 整体会训练N个分类器data-set
- 后果:
- 它正在做 classification-learnings 的 linear-size,它与 类 的数量成比例
- 这可能是它经常被默认的原因,因为它也是 well-working 100 类 或更多
- 它在整体上学习 data-set,如果基础分类器 complexity-wise 受 sample-size 限制,这可能是个问题
- 通俗例子:SVMs are complexity-wise between
O(m^2)-O(m^3)
in (depending kernel & kernel-cache; ignoring SGD-based方法)
- SVM 因此很难在巨大的 data-sets 上学习(与下面的 OvO 比较)
一对一
- 将在部分 data-set
上训练 N over 2
个分类器
- 后果:
- 它正在做 classification-learning 的 exponential-size(关于 类 的数量),这与 类
的数量相比非常糟糕
- 如果您的 data-set 是平衡的,它正在处理
M/N*2
个样本(仅使用两个选定对的样本)
- 如果 classifier-complexity 由 sample-size 主导(如上所述)
,则与 OvA 相比,这会有所帮助
在你的情况下,你有一小部分 类。如果您的图书馆支持这两种方法,我会首先使用 OvO。但正如所解释的那样,这取决于您的分类器和 class-statistics.
虽然上面引用的论文说 OvA 不应该比 OvO 差,但我可以想象如果您的设置有点不完美(分类器性能不佳,......)后者可以提供更多安全性。
我在 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我三个类在一起。 我如何判断这是一对一还是一对一的方法?
编辑:
第二次阅读后,我意识到您可能只是在问 Caret 在做什么,而不是您应该选择哪个。遗憾的是我无法回答这个问题,我必须补充说 Caret 的文档很糟糕(他们可以从 scikit-learn 那里学到一些东西)!
如果没有具体原因,我不会太在意你的情况(少量 类 + random-forest;使用 SVM 或有很多 类 虽然它会看看用了什么很有趣)
/编辑
well-working 基础分类器 reference 在性能方面没有太大差异 reference。
One-vs-All 通常是我尝试过的大多数库中的默认值。
但是在考虑底层分类器和data-sets时有可能trade-off:
我们称类N的号码。你的data-set样本叫做M.
一对一
- 整体会训练N个分类器data-set
- 后果:
- 它正在做 classification-learnings 的 linear-size,它与 类 的数量成比例
- 这可能是它经常被默认的原因,因为它也是 well-working 100 类 或更多
- 它在整体上学习 data-set,如果基础分类器 complexity-wise 受 sample-size 限制,这可能是个问题
- 通俗例子:SVMs are complexity-wise between
O(m^2)-O(m^3)
in (depending kernel & kernel-cache; ignoring SGD-based方法) - SVM 因此很难在巨大的 data-sets 上学习(与下面的 OvO 比较)
- 通俗例子:SVMs are complexity-wise between
- 它正在做 classification-learnings 的 linear-size,它与 类 的数量成比例
一对一
- 将在部分 data-set 上训练
- 后果:
- 它正在做 classification-learning 的 exponential-size(关于 类 的数量),这与 类 的数量相比非常糟糕
- 如果您的 data-set 是平衡的,它正在处理
M/N*2
个样本(仅使用两个选定对的样本)- 如果 classifier-complexity 由 sample-size 主导(如上所述) ,则与 OvA 相比,这会有所帮助
N over 2
个分类器
在你的情况下,你有一小部分 类。如果您的图书馆支持这两种方法,我会首先使用 OvO。但正如所解释的那样,这取决于您的分类器和 class-statistics.
虽然上面引用的论文说 OvA 不应该比 OvO 差,但我可以想象如果您的设置有点不完美(分类器性能不佳,......)后者可以提供更多安全性。