2016-05-21 3 views
3

私はSVMとe1071を初めて使っています。同じコードを実行するたびに結果が異なることがわかりました。例えばRのe1071の確率によるSVM予測内の "ランダム"な、または非決定論的な要因は何ですか?

:として

  setosa versicolor virginica 
150 0.009704854 0.1903696 0.7999255 

result2

data(iris) 
library(e1071) 

model <- svm(Species ~ ., data = iris[-150,], probability = TRUE) 
pred <- predict(model, iris[150,-5], probability = TRUE) 
result1 <- as.data.frame(attr(pred, "probabilities")) 

model <- svm(Species ~ ., data = iris[-150,], probability = TRUE) 
pred <- predict(model, iris[150,-5], probability = TRUE) 
result2 <- as.data.frame(attr(pred, "probabilities")) 

はその後、私はとしてresult1を得た

 setosa versicolor virginica 
150 0.01006306 0.1749947 0.8149423 

、結果はすべてのラウンドを変更し続けます。

ここでは、最初の149行をトレーニングセットとして使用し、最後の行をテストとして使用しています。 result1result2の各クラスの確率はまったく同じではありません。予測中に「ランダム」なプロセスがいくつかあると推測しています。これはどうですか?

各コールの前に同じ番号のI set.seed()を使用すると、予測される確率が固定されることがあります。私は固定予測結果を「目標」としているわけではありませんが、なぜこのようなことが起こり、確率予測を生成するためにどのようなステップが必要なのか不思議です。

最後のサンプルがまだ「virginica」と予測されるため、わずかな違いは実際に虹彩データに大きな影響を与えません。しかし、私のデータ(AとBの2つのクラスを持つ)が "良い"ではなく、未知のサンプルがクラスAの2倍の確率で0.489と0.521の確率を持つと予測されるとき、混乱するでしょう。

ありがとうございます!

答えて

2

SVMは、確率の見積もりを開発する際に相互検証ステップを使用します。あなただけの呼び出しの前にランダムシードを設定することにより、「予測可能性」を作成することができます

// Cross-validation decision values for probability estimates 
static void svm_binary_svc_probability(
    const svm_problem *prob, const svm_parameter *param, 
    double Cp, double Cn, double& probA, double& probB) 
{ 
    int i; 
    int nr_fold = 5; 
    int *perm = Malloc(int,prob->l); 
    double *dec_values = Malloc(double,prob->l); 

    // random shuffle 
    GetRNGstate(); 
    for(i=0;i<prob->l;i++) perm[i]=i; 
    for(i=0;i<prob->l;i++) 
    { 
     int j = i+((int) (unif_rand() * (prob->l-i))) % (prob->l-i); 
     swap(perm[i],perm[j]); 
    } 

source code for that stepで始まる

> data(iris) 
> library(e1071) 
> set.seed(123) 
> model <- svm(Species ~ ., data = iris[-150,], probability = TRUE) 
> pred <- predict(model, iris[150,-5], probability = TRUE) 
> result1 <- as.data.frame(attr(pred, "probabilities")) 
> set.seed(123) 
> model <- svm(Species ~ ., data = iris[-150,], probability = TRUE) 
> pred <- predict(model, iris[150,-5], probability = TRUE) 
> result2 <- as.data.frame(attr(pred, "probabilities")) 
> result1 
     setosa versicolor virginica 
150 0.009114718 0.1734126 0.8174727 
> result2 
     setosa versicolor virginica 
150 0.009114718 0.1734126 0.8174727 

をしかし、私はエマーソンから警句を思い出しています:「愚かな一貫性があります小さな心のホブゴブリン。

+0

あなたの答えをありがとう! e1071のsvmがクロスバリデーションによって確率を生成し、ランダムなプロセスがどのように生成されるかを詳しく説明してください。あなたがソースコードに投稿したものが見つかりませんでした。あなたが投稿したコードを完全に理解していません。私はコールの前に種を設定して一貫性を持たせることができます。私は一貫した結果を出すつもりはありませんでしたが、そのことがどのように起こるかを理解したいだけです。どうもありがとう!! – Yan

+0

リンクがあなたの上に現われる圧縮されたバージョンのパッケージのソースバージョンを入手した後、それを展開して展開します。そこに 'src'という名前のフォルダが表示されます。抽出したコードは、svm.cppという名前のファイルにあります。テキストエディタで簡単に見つけることができます。私はC++プログラマーでもありませんし、コードのウォークスルーを尋ねると、私たちの誰もこれまでに修正しそうなことはないので、SOの質問を「尋ねる」のが大きすぎます。 –

+0

申し訳ありませんが私の質問が不適切だった場合。しかし、私はコードのウォークスルーを求めていませんでした。私は、「SVMが確率の推定値を作成する際に相互検証ステップを使用する」という1つまたは2つの文の説明を私に与えることができるかどうか、つまりこの相互検証ステップがここで確率をどのように発展させるかを考えていただけです。私はプログラマーではなく、コーディングに新しい人です。生のコードを読んで答えを見つけるのは難しいです。あなたがコードを読まなくてもそれを説明できるなら、私は感謝します。しかし、それがあなたの時間を要するなら、私は残念です。ありがとう! – Yan

関連する問題