Предсказание.свм не предсказывает новые данные - PullRequest
7 голосов
/ 16 декабря 2010

, к сожалению, у меня проблемы с использованием предиката () в следующем простом примере:

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 

Кто-нибудь может объяснить, почему предикат () дает только установленные значения обучающей выборки (x, y) и не заботится о данных теста?

Большое спасибо за помощь!

Richard

Ответы [ 2 ]

9 голосов
/ 16 декабря 2010

Похоже, это потому, что вы неправильно используете интерфейс формулы для 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
6 голосов
/ 16 декабря 2010

Вам нужно, чтобы новые данные имели ту же форму, т. Е. Использование 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 работают.

...