遗憾的是,我在以下简单示例中使用predict()时遇到了问题:
library(e1071)
x <- c(1:10)
y <- c(0,0,0,0,1,0,1,1,1,1)
test <- c(11:15)
mod <- svm(y ~ x, kernel = "linear", gamma = 1, cost = 2, type="C-classification")
predict(mod, newdata = test)
结果如下:
> predict(mod, newdata = test)
1 2 3 4 <NA> <NA> <NA> <NA> <NA> <NA>
0 0 0 0 0 1 1 1 1 1
有人可以解释为什么predict()只给出训练样本(x,y)的拟合值而不关心测试数据吗?
非常感谢你的帮助!
理查德
答案 0 :(得分:9)
看起来这是因为您滥用公式界面svm()
。通常,提供数据帧或类似对象,在其中搜索公式中的变量。如果你不这样做通常没关系,即使这不是最佳实践,但是当你想要预测时,不将变量放入数据框会让你陷入困境。它返回训练数据的原因是因为您没有为newdata
提供一个名为x
的组件。因此,它无法找到新数据x
,因此返回拟合值。这对于我所知道的大多数R predict
方法都很常见。
然后解决方案是:i)将您的训练数据放在数据框中,并将svm
作为data
参数传递,ii)提供包含x
的新数据框(从test
)到predict()
。 E.g:
> DF <- data.frame(x = x, y = y)
> mod <- svm(y ~ x, data = DF, kernel = "linear", gamma = 1, cost = 2,
+ type="C-classification")
> predict(mod, newdata = data.frame(x = test))
1 2 3 4 5
1 1 1 1 1
Levels: 0 1
答案 1 :(得分:6)
您需要newdata具有相同的形式,即使用data.frame帮助:
R> library(e1071)
Loading required package: class
R> df <- data.frame(x=1:10, y=sample(c(0,1), 10, rep=TRUE))
R> mod <- svm(y ~ x, kernel = "linear", gamma = 1,
+ cost = 2, type="C-classification", data=df)
R> newdf <- data.frame(x=11:15)
R> predict(mod, newdata=newdf)
1 2 3 4 5
0 0 0 0 0
Levels: 0 1
R>
顺便说一句,这也会显示svm()
的帮助页面:
## density-estimation
# create 2-dim. normal with rho=0:
X <- data.frame(a = rnorm(1000), b = rnorm(1000))
attach(X)
# traditional way:
m <- svm(X, gamma = 0.1)
# formula interface:
m <- svm(~., data = X, gamma = 0.1)
# or:
m <- svm(~ a + b, gamma = 0.1)
# test:
newdata <- data.frame(a = c(0, 4), b = c(0, 4))
predict (m, newdata)
总而言之,使用公式接口并提供data.frame ---这就是R工作中所有建模函数的基本功能。