svm
ine1071
は、マルチクラス分類に「1 対 1」の戦略を使用します (つまり、すべてのペア間のバイナリ分類とそれに続く投票)。したがって、この階層的なセットアップを処理するには、グループ 1 とすべて、次にグループ 2 と残っているものなど、一連のバイナリ分類子を手動で実行する必要があるでしょう。さらに、基本svm
関数はハイパーパラメータを調整しないため、通常tune
はe1071
、または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
...