1

次のコードを使用して、leave-one-out 交差検証を実行しようとしています。

library(e1071)
library(plyr)

trainingdata<-read.table('data.txt', sep=",", header=TRUE)
f0 <- function(x) any(x!=1) & any(x!=0) & is.numeric(x)
trainingdata<-cbind(colwise(identity, f0)(trainingdata))

C <- 0
M <- 0
count <- nrow(trainingdata)
for(i in 1:count)
{
   actual <- trainingdata[i,]$label
   trainingtemp <- trainingdata[-c(i), ]

   model <- svm(factor(label)~., data=trainingtemp, method="C-classification",     
   kernel="sigmoid", C=0.1, gamma=0.01, cross=10)

   testdata <- trainingdata[i, ]
   prediction <- predict(model, testdata)
   prediction <- paste(prediction)

   if(actual==prediction)
      C <- C+1
   else
      M <- M+1
}

write.csv(data.frame(C,M))

私が理解していない問題は、C (正しく分類された) と M (正しく分類されていない) に対して常に同じ値を取得することです。以下の条件では結果は同じです。

1 - コストとガンマに異なる値を試してみました (best.svm() 関数も試しました)

2 - さまざまな分類方法とさまざまなカーネルも試しました。

3 - データ セットには合計約 50 の特徴があります。モデルの構築中に 1 つの機能 (svm(label~x1...) または svm(label~x2...)) が使用された場合でも、結果は影響を受けません。

コードに問題はありますか?ここに掲載するにはかなりのデータ量です。

4

4 に答える 4

1
  • irissvm 呼び出しにデータとさまざまなガンマを使用すると、さまざまな予測が得られます 。

  • cv が終了したら、すべての予測をベクトルに入れて、予測と正しいラベルを比較することをお勧めします。そうすれば、予測が実際に変化するかどうかをより簡単に確認できます。

  • データ、および C とガンマの選択がなければ、これ以上お手伝いすることはできません。

  • (ところで、反復できないため、leave-one-out 検証はお勧めしません。たとえば、 crossvalidated の検証スキームについて言われていることを閲覧したい場合があります)

于 2013-03-29T16:41:19.183 に答える
0

私は本当にRの多くを知りませんし、あなたのさまざまな呼び出しが何をしているのか正確には知りません. あなたがリーブワンアウト (LOO) をしようとしていることは知っています。確認すべき点は次のとおりです。

  • データを正規化していますか?すべての値を 0 と 1 の間 (または -1 と 1 の間) にしますか?線形または平均と標準偏差を使用しますか? これは SVM にとって非常に重要であり、RBF カーネルにとってはなおさら重要です。これを行わないと、簡単に数値計算が困難になります。
  • C (または RBF カーネルの場合は C とガンマ) の適切な値を体系的にパラメーター検索していますか? 相互検証を行っていますか、それともホールドアウトセットを使用していますか? Rコードの私の理解から、あなたがそうしているようには見えません。ガンマの 2^[-10...0] と C の 2^[-5...5] をテストするコードの外で、2 つの for を試してみませんか? これは実際には相互検証と呼ばれるものです。内側の反復を行っているだけで、いくつかの for ループが欠落していると思います。
于 2013-03-29T03:22:32.077 に答える
0

Leave-one-out データとして「trainingtemp」を作成していますが、モデルには常に完全なデータ「trainingdata」を渡しています。次のようにモデルを変更してみてください。

model <- svm(factor(label)~., data=trainingtemp, method="C-classification",     
   kernel="sigmoid", C=0.1, gamma=0.01, cross=10)
于 2013-03-28T23:13:34.147 に答える