Se desea determinar si una masa en la mama es un tumor benigno o maligno, a partir de las medidas obtenidas de imágenes digitalizadas de la aspiración de una masa mamaria con una aguja fina. Los valores representan las características de los núcleos celulares presentes en la imagen digital.
Se tiene una muestra de 569 ejemplos de resultados de las biopsias. Cada registro contiene 32 variables, las cuales corresponden a tres medidas (media, desviación estándar, peor caso) de diez características diferentes (radius, texture, ...).
En términos de los datos, se desea pronosticar si una masa es benigna o maligna (clase B o M) a partir de las 30 variables.
Fuente de los datos: https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic)
In [2]:
# carga de los datos
mushrooms <- read.csv("data/mushrooms.csv", stringsAsFactors = TRUE)
In [2]:
# verificación de los datos cargados
str(wbcd)
In [3]:
# esta variable contiene un único valor y se elimina
mushrooms$veil_type <- NULL
In [3]:
# cantidad de casos para cada diagnóstico (e-edible, p-poisonous)
table(mushrooms$type)
El problema en términos matemáticos se define de la siguiente forma.
El método k-NN asígna una clase (de las $P$ posibles) al nuevo ejemplo en dos pasos. En el primer paso, determina los $k$ ejemplos más cercanos (distancia) al nuevo ejemplo; en el segundo paso, asigna la clase al nuevo punto por mayoría; es decir, asigna la clase con mayor frecuencia entre los $k$ vecinos más cercnos. Por ejemplo, si se consideran 7 vecinos, de los cuales 5 son "benignos" (y 2 "malignos") entonces el nuevo punto es clasificado como "benigno".
La distancia entre dos puntos $p$ y $q$ es:
$$dist(p, q) = \sqrt{\sum_{i=1}^N (p_i - q_i)^2}$$Ejercicio. ¿Cómo se implementa computacionalmente este algoritmo?
Ya que la escala de las variables numéricas afecta la medición, se pueden realizar dos transformaciones:
Normalización min-max.
$$z_j = \frac{x - \text{min}(x_j)}{\text{max}(x_j) - \text{min}(x_j)}$$Estandarización z.
$$z_j = \frac{x - \text{mean}(x_j)}{\text{std}(x_j) }$$Para variables nominales que representan $S$ categorías se crean $S-1$ variables: la primera variable vale 1 si la variable nominal toma el valor de la primera categoría; la segunda variable vale 2 si la variable nominal toma el valor de la segunda categoría, y así sucesivamente. ¿Por qué se requieren $S-1$ variables para $S$ categorías de la variable nominal?.
In [ ]:
In [5]:
# carga la librería
# install.packages("RWeka")
library(RWeka)
mushroom_1R <- OneR(type ~ ., data = mushrooms)
mushroom_1R
In [ ]:
summary(mushroom_1R)
In [ ]:
# RIPPER
mushroom_JRip <- JRip(type ~ ., data = mushrooms)
mushroom_JRip
In [ ]:
In [ ]: