2010-12-16 9 views
7

Lamentablemente no tengo problemas con el uso de predecir() en el siguiente ejemplo:predict.svm no predice nuevos datos

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) 

El resultado es el siguiente:

> predict(mod, newdata = test) 
    1 2 3 4 <NA> <NA> <NA> <NA> <NA> <NA> 
    0 0 0 0 0 1 1 1 1 1 

¿Alguien puede explicar por qué predecir() solo da los valores ajustados de la muestra de entrenamiento (x, y) y no le importan los datos de prueba?

¡Muchas gracias por su ayuda!

Richard

+0

ps: usando la prueba <- c (11:25) da "Error en los nombres (RET2) <- rowns: atributo 'nombres' [15] debe ser la misma longitud que el vector [10 ] " – Richard

Respuesta

5

Es necesario NewData a ser de la misma forma, es decir, utilizando un hoja.de.datos ayuda:

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> 

Por cierto, esto también se muestra la página de ayuda para 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) 

Así que, en resumen, utilice la interfaz de fórmula y proporcione un data.frame --- así es como esencialmente todas las funciones de modelado en R wo rk.

8

Parece que esto se debe a que hace un uso indebido de la interfaz de fórmula en svm(). Normalmente, uno proporciona un marco de datos u objeto similar dentro del cual se buscan las variables en la fórmula. Por lo general, no importa si no hace esto, incluso si no es una buena práctica, pero cuando quiere predecir, no poner variables en un marco de datos lo pone en un lío correcto. El motivo por el que devuelve los datos de entrenamiento es porque no proporciona newdata un objeto con un componente llamado x. Por lo tanto, no puede encontrar los nuevos datos x, por lo que devuelve los valores ajustados. Esto es común para la mayoría de los métodos R predict que conozco.

La solución entonces es i) poner los datos de entrenamiento en una trama de datos y pasar svm esto como el argumento data, y ii) suministrar una nueva trama de datos que contiene x (de test) a predict(). Ej:

> 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 
+0

Muchas gracias, ¡salvaste mi día! – Richard

Cuestiones relacionadas