svm
ine1071
使用“一对一”策略进行多类分类(即所有对之间的二元分类,然后是投票)。因此,要处理这种分层设置,您可能需要手动执行一系列二进制分类器,例如第 1 组与全部,然后第 2 组与剩下的任何东西,等等。此外,基本svm
功能不会调整超参数,所以您通常会希望使用像tune
ine1071
或train
在优秀caret
包中这样的包装器。
无论如何,要在 R 中对新个体进行分类,您不必手动将数字插入方程。相反,您使用predict
泛型函数,它具有适用于不同模型(如 SVM)的方法。对于这样的模型对象,您通常也可以使用泛型函数plot
和summary
. 以下是使用线性 SVM 的基本思想示例:
require(e1071)
# Subset the iris dataset to only 2 labels and 2 features
iris.part = subset(iris, Species != 'setosa')
iris.part$Species = factor(iris.part$Species)
iris.part = iris.part[, c(1,2,5)]
# Fit svm model
fit = svm(Species ~ ., data=iris.part, type='C-classification', kernel='linear')
# Make a plot of the model
dev.new(width=5, height=5)
plot(fit, iris.part)
# Tabulate actual labels vs. fitted labels
pred = predict(fit, iris.part)
table(Actual=iris.part$Species, Fitted=pred)
# Obtain feature weights
w = t(fit$coefs) %*% fit$SV
# Calculate decision values manually
iris.scaled = scale(iris.part[,-3], fit$x.scale[[1]], fit$x.scale[[2]])
t(w %*% t(as.matrix(iris.scaled))) - fit$rho
# Should equal...
fit$decision.values

将实际类标签与模型预测制表:
> table(Actual=iris.part$Species, Fitted=pred)
Fitted
Actual versicolor virginica
versicolor 38 12
virginica 15 35
从模型对象中提取特征权重svm
(用于特征选择等)。在这里,Sepal.Length
显然更有用。
> t(fit$coefs) %*% fit$SV
Sepal.Length Sepal.Width
[1,] -1.060146 -0.2664518
要了解决策值的来源,我们可以手动将它们计算为特征权重和预处理特征向量的点积,减去截距偏移量rho
。(如果使用 RBF SVM 等,预处理意味着可能居中/缩放和/或内核转换等)
> t(w %*% t(as.matrix(iris.scaled))) - fit$rho
[,1]
51 -1.3997066
52 -0.4402254
53 -1.1596819
54 1.7199970
55 -0.2796942
56 0.9996141
...
这应该等于内部计算的值:
> head(fit$decision.values)
versicolor/virginica
51 -1.3997066
52 -0.4402254
53 -1.1596819
54 1.7199970
55 -0.2796942
56 0.9996141
...