2016-04-26 34 views
1

e1071パッケージのRのサポートベクトル回帰を使用して、leave-one-out相互検証を実装しようとしています。データと私はこのような多かれ少なかれ見ていコード:サポートベクトル回帰を使用して新しいデータを予測するR

library(e1071) 

#create fake dataset 

y=rpois(30,3)-4+(rbinom(30,1,0.5))/2 
x1=c(rep('C',16),rep('S',14)) 
x2=c(runif(16,0,1),runif(14,0,1)/10) 
x3=c(runif(16,0,1)/5,runif(14,0,1)) 
dat=data.frame(y=y,x1=x1,x2=x2,x3=x3) 
train=dat[-1,] 
test=dat[1,] 

# train the model 

model=tune(svm, train$y ~ train$x1*train$x2*train$x3,kernel='linear', 
ranges = list(epsilon = seq(0.1,0.6,0.1), cost = 2^(0:9))) 
model=model$best.model 

#predict 

predict(model,newdata=test) 

問題は、関数は、訓練を受けた値を返し、テストデータセットを予測しない予測するということです。私はここで同様の質問、predict.svm does not predict new dataを見たことがありますが、解決策は私のコードには適用されないようです。この問題に関するアイデアはありますか?

答えて

0

いつも$を式(~)の中に使用していると、それは事態が混乱する可能性があるという兆候です。ここでは、これは、特にtrain data.frameから変数を切り離し、あなたが同じ変数名を持つ新しいデータセットに予測することができ、あなたのtune()コール

model=tune(svm, y ~ x1*x2*x3, data=train, 
    kernel='linear', ranges = list(epsilon = seq(0.1,0.6,0.1), cost = 2^(0:9))) 

を再書くべき方法です。

+0

実際、私は前にこの方法で関数を呼び出していましたが、何らかの理由で私はエラーメッセージを受け取りました。今それは働いた。助けてくれてありがとう! – tfigueiredo

0

ここでは、x1、x2、x3の3つの相互作用が必要なのかどうか、またはそれらを独立変数として使用するかどうかはわかりません。以下はそれらを独立変数として実行します。しかし、最も重要なことは、あなたが列車のデータセット(train $ x1)を常に予測していたモデル式のデータを呼び出すことです。

model=tune(svm, y ~ x1+x2+x3,kernel='linear',data=train, 
      ranges = list(epsilon = seq(0.1,0.6,0.1), cost = 2^(0:9))) 
model=model$best.model 

#predict 

predict(model,newdata=test) 
+0

はい、私はこれらの3つの変数の相互作用の可能性を期待しています。私はこの形式で曲を書き直してくれました。ありがとうございました! – tfigueiredo

+0

任意の非線形アルゴリズムが対話を取り上げます。乗算は必要ありません。方程式を真似するだけです。 – Jason

関連する問題