2 votos

Error: demasiados empates en knn en R

Estoy intentando utilizar el algoritmo KNN del class en R.

Lo he utilizado antes en el mismo conjunto de datos, sin normalizar una de las características, pero su rendimiento fue pobre (0,35 de precisión). Ahora he intentado entrenar el modelo con las características normalizadas, pero obtengo el error "demasiados lazos en knn" .

Estoy tratando de predecir las valoraciones de los usuarios sobre las películas (utilizando el Lente de cine conjunto de datos).

Quiero predecir clasificación que podría ser 1,2,3,4,5. He probado con diferentes valores de k que no son múltiplos de 5. Incluso he probado con k = 1 pero sigo teniendo el mismo error.

Los datos consisten en su mayoría en atributos binarios (19 géneros de películas y el género de los usuarios) y sólo 1 atributo numérico (la edad del usuario) y creo que ese es el problema.

3voto

ytk Puntos 106

Por favor, combina los cambios que he hecho a continuación con los datos adicionales que tienes en tu conjunto de datos y que no tengo en la versión que he encontrado, como la edad, el sexo, etc.

require(class)
require(caret)
unzip("ml-100k.zip")
setwd("ml-100k")
movies        <- read.csv("u.data", sep = "\t")
names(movies) <- c("user id", "movie id", "rating", "ts")
movies$"user id" <- NULL

idx      <- rbinom(99999, 2, .6)
training <- movies[idx,]
testing  <- movies[-idx,]
x        <- training
y        <- training$rating
x1       <- testing
y1       <- testing$rating

# Too many ties
knn(train = x, test = testing, cl = y, k = 1, l = 0, prob = FALSE, use.all = T)

# Still no joy
knn(train = x, test = testing, cl = y, k = 1, l = 0, prob = FALSE, use.all = F)

# This works ####
movies        <- read.csv("u.data", sep = "\t")
names(movies) <- c("user id", "movie id", "rating", "ts")
movies$"user id" <- NULL

# Fix timestamp
movies$ts <- as.POSIXct(movies$ts, origin = "1970-01-01") 
movies$new <- 0
movies$new[movies$ts > mean(movies$ts)] <- 1
movies$ts <- NULL

#Group movie ID's
movies$movie <- cut(movies$"movie id", 20, labels = 1:20)
movies$"movie id" <- NULL

# The renaming below was part of an experiment with recoding the outcome
#        but it's not important here
movies$y <- movies$rating
movies$rating <- NULL

#movies$y <- as.data.frame(scale(movies$y))

idx      <- rbinom(nrow(movies), 2, .5)
training <- movies[idx,]
testing  <- movies[-idx,]
x        <- training
y        <- training$y
x1       <- testing
y1       <- testing$y

knn(train = x, test = testing, cl = y, k = 1, l = 0, prob = T, use.all = F)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X