Divide and conquer(II) : classification rules

Classification rules representa conocimiento en forma de afirmaciones sencillas de si y no, de forma de poder asignarle una clase a ejemplos que no tienen una clasificacion (todavia).

Rule learners son usados de forma similar a los arboles de desicion, de la misma forma que los arboles de desicion permiten ver como se estan estableciendo las reglas que dan lugar a la clasificacion.

1R algorithm

La interpretacion de este algoritmo es: algoritmo de una sola regla y es eso: dado un conjunto de elementos de los cuales queremos determinar cuantos son blancos, creamos la regla: es blanco? y clasificamos uno a uno los objetos.

Vamos a obtener como resultado n-objetos blancos, lo cual no considera por ejemplo, que si no es blanco y tal vez es negro, o tal vez es amarillo. Aun asi, con toda su excesiva simplificacion da buenos resultados para tareas muy sencillas y al mismo tiempo es excelente con fines de aprendizaje.

Ripper algorithm

Una vez superado y entendido el 1R Algorithm, se busco la forma de implementar un algoritmo que pudiera manejar un conjunto de reglas y que superara la performance obtenida con desicion tree. Con la creacion del algoritmo RIPPER se lograron dichos objetivos: supero la performance que se obtiene con desicion trees y al mismo se obtiene modelo ligeramente mas acotado de reglas lo cual facilita la tarea de interpretar la logica de las mismas.

Un punto a tener en claro es que a medida que el conjunto de reglas crece, tambien se dificulta la interpretacion humana del modelo de reglas resultantes.

Weka

El paquete Weka es una colección de algoritmos de aprendizaje automático para tareas de minería de datos escritas en Java, que contiene herramientas para el preprocesamiento de datos, clasificación, regresión, agrupamiento, reglas de asociación y visualización. Su implementacion RWeka permite ejecutar dichos algoritmos en R.

Caso practico: Identificar hongos venenosos con rule learners

La clasificacion de hongos venenosos puede realizarse a traves de un set de reglas que permitan determinar si un hongo es venenoso o no.

Nuestro dataset va a abarcar a todos los hongos que existen, y nos va a brindar caracteristicas que permitan determinar si el hongo es venenoso. De acuerdo a la performance obtenida luego de un primer intento, se analizara si es necesario mejorar la performance del modelo, y de ser asi como se realizara.

Implementacion tecnica

Instalacion de librerias

La utilizacion del paquete RWeka, junto con su correspondiente instalacion que puede presentar algunos desafios ya que requiere la ultima version de Java 8.

El paso a paso que me sirvio para instalar el paquete fue:

    1. Instalacion de la ultima version de Java 8.
    2. En R Studio
install.packages("rJava", type = "source")
install.packages("RWeka", type = "source")
library(RWeka)

Implementacion de OneR

library(RWeka)

# Step 1: Get the data
f <-file("https://archive.ics.uci.edu/ml/machine-learning-databases/mushroom/agaricus-lepiota.data", open="r")
mushroom <- read.table(f, sep=",", header=F)
str(mushroom)

# Step 2: Exploring and preparing the data
table(mushroom$V11)
# e    t 
# 3516 4608 

# Step 3: Training a model on the data
mushroom_1R <- OneR(V11 ~ ., data = mushroom)
# (6132/8124 instances correct)

# Step 4: Evaluating model performance 
summary(mushroom_1R)
 
# === Summary ===
#   
# Correctly Classified Instances                    6132               75.4801 %
# Incorrectly Classified Instances                  1992               24.5199 %
# Kappa statistic                          0.4994
# Mean absolute error                      0.2452
# Root mean squared error                  0.4952
# Relative absolute error                 49.942  %
# Root relative squared error             99.9422 %
# Total Number of Instances                         8124     
# 
# === Confusion Matrix ===
#   
#   a    b   <-- classified as
# 2484 1032 |    a = e
# 960  3648 |    b = t

Conclusiones

La performance del modelo fue terrible, si consideramos que solo identifico en forma exitosa el 75%, y aun peor es que los casos en los cuales el fracaso es mas graves son los 960 que identifico como edibles (apto para ser consumidos), y son venenosos.

Implementacion de JRip

Luego de la performance obtenida cambiamos de rule learner a JRip.

# Step 5 – improving model performance
mushroom_JRip <- JRip(V11 ~ ., data = mushroom)

# Step 6: Evaluating improving model performance
# summary(mushroom_JRip)
# === 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
# 3516    0     |    a = e
# 0       4608  |    b = t 

Conclusiones

La performance del modelo mejoro notablemente: se identificaron todos los casos sin ningun tipo de error. En este caso (super sencillo) la clave fue cambiar el rule learner.

Bibliografia

Machine Learning with R by Brett Lantz