Modelos de aprendizaje Supervizado

Erik Rodríguez Pacheco

cr.linkedin.com/in/erikrodriguezp/

Método de los K-Vecinos más cercanos

Es un método no paramétrico usado para clasificación y regresión, la idea básica es que un nuevo caso se va a clasificar según la clase que tengan sus K - Vecinos más cercanos. Es un concepto simple , intuitivo y fácil de implementar por eso es un método de uso común.

Para ejemplificar su uso vamos a usar un data set que se encuentra en R y que resulta muy apropiado para ver el funcionamiento de modelos de clasificación en general, el dataset Iris

1- Definimos el data set para trabajar, acá podriamos importar un archivo csv, o un archivo de excel o bien conectarnos por odbc a una base de datos.

datos<-iris
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

2- Mediante un muestreo aleatorio definimos una tabla de aprendizaje para el modelo y una tabla de pruebas para verificar su calidad predictiva

muestra <- sample(1:150, 50)
testing <- datos[muestra, ]
aprendizaje <- datos[-muestra, ]
dim(testing)[1]
## [1] 50
dim(aprendizaje)[1]
## [1] 100

3- Construimos el modelo alimentandolo con los datos de aprendizaje, se le indica el valor máximo de K que el modelo puede usar y él determina el óptimo. (Es importante aclarar que el modelo deberia ser calibrado para obtener el mejor resultado, este se corre con las opciones por defecto)

suppressWarnings(suppressMessages(library(kknn)))
modelo <- train.kknn(Species ~ ., data = aprendizaje, kmax = 9)
modelo
## 
## Call:
## train.kknn(formula = Species ~ ., data = aprendizaje, kmax = 9)
## 
## Type of response variable: nominal
## Minimal misclassification: 0.06
## Best kernel: optimal
## Best k: 5

4- Se ejecuta una predicción con el modelo que acabamos de construir sobre los datos de prueba, esto para determinar cuantas veces acierta en la predicción

pred <- predict(modelo, testing[, -5])
pred
##  [1] virginica  setosa     virginica  versicolor virginica  setosa    
##  [7] virginica  setosa     versicolor versicolor versicolor virginica 
## [13] virginica  setosa     setosa     setosa     versicolor virginica 
## [19] virginica  setosa     virginica  virginica  virginica  versicolor
## [25] virginica  setosa     setosa     setosa     setosa     versicolor
## [31] setosa     setosa     setosa     versicolor virginica  versicolor
## [37] versicolor setosa     versicolor virginica  versicolor versicolor
## [43] virginica  versicolor versicolor versicolor setosa     virginica 
## [49] setosa     setosa    
## Levels: setosa versicolor virginica

5- Para empezar a analizar la calidad del modelo podemos construir una matriz de confusión. Cada columna de la matriz representa el número de predicciones de cada clase, mientras que cada fila representa a las instancias en la clase real. Uno de los beneficios de las matrices de confusión es que facilitan ver si el sistema está confundiendo dos clases.

CM <- table(testing[, 5], pred)
CM
##             pred
##              setosa versicolor virginica
##   setosa         18          0         0
##   versicolor      0         14         0
##   virginica       0          2        16

Como se puede observar, el modelo lo ha hecho bastante bien, únicamenta falla en una virginica que clasificó como versicolor, cabe resaltar que entre más grande sea la diagonal mejor es el modelo.

precisión <- (sum(diag(CM)))/sum(CM)
precisión
## [1] 0.96

Vemos que el modelo tiene una precisión global alta, sin embargo, en sí mismo este indicador no es suficiente para validar la utilidad de un modelo, es necesario calcular otros indices como la precisión positiva, negativa, falsos positivos y falsos negativos.

Dado que el ejemplo que estamos usando es no es bidimensional, podríamos correrlo en dos dimensiones para hacerlo, si graficamos el modelo que acabos de hacer nos brinda un gráfico con información sobre la calidad de la clasificación en función del número de vecinos.

plot(modelo)

plot of chunk unnamed-chunk-7