K-Nearest-Neighbor

Héctor Leal, Luis Marín, José Orozco, Aldo Mendívil

1/4/2022

K-Nearest-Neighbor

El algoritmo K-NN es uno de los métodos más importantes de clasificación supervisada. En el proceso de aprendizaje no se hace ninguna suposición acerca de la distribución de las variables predictoras, es por ello que es un método de clasificación no paramétrico, que estima el valor de la función de densidad de probabilidad o directamente la probabilidad posterior de que un elemento x pertenezca a la clase a partir de la información proporcionada por el conjunto de entrenamiento.

Es un método bastante sencillo y robusto que simplemente busca en las observaciones más cercanas a la que se está tratando de predecir y clasifica el punto de interés basado en la mayoría de los datos que le rodean.

Desarollo

Paquetes

A continuacion se muestran los paquetes a utilizar

library(pacman)
p_load("ISLR","class", "ggplot2", "xfun", "cluster","datasets","DT","fdth")

El conjunto de datos iris sera utilizado para la realización de este ejericio:

data(iris)
dim(iris)
## [1] 150   5

La dimension total de los datos es de 150 registros dividios en 5 columnas principales, como se muestra a continuación:

datatable(iris)

Representacion grafica

Para una mejor visualización de los datos y la clasificación de estos por setosa, versicolor y virginica, se representan en la siguiente grafica, ordenados en su respectivos grupos y por colores(Rojo, verde y azul).

data(iris) 
qplot(Petal.Length, Petal.Width, data = iris, color = Species, xlab =  "Largo del petalo", ylab = "Ancho de petalo")

## Datos

Para un mejor desarrollo del ejemplo sera necesaria la normalizacion de los datos a trabajar, la normalización consiste en crear una función que transforme los datos de las dimensiones en una escala que se calcula del cociente del valor en cuestión menos el valor mínimo de la lista entre el rango de la lista.

datos <- iris
nor <-function(x) {(x -min(x))/(max(x)-min(x))}
datos_norm <- as.data.frame(lapply(datos[,c(1,2,3,4)], nor))
datos_norm <- cbind(datos_norm, datos[,5])
head(datos_norm)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width datos[, 5]
## 1   0.22222222   0.6250000   0.06779661  0.04166667     setosa
## 2   0.16666667   0.4166667   0.06779661  0.04166667     setosa
## 3   0.11111111   0.5000000   0.05084746  0.04166667     setosa
## 4   0.08333333   0.4583333   0.08474576  0.04166667     setosa
## 5   0.19444444   0.6666667   0.06779661  0.04166667     setosa
## 6   0.30555556   0.7916667   0.11864407  0.12500000     setosa

Al tratarse de un modelo supervisado, es necesario primero realizar un entrenamiento con una parte de los datos normalizados “datos_norm”. Se tomara el 70% como una muestra para “entrenar” el modelo y el 30% restante para probar el modelo.

id_muestra <- sample(1:nrow(datos_norm), 0.7*nrow(datos_norm))
modelo_knn_train <- datos_norm[id_muestra, -5]
modelo_knn_test <- datos_norm[-id_muestra, -5]

Modelo KNN de entrenamiento

head(modelo_knn_train) ## Sin embargo recuerden que el test tiene 105 datos
##     Sepal.Length Sepal.Width Petal.Length Petal.Width
## 126    0.8055556   0.5000000    0.8474576  0.70833333
## 68     0.4166667   0.2916667    0.5254237  0.37500000
## 30     0.1111111   0.5000000    0.1016949  0.04166667
## 102    0.4166667   0.2916667    0.6949153  0.75000000
## 150    0.4444444   0.4166667    0.6949153  0.70833333
## 129    0.5833333   0.3333333    0.7796610  0.83333333

Modelo knn de entrenamiento

head(modelo_knn_test) ## Sin embargo recuerden que el test tiene 45 datos
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1   0.22222222   0.6250000   0.06779661  0.04166667
## 2   0.16666667   0.4166667   0.06779661  0.04166667
## 4   0.08333333   0.4583333   0.08474576  0.04166667
## 6   0.30555556   0.7916667   0.11864407  0.12500000
## 7   0.08333333   0.5833333   0.06779661  0.08333333
## 8   0.19444444   0.5833333   0.08474576  0.04166667

Implementación del modelo

*Seleccionar el número K de los vecinos

Para determinar un número k de los vecinos se realizara calculando la raiz cuadrada de los datos totales de modelo_knn_train(Datos de entrenamiento) y modelo_knn_test(Datos de prueba), los cuales contienen 105 y 45 datos respectivamente.

train_df <- datos_norm[id_muestra, 5]
test_df <- datos_norm[-id_muestra, 5]

El calculo de las raices cuadradas se realizara mediante las siguientes funciones:

k_1 <- floor(sqrt(nrow(modelo_knn_train)))
k_1
## [1] 10
k_2 <- ceiling(sqrt(nrow(modelo_knn_test)))
k_2
## [1] 7

Corrida del modelo

Para la realización del algoritmo KNN sera realizado mediante los datos de entrenamiento y de prueba, por ende se correra la función knn de la librería “class” con la siguiente configuración:

Datos para entrenar: modelo_knn_train Datos para probar: modelo_knn_test k = coeficientes k_1 o k_2 cl = datos de salida train_df

Predicción de especies con un valor de k = k_1

knn.A <- knn(modelo_knn_train, modelo_knn_test, cl=train_df, k=k_1)
knn.A
##  [1] setosa     setosa     setosa     setosa     setosa     setosa    
##  [7] setosa     setosa     setosa     setosa     setosa     setosa    
## [13] setosa     setosa     setosa     setosa     setosa     setosa    
## [19] setosa     setosa     setosa     versicolor versicolor versicolor
## [25] versicolor versicolor versicolor versicolor versicolor virginica 
## [31] virginica  virginica  virginica  versicolor virginica  virginica 
## [37] virginica  versicolor virginica  virginica  virginica  virginica 
## [43] virginica  virginica  virginica 
## Levels: setosa versicolor virginica

Predicción de especies con un valor de k = k_2

knn.B <- knn(modelo_knn_train, modelo_knn_test, cl=train_df, k=k_2)
knn.B
##  [1] setosa     setosa     setosa     setosa     setosa     setosa    
##  [7] setosa     setosa     setosa     setosa     setosa     setosa    
## [13] setosa     setosa     setosa     setosa     setosa     setosa    
## [19] setosa     setosa     setosa     versicolor versicolor versicolor
## [25] versicolor versicolor versicolor versicolor versicolor virginica 
## [31] virginica  virginica  virginica  versicolor virginica  virginica 
## [37] virginica  versicolor virginica  virginica  virginica  virginica 
## [43] virginica  virginica  virginica 
## Levels: setosa versicolor virginica

Evaluación de la prediccion del modelo

El modelo se probara con los datos de “iris”, generando una matriz de para evaluar la efectividad del modelo y si este puede predecir la especie en función de los parámetros.

matriz_A <- table(knn.A, test_df)
matriz_A
##             test_df
## knn.A        setosa versicolor virginica
##   setosa         21          0         0
##   versicolor      0          8         2
##   virginica       0          0        14
matriz_B <- table(knn.B, test_df)
matriz_B
##             test_df
## knn.B        setosa versicolor virginica
##   setosa         21          0         0
##   versicolor      0          8         2
##   virginica       0          0        14

La tasa de los errores de clasificación se calcula dividiendo los valores predichos entre los valores reales de las matrices.

Precisión del modelo A(Datos de entrenamiento)

real <- table(test_df,test_df)
precision_knn.A <- sum(diag(matriz_A))/sum(diag(real))
precision_knn.A
## [1] 0.9555556

Precisión del modelo B(Datos de prueba)

precision_knn.B <- sum(diag(matriz_B))/sum(diag(real))
precision_knn.B
## [1] 0.9555556

Conslusión

El algoritmo de k-Nearest Neighbor, evalúa los k vecinos más cercanos con el fin de clasificar los puntos y al ser un algoritmo supervisado debemos contar con suficientes muestras con el fin de esperar mejores resultados.

Descargas

xfun::embed_file("Equipo6KNN.Rmd")

Download Equipo6KNN.Rmd