KNN algorithm
Dime con quien andas y te dire quien eres
KNN algorithm
Definicion
El algoritmo KNN es un algoritmo simple que almacena todos los casos disponibles y clasifica nuevos casos según una medida de similitud (por ejemplo, funciones de distancia).
En este caso vamos a aplicar k-NN classification, donde nuestro output es poder clasificar a un objeto dentro de una clase.
Como funciona
Un objeto se clasifica por la mayoría de votos de sus vecinos, entonces el objeto se asigna a la clase más común entre sus k vecinos más cercanos (k es un número entero positivo, típicamente pequeño). Si k = 1, entonces el objeto simplemente se asigna a la clase de ese vecino más cercano. Si k = 3, y se asigna a la clase a la que corresponda al menos 2 de sus vecinos mas cercanos.
Que significa el valor k
Cantidad de vecinos a los que debe estar cercano para poder asignar una clase. Por default, el valor es 5.
Que quiere decir que es “Lazy algorithm”
K-NN no genera un modelo fruto del aprendizaje con datos de entrenamiento, sino que el aprendizaje sucede en el mismo momento en el que se prueban los datos de test.
Paso a paso como usar el KNN algorithm
-
- Leer el dataset
- Eliminar la variable de ID:
– No proporciona información útil
– Aumenta el riesgo de overfitting. - La variable objetivo se convierte en factor:
– Muchos clasificadores ML requieren que la característica de destino se exprese como un factor - Se establece la misma escala para todas las variables:
– Dado que estamos trabajando con problemas de distancia, es deseable que todas las variables tengan la misma escala de forma de facilitar las mediciones. - Separar los datos en datos de prueba y de entrenamiento
– Divide los datos en pruebas y entrena (solo variables numéricas)
– Divida las etiquetas de datos en pruebas y entrene (solo función de destino) - Ejecutar el algoritmo KNN
– knn (train = m_train, test = v_test, class = cl_test_label, k) - Evaluar cuan certera fue la clasificacion realizada utilizando Crosstable
Validacion
Como ya hemos visto en el paso previo se utiliza una “matching matrix” para validar cuan certera es la clasificacion realizada por el algoritmo k-NN.
Implementacion tecnica
En pos de realizar la implementacion tecnica y posterior analisis, se tomo como ejemplo el capitulo 3 del libro Machine Learning with R – Second Edition
Caso: Cancer detection
Objetivo
Dado un dataset con resultados de analisis, se requiere determinar si una muestra tiene o no tiene cancer. El codigo completo puede consultar mi cuenta de Github.
Paso a paso
## Step 1. Get the data
url_data <- "https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/wisc_bc_data.csv"
wbcd <- read_csv(url(url_data))
## Step 2: Exploring and preparing the databcd <- wbcd[-1]
## Explore the target variable converted to factor
table(wbcd$diagnosis)
## Convert the target variable to factor
wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"),
labels = c("Benign", "Malignant"))
## Apply scaling on numeric features
summary(wbcd[c("radius_mean", "area_mean", "smoothness_mean")])
## create normalization function
normalize <- function(x) {
return ((x - min(x)) / (max(x) - min(x)))
}
## normalize the wbcd data using a new vector to work on it
wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))
## confirm that normalization worked
summary(wbcd_n$area_mean)
## Apply scaling on numeric features
# create training and test data
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]
# create labels for training and test data
wbcd_train_labels <- wbcd[1:469, 1]
wbcd_test_labels <- wbcd[470:569, 1]
## Step 3: Training a model on the data
library(class)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test,
cl = wbcd_train_labels, k=21)
## Step 4: Evaluating model performance
# Create the cross tabulation of predicted vs. actual
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred,
prop.chisq=FALSE)
Conclusiones
La performance del modelo puede mejorarse.
## A. Trying to improve model performance ----
# use the scale() function to z-score standardize a data frame
wbcd_z <- as.data.frame(scale(wbcd[-1]))
# confirm that the transformation was applied correctly
summary(wbcd_z$area_mean)
# create training and test datasets
wbcd_train <- wbcd_z[1:469, ]
wbcd_test <- wbcd_z[470:569, ]
# re-classify test cases
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test,
cl = wbcd_train_labels, k=21)
# Create the cross tabulation of predicted vs. actual
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred,
prop.chisq=FALSE)
# B. try several different values of k
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=1)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=5)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=11)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=15)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=27)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)