2016-04-26 41 views
1

我正嘗試在R中使用支持向量迴歸與e1071包實現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

無論何時,如果在公式(~)內部使用$,則表示事情可能會變得混亂。下面是你應該重新寫你的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))) 

這從train data.frame明確分離變量,並允許您預測到新的數據集相同的變量名。

+0

其實我之前調用這樣的功能,但對於某些原因我收到了一條錯誤消息。現在它工作了。非常感謝你的幫助!! – tfigueiredo

0

這裏有幾件事 - 我不知道你是否想要x1,x2和x3之間的三重互動,或者如果你想讓它們作爲獨立變量。下面將它們作爲自變量來運行。然而,最重要的是,你打電話給你的模型公式中的數據這就是爲什麼你總是預測你的訓練集(火車$ 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

是的,我期望這三個變量之間可能存在相互作用。我用這種形式重寫了調音,它工作正常!謝謝! – tfigueiredo

+0

任何非線性算法都會選擇交互。你不應該需要做任何乘法運算,它只會讓你的公式變得混亂。 – Jason

相關問題