KNN es un algoritmo de aprendizaje supervisado que puede usarse tanto para clasificación como para regresión. La idea principal detrás de KNN es simple: para predecir la salida para un nuevo dato, el algoritmo busca en los datos de entrenamiento los K vecinos más cercanos a este nuevo dato.
La predicción se hace entonces por mayoría de votos (clasificación) o promedio (regresión) de los K vecinos más cercanos, donde K es un hiperparámetro a optimizar.
La “cercanía” se mide comúnmente mediante la distancia euclídea, aunque se pueden usar otras métricas de distancia. La fórmula de la distancia euclídea entre dos puntos, p y q, en un espacio n-dimensional es:
Determinación de k: Elegir el número correcto de vecinos es crucial y puede ser difícil. Un valor muy bajo puede hacer que el modelo sea muy sensible al ruido en los datos, mientras que un valor muy alto puede hacer que sea demasiado general. No hay una regla fija para elegir k. Es un hiperparámetro a configurar.
Comparación con Otros Modelos
Frente a CART y RandomForest: Estos modelos pueden manejar mejor las variables categóricas y son más interpretables. RandomForest, además, es menos sensible a las variables irrelevantes.
Frente a modelos de regresión lineal: KNN puede capturar relaciones no lineales sin necesidad de especificar la forma de esta relación, mientras que los modelos lineales se limitan a relaciones lineales pero son más fáciles de interpretar y más rápidos computacionalmente.
KNN se adapta bien a muchos problemas de regresión, especialmente cuando se entiende y se maneja adecuadamente el preprocesamiento de los datos.
Paquetes y opciones en R
Existe una gran diversidad de paquetes donde se puede encontrar alguna función que implemente el algoritmo. En estos ejemplos trataremos con el paquete kknn, y en posteriores temas trabajaremos con librerías genéricas de ML que permiten aplicar diversas técnicas, como caret o tidymodels
kknnResult <-kknn(emergent_country ~ ., train = corruption, test = corruption, k =9, distance =1, kernel ="optimal")
Code
predictions <-fitted(kknnResult)predictions
[1] yes no no no yes no no yes yes yes yes no yes no no yes no yes yes
[20] no no yes no yes yes yes yes yes no no no yes yes yes yes yes yes yes
[39] yes no yes yes no no yes yes yes yes yes no no yes
Levels: no yes
Code
response <- corruption$emergent_country
Code
probabilidades <-predict(kknnResult, corruption, corruption, type ="prob")probabilidades <- probabilidades[,2]
Code
ROC <-roc((response =="yes"), probabilidades)
Setting levels: control = FALSE, case = TRUE
Setting direction: controls < cases
Code
plot(ROC, col ="blue")
Code
auc(ROC)
Area under the curve: 0.977
# Matriz de confusión manual:outcomes <-table(1*(response =="yes"), round(probabilidades))outcomes
Trata de encontrar el mejor valor de k entre 5 y 18. Ten en cuenta que es un ejercicio didáctico, ya que los datasets son pequeños y además los modelos se se entrenan con todo el dataset, por lo que están sujetos a sobreajuste.