e1071
中的 svm
采用“一对一”策略进行多类分类(即所有对之间的二元分类,然后投票)。因此,为了处理这种层次结构,您可能需要手动执行一系列二元分类器,例如组1对全部,然后是组2对剩下的等等。此外,基本的svm
函数不调整超参数,因此您通常希望使用包装器(如e1071
中的tune
或优秀的caret
包中的train
)。
无论如何,在R中分类新个体时,您不必手动将数字插入方程式中。相反,您使用通用函数predict
,该函数具有适用于不同模型(如SVM)的方法。对于此类模型对象,您通常还可以使用通用函数plot
和summary
。以下是使用线性SVM的基本想法示例:
require(e1071)
iris.part = subset(iris, Species != 'setosa')
iris.part$Species = factor(iris.part$Species)
iris.part = iris.part[, c(1,2,5)]
fit = svm(Species ~ ., data=iris.part, type='C-classification', kernel='linear')
dev.new(width=5, height=5)
plot(fit, iris.part)
pred = predict(fit, iris.part)
table(Actual=iris.part$Species, Fitted=pred)
w = t(fit$coefs) %*% fit$SV
iris.scaled = scale(iris.part[,-3], fit$x.scale[[1]], fit$x.scale[[2]])
t(w %*% t(as.matrix(iris.scaled))) - fit$rho
fit$decision.values
![enter image description here](https://istack.dev59.com/xgHjC.webp)
制表实际类标签与模型预测:
> 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
...
with(fit, t(coefs) %*% SV)
中得到N-1个向量。每个向量的意义是什么? - Manuel Ramón