如何在R中使用e1071包的'svm'进行多类分类。

11
我想使用e1071包的svm函数进行多类分类。但从svm文档中了解到,它只能执行二元分类。《vignettes》文档对于多类分类是这样描述的:“为了允许多类分类,libsvm使用一对一技术,通过拟合所有二元子分类器并通过投票机制找到正确的类别。” 我仍然不明白在R中是否可以使用e1071svm进行多类分类? 如果可以,请说明如何在iris数据集上执行它。

1
help("svm") 中的第一个示例恰好可以满足您的需求。 - fabians
@fabians 是的,你对这个例子的理解是正确的,我之前也看过。那么,这是否意味着 e1071svm 可以执行多类分类而不仅限于二元分类?这个函数在具有 10 个输出类的数据集上是否与 iris 具有 3 个输出类的数据集相同? - StrikeR
在另一个线程中回答了类似的问题。以下是链接: https://dev59.com/nZLea4cB1Zd3GeqPyid9#37697836 - S Pavan Kumar
2个回答

22

鸢尾花数据集包含三个类别标签:"Iris setosa"、"Iris virginica"和"Iris versicolor"。为了使用平衡的one-against-one分类策略进行svm分类,您可以训练三个二元分类器:

第一个分类器的训练集仅包含"Iris setosa"和"Iris virginica"实例。第二个分类器的训练集仅包含"Iris setosa"和"Iris versicolor"实例。第三个分类器的训练集--我猜到现在你已经知道了--仅包含"Iris virginica"和"Iris versicolor"实例。

要对未知实例进行分类,应用这三个分类器。然后,一个简单的投票策略就可以选择最常见的类别标签,更复杂的方法也可以考虑每个指定类别标签的svm置信度分数。

编辑(这个原则与svm可以直接使用):

# install.packages( 'e1071' )
library( 'e1071' )
data( iris )
model <- svm( iris$Species~., iris )
res <- predict( model, newdata=iris )

2
这是一种非常不错的解决问题方式。但在深入探讨之前,我想知道 e1071 库中的 svm 是否可以直接执行此多类分类。 - StrikeR
我问的原因是,如果我的数据有10个输出类别,我需要建模10C2(10个中选择2个)= 45个分类器,这是一个巨大的任务。 - StrikeR
4
好的:答案简短明了,是的,“svm”也可以进行多类分类,其工作方式与二元分类相同(请参阅我回答中的编辑)。 - idleherb

1
R文档中提到:“对于有k个等级(k>2)的多类分类问题,libsvm采用‘one-against-one’方法进行处理,即训练k(k-1)/2个二元分类器;通过投票方案来确定正确的类别。”

引用文档并不能真正回答问题。 - Eric Hauenstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接