如何在 R 中构建多类 SVM?
Posted
技术标签:
【中文标题】如何在 R 中构建多类 SVM?【英文标题】:How to build multiclass SVM in R? 【发布时间】:2016-03-23 12:55:43 【问题描述】:我正在使用支持向量机进行手写模式识别(字母)项目。我总共有 26 个类,但我无法在 R 中使用 SVM 进行分类。只有当它是二进制类时,我才能对图像进行分类。如何在 R 中将 SVM 用于 Multiclass SVM?
我正在使用“e1071”包。
提前致谢。
【问题讨论】:
你看过***.com/questions/22009871/…吗? 您可能还想阅读:jstatsoft.org/article/view/v015i09/v15i09.pdf 【参考方案1】:我想批准的答案已经过时了。包 e1071 中使用的 libsvm 还支持“1-vs.-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))
【讨论】:
【参考方案2】:对于多类分类器,您可以获得每个类的概率。您可以在“预测”API 中训练模型时设置“概率 = 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 会执行一个 vs 剩余分类器,因为在未设置“概率”参数的模型上设置“概率”参数需要更多时间。
【讨论】:
谢谢,@Pavan!我有一个六类分类问题,调整你的答案我很容易破解它。惊人的!我不知道的是,类属性必须是分类的才能正常工作。最初,我的数据集将类表示为整数。没有引发错误,但 attr(pred_prob, "probabilities") 行返回了一个 NULL 对象。我不得不更改我的数据集以将类属性转换为某种分类表示。然后我得到了每个类返回的概率,类似于你的例子。再次感谢!【参考方案3】:e1071
中没有直接等效的 Multiclass SVM。此外,所有使用 SVM 进行多类分类的方法都使用“one vs rest”或编码等技术。这是详细说明最常见方法的参考...
http://arxiv.org/ftp/arxiv/papers/0802/0802.2411.pdf
如果你想用e1071
做多类SVM,你最好可以创建26个svm模型,每个类一个,用概率分数来预测。这种方法应该足以用于手写模式识别。
【讨论】:
感谢您的回复 :) 我尝试使用 e1071 包创建 26 个 SVM 模型 我面临的问题是,当我在测试中使用 1 类图像训练 1 类图像时,我会出现类似 “模型为空”。如何为每个类创建模型并使用概率分数进行预测? @AbiramiM 您必须在模型中输入所有图像并将建模类标记为 1 或 0,这将是您的因变量。您必须分别为所有类执行此操作,并且每次都输入所有图像。 这个答案可能已经过时了。svm
支持“一对一”方法中的多类。以上是关于如何在 R 中构建多类 SVM?的主要内容,如果未能解决你的问题,请参考以下文章