18

SVM のパフォーマンスをテストして、複数の個人を 4 つのグループ/クラスに分類することに興味があります。MATLAB の svmtrain LibSVM 関数を使用すると、この方程式の値に基づいて、これらの個人を 4 つのグループに分類するために使用される 3 つの方程式を取得できます。スキームは次のようになります。

                All individuals (N)*
                      |
 Group 1 (n1) <--- equation 1 --->  (N-n1)
                                      |
                   (N-n1-n2) <--- equation 2 ---> Group 2 (n2)
                      |
Group 3 (n3) <--- equation 3 ---> Group 4(n4)

*N = n1+n2+n3+n4

e1071 R パッケージの svm 関数を使用してこれらの方程式を取得する方法はありますか?

4

1 に答える 1

42

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

いずれにせよ、R で新しい個人を分類するために、手動で数式に数値を代入する必要はありません。代わりに、predictSVM のようなさまざまなモデルのメソッドを持つジェネリック関数を使用します。このようなモデル オブジェクトの場合、通常はジェネリック関数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
...
于 2011-10-14T22:48:20.060 に答える