如何在 R 中构建多类 SVM?
How to build multiclass SVM in R?
我正在使用支持向量机进行项目手写模式识别(字母表)。我总共有 26 classes,但我无法 classify 在 R 中使用 SVM。只有当图像是二进制 class 时,我才能 class 化图像。如何在 R 中将 SVM 用于 Multiclass SVM?
我正在使用 "e1071" 包。
提前致谢。
e1071
中没有 Multiclass SVM 的直接等价物。此外,所有将 SVM 用于 multiclass classification 的方法都使用 'one vs rest' 或编码等技术。这是一个详细介绍最常见方法的参考...
http://arxiv.org/ftp/arxiv/papers/0802/0802.2411.pdf
如果要将 e1071
用于 multiclass SVM,最好可以创建 26 个 svm 模型,每个 class 一个,并使用概率分数进行预测。这种方法对于手写模式识别应该足够好了。
对于多 class classifier,您可以获得每个 class 的概率。您可以在训练模型时设置 'probability = TRUE',并在 'predict' api 中设置。这将为您提供每个 class 的概率。下面是鸢尾花数据集的示例代码:
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
...
希望对您有所帮助。
注意:我相信当你在内部给 'probability' 时,svm 执行一个 vs rest classifier 因为,'probability' 参数集与 [= 的模型相比需要更多时间23=] 参数未设置。
我想批准的答案已经过时了。 e1071 包中使用的 libsvm 还支持“1-vs.-1”模型中的多 class class 化。即,它创建 (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))
我正在使用支持向量机进行项目手写模式识别(字母表)。我总共有 26 classes,但我无法 classify 在 R 中使用 SVM。只有当图像是二进制 class 时,我才能 class 化图像。如何在 R 中将 SVM 用于 Multiclass SVM?
我正在使用 "e1071" 包。
提前致谢。
e1071
中没有 Multiclass SVM 的直接等价物。此外,所有将 SVM 用于 multiclass classification 的方法都使用 'one vs rest' 或编码等技术。这是一个详细介绍最常见方法的参考...
http://arxiv.org/ftp/arxiv/papers/0802/0802.2411.pdf
如果要将 e1071
用于 multiclass SVM,最好可以创建 26 个 svm 模型,每个 class 一个,并使用概率分数进行预测。这种方法对于手写模式识别应该足够好了。
对于多 class classifier,您可以获得每个 class 的概率。您可以在训练模型时设置 'probability = TRUE',并在 'predict' api 中设置。这将为您提供每个 class 的概率。下面是鸢尾花数据集的示例代码:
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
...
希望对您有所帮助。
注意:我相信当你在内部给 'probability' 时,svm 执行一个 vs rest classifier 因为,'probability' 参数集与 [= 的模型相比需要更多时间23=] 参数未设置。
我想批准的答案已经过时了。 e1071 包中使用的 libsvm 还支持“1-vs.-1”模型中的多 class class 化。即,它创建 (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))