Compañeros, me siento superado por este problema. A ver si me podéis ayudar. No me funciona (o no entiendo) predict en objetos creados por kknn. Os pongo un ejemplo sencillo que trata de predecir un cuadrado en una nube de puntos en el plano. Muy sencillo viendo el código: #Datos #Se trata de una nube de puntos en el plano long = 10000 x <- runif(long,1,100) y <- runif(long,1,100) datos <- data.frame(x,y) #Creamos un conjunto de datos de entrenamiento y otro de test indices <- sample(1:long,long/2) entrenamiento <- datos[indices,] test <- datos[-indices,] #Preparamos un gráfico de dispersión library(ggplot2) g <- ggplot(entrenamiento,aes(entrenamiento$x,entrenamiento$y)) + geom_point() #g #Vamos a crear las clases que nos un cuadrado C <- ifelse(entrenamiento$x>20 & entrenamiento$x<80 & entrenamiento$y>20 &entrenamiento$y<80,1,0) #Pintamos en nuestra nube de puntos ese cuadrado g + geom_point(aes(colour = C))+ opts(title="PINTAMOS UN CUADRADO") #Comenzamos a trabajar con knn #La librería será kknn library(kknn) #Voy a buscar el mejor modelo k maximo 10 y unas funciones kernel entreno.Cuadrado<-cbind(C,entrenamiento) aprox.Cuadrado <- train.kknn(C ~ x + y, data = entreno.Cuadrado, kmax = 10, kernel = c("rectangular", "triangular", "epanechnikov", "gaussian", "rank")) plot(aprox.Cuadrado) #Triangular con k=4 es el que mejor pinta tiene si pintáis los fitted.values queda de lujo test.Cuadrado<-cbind(C,test) knn.Cuadrado <- kknn(C~x+y,entreno.Cuadrado,test.Cuadrado,k=4,kernel="triangular") g + geom_point(aes(colour = predict(knn.Cuadrado,test.Cuadrado)))+ opts(title="PINTAMOS UN MOJÓN") Mi problema es que PREDICT NO FUNCIONA CON KKNN. Tengo la impresión de que me está realizando la predicción para el modelo de k=1, pero esto es una impresión mía dentro del gran número de pajas mentales que me estoy haciendo. Pensé que había alguna función predict.kknn pero por lo visto no. Me estoy comenzando a crispar y no me gusta la librería class. A ver si alguien puede arrojar un poco de luz, muchas gracias. Raúl Vaquerizo Romero www.analisisydecision.es
Hola Raúl. No he visto tu código en profundidad, pero puede ser que en el último gráfico estás llamando a g, que es ggplot creado para los datos de entrenamiento y le pintes la predicción de los datos de test. Deberías pintar los datos de test y su predicción. Quizá esto te valga. g2 <- ggplot(test,aes(test$x,test$y)) + geom_point() g2 + geom_point(aes(colour = predict(knn.Cuadrado,test.Cuadrado)))+ ggtitle("Un poco menos mojón ") El 28/10/14 a las 18:06, "Raúl Vaquerizo" escribió:> #Datos > #Se trata de una nube de puntos en el plano > long = 10000 > x <- runif(long,1,100) > y <- runif(long,1,100) > datos <- data.frame(x,y) > > #Creamos un conjunto de datos de entrenamiento y otro de test > indices <- sample(1:long,long/2) > entrenamiento <- datos[indices,] > test <- datos[-indices,] > > > #Preparamos un gráfico de dispersión > library(ggplot2) > g <- ggplot(entrenamiento,aes(entrenamiento$x,entrenamiento$y)) + > geom_point() > > #g > > #Vamos a crear las clases que nos un cuadrado > C <- ifelse(entrenamiento$x>20 & entrenamiento$x<80 & entrenamiento$y>20 > &entrenamiento$y<80,1,0) > > #Pintamos en nuestra nube de puntos ese cuadrado > g + geom_point(aes(colour = C))+ opts(title="PINTAMOS UN CUADRADO") > > #Comenzamos a trabajar con knn > #La librería será kknn > library(kknn) > > #Voy a buscar el mejor modelo k maximo 10 y unas funciones kernel > entreno.Cuadrado<-cbind(C,entrenamiento) > aprox.Cuadrado <- train.kknn(C ~ x + y, data = entreno.Cuadrado, > kmax = 10, kernel = c("rectangular", "triangular", "epanechnikov", > "gaussian", "rank")) > plot(aprox.Cuadrado) > > #Triangular con k=4 es el que mejor pinta tiene si pintáis los > fitted.values queda de lujo > test.Cuadrado<-cbind(C,test) > knn.Cuadrado <- > kknn(C~x+y,entreno.Cuadrado,test.Cuadrado,k=4,kernel="triangular") > > g + geom_point(aes(colour = predict(knn.Cuadrado,test.Cuadrado)))+ > opts(title="PINTAMOS UN MOJÓN")