Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resumen
El algoritmo kNN (k nearest neighbors por sus siglas en inglés, k vecinos más cercanos)
es un clasificador basado en el algoritmo nearest neighbors. Dichos clasificadores
agrupan las observaciones según sus variables (características), del mismo modo que
una persona podría agrupar alimentos según sus características (grado dulzura, grado
picante, color, etc).
Al observar un nuevo elemento, podremos predecir si corresponde a una clase u otra
según la distancia de la nueva observación con los demás. En particular, la decisión
que adoptará el algoritmo será la de agrupar la nueva observación dentro de la clase
del elemento/s más cercano/s.
El concepto de kNN implica asignar un valor entero k al algoritmo nn. Dicho valor se
usará para valorar las k observaciones más cercanas a la nueva observación.
Una vez obtenemos todas las observaciones más cercanas, clasificaremos la nueva
observación según una votación, teniendo en cuanta la cantidad de observaciones de
una clase determinada.
Por ejemplo, en un clasificador 3-NN, si la nueva observación tiene como los 3
elementos más cercanos las clases fruta, hortaliza, fruta, el algoritmo clasificará la
nueva observación como fruta.
Las fortalezas y debilidades que tiene el algoritmo kNN se presentan resumidas en la
siguiente tabla:
Fortalezas Debilidades
Simple y efectivo No se genera ningún modelo, lo que limita la
capacidad para entender cómo están
relacionadas las características de una clase
No estable supuestos sobre la Es necesario establecer a priori un valor para k.
distribución de los datos
La fase de entrenamiento es rápida. La fase de clasificación suele ser lenta.
Las características de tipo nominal y la falta de
observaciones requieren un tratamiento
adicional.
Librerías Usadas en R
Las librerías que se usan para este clasificador son:
• caret: usado para realizar una matriz de confusión y ver los resultados de las
predicciones contra las clases reales. Puede encontrarse toda la información
sobre esta librería en la web:
https://www.rdocumentation.org/packages/caret/versions/6.0-86
• class: contiene las funciones de kNN. La documentación de esta librería está
disponible en https://www.rdocumentation.org/packages/class/versions/7.3-
17.
El dataset iris está compuesto por 150 observaciones y 5 variables, de las cuales 4 son
variables numéricas (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) y 1
cualitativa (Species).
Nuestro objetivo será predecir la variante a la que pertenece una flor iris (virginica,
setosa y versicolor) según sus características.
El primer paso a realizar será hacer un estudio numérico de las variables con la
función summary():
summary(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50
Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Como podemos observar las variables numéricas no tienen el mismo rango de valores.
Algunas variables contienen valores entre el 4.3 y el 7.9 (como es el caso del
Petal.Width) y otras entre el 0.1 y el 2.5 (como el Petal.Length).
Esta distribución de los valores de las variables podría provocar que una variable
irrelevante con un rango de valores muy elevado tuviese un impacto demasiado
elevado sobre la modelización del problema, minimizando el impacto de variables
más relevantes pero con un rango menor.
Por dicho motivo, antes de seguir debemos normalizar estos valores, de manera que
todas las variables tengan el mismo rango. Para solventarlo, crearemos una función de
normalización llamada min-max usando la siguiente función.
iris_norm <- as.data.frame(apply(iris[, 1:4], 2, function(x) (x -
min(x))/(max(x)-min(x))))
Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.00000 setosa :50
1st Qu.:0.2222 1st Qu.:0.3333 1st Qu.:0.1017 1st Qu.:0.08333 versicolor:50
Median :0.4167 Median :0.4167 Median :0.5678 Median :0.50000 virginica :50
Mean :0.4287 Mean :0.4406 Mean :0.4675 Mean :0.45806
3rd Qu.:0.5833 3rd Qu.:0.5417 3rd Qu.:0.6949 3rd Qu.:0.70833
Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.00000
Entrenamiento del modelo
Una vez tenemos los datos normalizados, los separaremos en dos datasets distintos.
Un dataset lo usaremos para entrenar el modelo de kNN y el otro para validar el
modelo mediante una predicción de la clase y compararlo con la clase real.
Para empezar, definiremos una semilla aleatoria a fin de separar al azar los datasets.
Seguidamente crearemos un conjunto de entrenamiento con el 80% de la muestra,
dejando el 20% restante para validar los resultados:
set.seed(12345)
Reference
Prediction setosa versicolor virginica
setosa 10 0 0
versicolor 0 10 0
virginica 0 2 8
Overall Statistics
Accuracy : 0.9333
95% CI : (0.7793, 0.9918)
No Information Rate : 0.4
P-Value [Acc > NIR] : 1.181e-09
Kappa : 0.9
Statistics by Class: