3

これは非常に基本的な質問のように思えますが、どこにも答えが見つからないようです。私は一般的に SVM と ML に不慣れで、いくつかの簡単な演習を試みていますが、結果が一致していないようです。私は R で e1071 を使用しており、James、Witten、Hastie、および Tibshiraniによる An Introduction to Statistical Learningを使用しています。

私の質問: predict を使用すると、分類エラーがないように見えるのに、tune 関数の結果がゼロ以外のエラー率を示しているのはなぜですか? 私のコード(私は3つのクラスを見ています):

set.seed(4)
dat <- data.frame(pop = rnorm(900, c(0,3,6), 1), strat = factor(rep(c(0,1,2), times=300)))
ind <- sample(1:900)
train <- dat[ind[1:600],]
test <- dat[ind[601:900],]

tune1 <- tune(svm, train.x=train[,1], train.y=train[,2], kernel="radial", ranges=list(cost=10^(-1:2), gamma=c(.5,1,2)))
svm.tuned <- svm(train[,2]~., data=train, kernel = "radial",  cost=10, gamma=1) # I just entered the optimal cost and gamma values returned by tune
test.pred <- predict(svm.tuned, newdata=data.frame(pop=test[,1],strat=test[,2]))

したがって、test.pred を見ると、すべての値が真のクラス ラベルと一致していることがわかります。しかし、モデルを調整したところ、約 0.06 のエラー率が得られました。いずれにせよ、テスト エラー率 0 は、分離不可能なデータに対してばかげているように見えます (これが分離可能でないことについて間違っている場合を除きます)。明確化は非常に役立ちます。どうもありがとう。

4

1 に答える 1

5

tune関数は 10 回の交差検証を実行します。トレーニング データをランダムに10 個の部分に分割し、次のように繰り返します。

  • それらのそれぞれを選択し、それを「検証セット」と呼びます
  • 残りの 9 つを選択し、それらを「トレーニング セット」と呼びます
  • トレーニング セットで指定されたパラメータを使用して SVM をトレーニングし、検証セットでどの程度うまく機能するかをチェックします。
  • これらの 10 個の「フォールド」全体で平均誤差を計算します

「調整」機能からの情報は、この平均誤差です。最適なパラメーターが選択されると、セット全体でモデルをトレーニングします。これは、調整に使用されるものよりも正確に 1/9 大きくなります。その結果、あなたの特定のケースでは(頻繁に発生するわけではありません)-「テスト」セットを完全に予測する分類子が得られ、チューニング中にいくつかの小さなものを切り分けます-小さな間違いを犯しました-これが理由ですさまざまなエラーに関する情報を取得します。

アップデート

実際には、入力ラベルの両方でモデルをトレーニングしているようです..

svm.tuned$SV

サポート ベクターを保持する変数。

svm をトレーニングするには、単純に実行します。

svm(x,y,kernel="...",...)

例えば

svm(train$pop, train$strat, kernel="linear" )

その結果、いくつかの誤分類が発生します (予想どおり、線形カーネルはそのようなデータを完全に分離できないため)。

またはあなたの表記を使用して

svm.tuned <- svm(strat~., data=train, kernel = "radial",  cost=10, gamma=1)

インデックスではなく、フレーム列stratの名前を使用する必要があることに注意してください。

于 2013-09-07T17:17:12.633 に答える