library(RWeka)
Debido a que uno de los puntos fuertes de los algoritmos de aprendizaje de reglas es el hecho de que generan reglas fáciles de entender, parecen ser un modelo apropiado para la tarea de clasificación de setas venenosas. Sin embargo, las reglas solo serán útiles si son precisas.
Descargamos y factorizamos el dataset.
archivo = "https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/mushrooms.csv"
file <- download.file(archivo, destfile = "mushrooms.csv")
data <- read.csv("mushrooms.csv", stringsAsFactors = T)
En primer lugar, tenemos la variable veil_type como factor de un solo nivel. Esto puede ser debido a un error de codificación. En cualquier caso, al solamente tener un nivel, no va a proporcionar información adicional a la hora de clasificar, por lo cual vamos a retirar esta variable del dataset.
data <- data[,-17]
Por otro lado, las setas venenosas y no venenosas se distribuyen de la siguiente manera:
prop.table(table(data$type))
##
## e p
## 0.5179714 0.4820286
Aproximadamente son la mitad edible (comestible) y poisonous (venenosa).
Para los propósitos de este experimento, consideraremos que las 8.214 muestras en los datos de setas son un conjunto exhaustivo de todos los posibles. Esta es una suposición importante, porque significa que no necesitamos guardar algunas muestras para test. No estamos tratando de desarrollar reglas que cubran tipos de setas imprevistas; simplemente estamos tratando de encontrar reglas que representen con precisión el conjunto completo de tipos de setas conocidas. Por lo tanto, podemos construir y probar el modelo con los mismos datos.
Utilizaremos el clasificador 1R
classifier <- OneR(type ~ ., data = data)
classifier
## odor:
## a -> e
## c -> p
## f -> p
## l -> e
## m -> p
## n -> e
## p -> p
## s -> p
## y -> p
## (8004/8124 instances correct)
Podemos ver que el olor es la variable seleccionada para la generación de reglas. Por ejemplo, si el hongo huele a pescado, asqueroso, mohoso, o picante, es probable que el hongo sea venenoso. Por otro lado, los hongos con olores más agradables como almendras y anís, y aquellos que no tienen ningún olor, se predice que serán comestibles. Estas reglas podrían resumirse en una simple regla general: “si el hongo huele poco apetitoso, es probable que sea venenoso”.
Si hacemos un sumario del rendimiento del modelo, podemos comprobar que parece bastante eficiente (un 98% de muestras bien clasificadas). Sin embargo, todos los errores son falsos negativos. En un 2% de las ocasiones estamos clasificando como comestible una seta que en realidad es venenosa, lo cual no es muy recomendable para la salud. Intentaremos añadir más reglas para ver si podemos clasificar mejor.
Para ello utilizaremos el algoritmo JRip
classifier2 <- JRip(type ~ ., data = data)
classifier2
## JRIP rules:
## ===========
##
## (odor = f) => type=p (2160.0/0.0)
## (gill_size = n) and (gill_color = b) => type=p (1152.0/0.0)
## (gill_size = n) and (odor = p) => type=p (256.0/0.0)
## (odor = c) => type=p (192.0/0.0)
## (spore_print_color = r) => type=p (72.0/0.0)
## (stalk_surface_below_ring = y) and (stalk_surface_above_ring = k) => type=p (68.0/0.0)
## (habitat = l) and (cap_color = w) => type=p (8.0/0.0)
## (stalk_color_above_ring = y) => type=p (8.0/0.0)
## => type=e (4208.0/0.0)
##
## Number of Rules : 9
Este algoritmo ha generado 9 reglas de clasificación. Saquemos datos del sumario
summary(classifier2)
##
## === Summary ===
##
## Correctly Classified Instances 8124 100 %
## Incorrectly Classified Instances 0 0 %
## Kappa statistic 1
## Mean absolute error 0
## Root mean squared error 0
## Relative absolute error 0 %
## Root relative squared error 0 %
## Total Number of Instances 8124
##
## === Confusion Matrix ===
##
## a b <-- classified as
## 4208 0 | a = e
## 0 3916 | b = p
Ha clasificado correctamente utilizando 8 reglas para catalogar todos los hongos venenosos. La octava y última regla engloba el resto, es decir, los comestibles.