9

不幸的是,我在以下简单示例中使用 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) 的拟合值而不关心测试数据?

非常感谢您的帮助!

理查德

4

2 回答 2

11

看起来这是因为您误用了svm(). 通常,人们会提供一个数据框或类似的对象,在其中搜索公式中的变量。如果你不这样做通常没关系,即使这不是最佳实践,但是当你想预测时,把变量放在数据框中会让你一团糟。它返回训练数据的原因是因为您没有提供newdata包含其中命名组件的对象x。因此它找不到新数据x,因此返回拟合值。这对于predict我知道的大多数 R 方法都很常见。

然后解决方案是 i) 将您的训练数据放入数据框中并将svm其作为data参数传递,并且 ii) 提供一个包含x(from test) to的新数据框predict()。例如:

> 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
于 2010-12-16T15:10:43.937 回答
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 中所有建模函数的基本工作方式。

于 2010-12-16T15:09:35.953 回答