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.