如何在R中构建多类支持向量机?

6

我正在开展手写模式识别(字母)项目,使用支持向量机。总共有26个类,但是我在R中无法使用SVM进行分类。只有在二元分类的情况下才能对图像进行分类。如何在R中使用多类SVM

我正在使用“e1071”包。

提前感谢。


1
你看过这个网站吗?https://dev59.com/ZWEh5IYBdhLWcg3wyGHy - Vongo
你可能也想阅读这篇文章:http://www.jstatsoft.org/article/view/v015i09/v15i09.pdf - Vongo
3个回答

7

对于多分类器,您可以获取每个类别的概率。在训练模型时和使用“predict”API时,您可以设置“probability=TRUE”以获取每个类别的概率。以下是鸢尾花数据集的示例代码:

data(iris)
attach(iris)
x <- subset(iris, select = -Species) 
y <- Species
model <- svm(x, y, probability = TRUE)
pred_prob <- predict(model, x, decision.values = TRUE, probability = TRUE)

使用以上代码,“pred_prob”将具有其他数据中的概率。您可以使用以下语句仅访问对象中的概率:

attr(pred_prob, "probabilities")

         setosa  versicolor   virginica
1   0.979989881 0.011347796 0.008662323
2   0.972567961 0.018145783 0.009286256
3   0.978668604 0.011973933 0.009357463
...

希望这能帮到你。

注意:我认为当你在内部给出"概率"时,svm会执行一对多分类器,因为使用"概率"参数的模型比不使用"概率"参数的模型需要更多时间。


谢谢,@Pavan!我有一个六类分类问题,通过适应你的答案,我成功解决了它。太棒了!我之前不知道的一件事是,为了使其正常工作,类属性必须是分类的。最初,我的数据集中的类别表示为整数。没有出现错误,但是attr(pred_prob,“probabilities”)返回了一个空对象。我不得不更改我的数据集,将类属性转换为某种分类表示形式。然后,每个类别的概率都被返回,就像你的例子一样。再次感谢! - Aureliano Buendia

2

我猜想被认可的答案已经过时了。在e1071包中使用的libsvm还支持"1对1"模型的多类分类。也就是说,它会创建(L-choose-2)个分离平面。

这里有一个示例代码:

# Create 2d data
set.seed(1)
x1 = matrix(c(rnorm(20, 0), rnorm(20, 0)), ncol=2)
x2 = matrix(c(rnorm(20, 0), rnorm(20, 4)), ncol=2)
x3 = matrix(c(rnorm(20, 4), rnorm(20, 0)), ncol=2)
x4 = matrix(c(rnorm(20, 4), rnorm(20, 4)), ncol=2)
x = rbind(x1,x2,x3,x4)
y = factor(c(rep(1,20), rep(2,20), rep(3,20), rep(4,20)))

# Multiclass Classification (1 vs. 1)
fit = svm(y~x, kernel = "linear", cost = 10, scale=F)
plot(x, col=y, xlim=c(-3,6), ylim=c(-2.5,6.5))
table(y, predict(fit))

0

e1071中没有多类SVM的直接等效物。此外,所有用于多类分类的SVM方法都使用“一对其余”或编码等技术。这里有一个参考文献详细介绍了最常见的方法... http://arxiv.org/ftp/arxiv/papers/0802/0802.2411.pdf

如果您想使用e1071进行多类SVM,最好创建26个svm模型,每个类别一个,并使用概率分数进行预测。这种方法对于手写模式识别应该足够好。


谢谢回复 :) 我已经尝试使用e1071包创建了26个SVM模型。我遇到的问题是,当我用类1图像训练测试中的类1图像时,会出现一个错误,如“模型为空”。如何为每个类创建模型并使用概率分数进行预测? - Abirami M
@AbiramiM 你需要将所有的图像输入到一个模型中,并将建模类别标记为1或0,这将是你的因变量。你需要为每个类别分别执行此操作,并每次输入所有图像。 - Gaurav
这个答案可能已经过时了。svm 支持“一对一”方法的多类别分类。 - Maverick Meerkat

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