2016-04-26 42 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

相关问题