使用支持向量回归R预测新数据

时间:2016-04-26 20:53:25

标签: r svm predict

我正在尝试使用e1071软件包在R中使用Support-Vector Regression实现一次性交叉验证。我看起来或多或少的数据和代码:

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,但似乎解决方案不适用于我的代码。关于这个问题的任何想法?

2 个答案:

答案 0 :(得分: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中的变量,并允许您使用相同的变量名称预测新的数据集。

答案 1 :(得分: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)