Introducción

El presente trabajo, constituye un análisis de datos usando algunas de las técnicas de machine learning vistas en el curso intersemestral de la materia Arquitecturas de sistemas inteligentes. La elección del dataset para este trabajo fue hecha, tomando como base, la página https://www.kaggle.com/ y tomando un tema que pensé era interesante, pues tiene que ver con el mundo silvestre que con alguna frecuencia me gustaría disfrutar. Tiene que ver con una un catálogo de hongos silvestres Norteamericanos, dentro de los cuales hay algunos comestibles y otros venenosos. Se hizo la medición de una gran cantidad de parámetros físicos de dichos hongos (23 características) y se catalogó si eran comestibles o venenosos.Esta información se tabuló en un archivo con formato csv. Cada característica o atributo se representó con una letra. El significado de cada letra se encuentra 4 párrafos mas abajo del presente.

Dentro del reto que kaggle propone para quien practica con este dataset, es poder descifrar si un cierto hongo que nos encontremos en nuestro camino, es comestible o venenoso. La tarea es entonces bastante importante, pues de una correcta predicción, depende la supervivencia de un ser humano cuando se vea enfrentado a una situación en la que su alimentación pueda depender de este elemento.

Contexto

Aunque este conjunto de datos fue originalmente contribuido al repositorio de Aprendizaje de la Máquina de UCI hace casi 30 años, la caza de hongos (conocido como “shrooming”) está disfrutando de nuevos picos de popularidad. Aprenda cuáles características deletrean la muerte segura y cuáles son las más apetecibles en este conjunto de datos de características de hongos. ¿Y cuán seguro puede ser su modelo?

Contenido del Dataset

Este conjunto de datos incluye descripciones de muestras hipotéticas que corresponden a 23 especies de hongos de la familia Agaricus y Lepiota, extraídos de la Guía de Campo de la Sociedad Audubon de Hongos Norteamericanos (1981). Cada especie se identifica como definitivamente comestible, definitivamente venenosa, o de comestibilidad desconocida y no se recomienda. Esta última clase se combinó con la venenosa. La Guía establece claramente que no existe una regla simple para determinar la comestibilidad de un hongo; No hay regla como “folletos tres, que sea” para el roble venenoso y la hiedra.

Período de tiempo del Dataset: Donado a UCI ML 27 abril 1987

Inspiración

¿Qué tipos de modelos de aprendizaje automático funcionan mejor en este conjunto de datos? ¿Qué características son más indicativas de un hongo venenoso?

Expresiones de gratitud

Este conjunto de datos fue donado originalmente al repositorio UCI de Aprendizaje Automático.

https://www.kaggle.com/uciml/mushroom-classification

Información de los atributos:

(classes: edible=e, poisonous=p) cap-shape: bell=b,conical=c,convex=x,flat=f, knobbed=k,sunken=s cap-surface: fibrous=f,grooves=g,scaly=y,smooth=s cap-color: brown=n,buff=b,cinnamon=c,gray=g,green=r,pink=p,purple=u,red=e,white=w,yellow=y bruises: bruises=t,no=f odor: almond=a,anise=l,creosote=c,fishy=y,foul=f,musty=m,none=n,pungent=p,spicy=s gill-attachment: attached=a,descending=d,free=f,notched=n gill-spacing: close=c,crowded=w,distant=d gill-size: broad=b,narrow=n gill-color: black=k,brown=n,buff=b,chocolate=h,gray=g, green=r,orange=o,pink=p,purple=u,red=e,white=w,yellow=y stalk-shape: enlarging=e,tapering=t stalk-root: bulbous=b,club=c,cup=u,equal=e,rhizomorphs=z,rooted=r,missing=? stalk-surface-above-ring: fibrous=f,scaly=y,silky=k,smooth=s stalk-surface-below-ring: fibrous=f,scaly=y,silky=k,smooth=s stalk-color-above-ring: brown=n,buff=b,cinnamon=c,gray=g,orange=o,pink=p,red=e,white=w,yellow=y stalk-color-below-ring: brown=n,buff=b,cinnamon=c,gray=g,orange=o,pink=p,red=e,white=w,yellow=y veil-type: partial=p,universal=u veil-color: brown=n,orange=o,white=w,yellow=y ring-number: none=n,one=o,two=t ring-type: cobwebby=c,evanescent=e,flaring=f,large=l,none=n,pendant=p,sheathing=s,zone=z spore-print-color: black=k,brown=n,buff=b,chocolate=h,green=r,orange=o,purple=u,white=w,yellow=y population: abundant=a,clustered=c,numerous=n,scattered=s,several=v,solitary=y habitat: grasses=g,leaves=l,meadows=m,paths=p,urban=u,waste=w,woods=d

A continuación un breve resumen del set de datos, para entender como está compuesto:

## 'data.frame':    5644 obs. of  23 variables:
##  $ class                   : Factor w/ 2 levels "e","p": 2 1 1 2 1 1 1 1 2 1 ...
##  $ cap.shape               : Factor w/ 6 levels "b","c","f","k",..: 6 6 1 6 6 6 1 1 6 1 ...
##  $ cap.surface             : Factor w/ 4 levels "f","g","s","y": 3 3 3 4 3 4 3 4 4 3 ...
##  $ cap.color               : Factor w/ 8 levels "b","c","e","g",..: 5 8 7 7 4 8 7 7 7 8 ...
##  $ bruises                 : Factor w/ 2 levels "f","t": 2 2 2 2 1 2 2 2 2 2 ...
##  $ odor                    : Factor w/ 7 levels "a","c","f","l",..: 7 1 4 7 6 1 1 4 7 1 ...
##  $ gill.attachment         : Factor w/ 2 levels "a","f": 2 2 2 2 2 2 2 2 2 2 ...
##  $ gill.spacing            : Factor w/ 2 levels "c","w": 1 1 1 1 2 1 1 1 1 1 ...
##  $ gill.size               : Factor w/ 2 levels "b","n": 2 1 1 2 1 1 1 1 2 1 ...
##  $ gill.color              : Factor w/ 9 levels "g","h","k","n",..: 3 3 4 4 3 4 1 4 5 1 ...
##  $ stalk.shape             : Factor w/ 2 levels "e","t": 1 1 1 1 2 1 1 1 1 1 ...
##  $ stalk.root              : Factor w/ 4 levels "b","c","e","r": 3 2 2 3 3 2 2 2 3 2 ...
##  $ stalk.surface.above.ring: Factor w/ 4 levels "f","k","s","y": 3 3 3 3 3 3 3 3 3 3 ...
##  $ stalk.surface.below.ring: Factor w/ 4 levels "f","k","s","y": 3 3 3 3 3 3 3 3 3 3 ...
##  $ stalk.color.above.ring  : Factor w/ 7 levels "b","c","g","n",..: 6 6 6 6 6 6 6 6 6 6 ...
##  $ stalk.color.below.ring  : Factor w/ 7 levels "b","c","g","n",..: 6 6 6 6 6 6 6 6 6 6 ...
##  $ veil.type               : Factor w/ 1 level "p": 1 1 1 1 1 1 1 1 1 1 ...
##  $ veil.color              : Factor w/ 2 levels "w","y": 1 1 1 1 1 1 1 1 1 1 ...
##  $ ring.number             : Factor w/ 3 levels "n","o","t": 2 2 2 2 2 2 2 2 2 2 ...
##  $ ring.type               : Factor w/ 4 levels "e","l","n","p": 4 4 4 4 1 4 4 4 4 4 ...
##  $ spore.print.color       : Factor w/ 6 levels "h","k","n","r",..: 2 3 3 2 3 2 2 3 2 2 ...
##  $ population              : Factor w/ 6 levels "a","c","n","s",..: 4 3 3 4 1 3 3 4 5 4 ...
##  $ habitat                 : Factor w/ 6 levels "d","g","l","m",..: 6 2 4 6 2 2 4 4 2 4 ...

En la figura anterior se observan las 23 características o atributos que constituyen el dataset, con sus factores o cantidad de posibles valores. También se observan esos posibles valores, que para el caso son letras que representan valores para esas características.

Para entender de manera gráfica si el data set, presenta una cantidad de datos faltantes, se usa la siguiente gráfica:

## Loading required package: Amelia
## Warning: package 'Amelia' was built under R version 3.4.1
## Loading required package: Rcpp
## ## 
## ## Amelia II: Multiple Imputation
## ## (Version 1.7.4, built: 2015-12-05)
## ## Copyright (C) 2005-2017 James Honaker, Gary King and Matthew Blackwell
## ## Refer to http://gking.harvard.edu/amelia/ for more information
## ##

La característica que se quiere predecir, es la que tiene el nombre “class”. Dicha característica, tiene los siguientes posibles valores:

(classes: edible=e, poisonous=p)

Se puede observar numéricamente, la información que se graficó en la figura 1. Por ejemplo para la característica “class”, que es la que se quiere predecir, se observan los siguientes valores:

## 
##    e    p <NA> 
## 3488 2156    0

Para la característica “hábitat”, se tiene la siguiente información, la cual puede tomar los siguientes valores:

habitat: grasses=g,leaves=l,meadows=m,paths=p,urban=u,waste=w,woods=d

## 
##    d    g    l    m    p    u <NA> 
## 2492 1860   64  292  568  368    0

Donde: spore-print-color: black=k,brown=n,buff=b,chocolate=h,green=r,orange=o,purple=u,white=w,yellow=y

De igual forma, para la característica “spore-print-color”, o color de las esporas del hongo, se tienen las siguientes posibles valores y su distribución en el dataset:

## 
##    h    k    n    r    u    w <NA> 
## 1584 1872 1920   72   48  148    0

En donde, chocolate=h, black=k ,brown=n ,green=r, purple=u ,white=w

Para la característica del “olor” del hongo, se observa las siguientes posibilidades y distribución de valores:

## 
##    a    c    f    l    m    n    p <NA> 
##  400  192 1584  400   36 2776  256    0

En donde: almond=a ,creosote=c ,foul=f ,anise=l ,musty=m ,none=n, ,pungent=p

La “población” en donde fue tomado el hongo, tiene la siguiente distribución de datos y sus nombres:

## 
##    a    c    n    s    v    y <NA> 
##  384   52  256 1104 2160 1688    0

En donde: abundant=a,clustered=c,numerous=n,scattered=s,several=v,solitary=y

Ahora, en la siguiente figura, se puede observar la distribución gráfica de los hongos, en el dataset, en su característica si son comestibles o venenosos:

El tipo de hábitat de los hongos del dataset, se ve graficado de acuerdo a la cantidad de cada uno de ellos en su correspondiente hábitat:

La característica del color de las esporas de todos los hongos del dataset, se observa representada a continuación:

El olor de los hongos del dataset, se ve representado a continuación:

Como lo que se quiere es conocer si el hongo es comestible o venenoso, ahora se presentan las características tomadas anteriormente, para ver que tantos hongos son comestibles o venenosos, de acuerdo a su olor:

En donde: Almendra = a, creosota = c, foul = f, anís = l, moho = m, ninguno = n, picante = p

En la figura anterior, se puede ver que el olor es un aspecto importante en la determinación de si un hongo es venenoso o comestible.

Ahora se verá la característica de color de las esporas en la determinación de si es comestible o venenoso:

En donde: Chocolate = h, negro = k, marrón = n, verde = r, púrpura = u, blanco = w

La figura anterior indica que por ejemplo, si las esporas son color chocolate, el hongo es venenoso con gran probabilidad de certeza. Por lo tanto es otra buena característica de clasificación.

A continuación se observa la clasificación de si el hongo es venenoso o comestible, de acuerdo a el hábitat donde se localizó:

En donde: Bosques = d, hierbas = g, hojas = l, prados = m, caminos = p, urbano = u

La siguiente figura, muestra si el hongo es venenoso o comestible, de cuerdo a la población donde fué encontrado:

En donde: Abundante = a, agrupado = c, numeroso = n, disperso = s, varios = v, solitario = y

A continuación se representa la característica de la distancia de las “branquias” del hongo, en la determinación de su característica comestible o venenoso.

Primero, se construye una función split con tres parámetros de entrada: data, p, y s. El parámetro data significa el conjunto de datos de entrada, el parámetro p representa la proporción del subconjunto datos de entrada y el parámetro s significa la semilla aleatoria

Ahora se aplicará la técnica de clasificación usando un árbol de clasificación. Primero se dividen los datos de forma que se toma el 70% de los mismos para entrenamiento y el 30% restante será para pruebas:

Se genera entonces un árbol de clasificación, tomando todas las características del dataset, para observar cuales son los parámetros mas determinantes a la hora de conocer si un hongo es comestible o venenoso:

## Loading required package: party
## Loading required package: grid
## Loading required package: mvtnorm
## Loading required package: modeltools
## Loading required package: stats4
## Loading required package: strucchange
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: sandwich
## 
##   Conditional inference tree with 5 terminal nodes
## 
## Response:  class 
## Inputs:  cap.shape, cap.surface, cap.color, bruises, odor, gill.attachment, gill.spacing, gill.size, gill.color, stalk.shape, stalk.root, stalk.surface.above.ring, stalk.surface.below.ring, stalk.color.above.ring, stalk.color.below.ring, veil.type, veil.color, ring.number, ring.type, spore.print.color, population, habitat 
## Number of observations:  3950 
## 
## 1) odor == {c, f, m, p}; criterion = 1, statistic = 3694.768
##   2)*  weights = 1446 
## 1) odor == {a, l, n}
##   3) spore.print.color == {r}; criterion = 1, statistic = 2205.798
##     4)*  weights = 54 
##   3) spore.print.color == {k, n, u, w}
##     5) population == {c, n}; criterion = 1, statistic = 2449
##       6) habitat == {g, m}; criterion = 1, statistic = 183
##         7)*  weights = 176 
##       6) habitat == {l}
##         8)*  weights = 8 
##     5) population == {a, s, v, y}
##       9)*  weights = 2266

Este árbol de clasificación se representa de forma gráfica para conocer de una manera mas amigable, la clasificación realizada con la técnica del árbol.

## Loading required package: e1071
## Warning: package 'e1071' was built under R version 3.4.1

El árbol de inferencia anterior, muestra como pueden catalogarse los hongos comestibles y venenosos de acuerdo a sus características. Las características suficientes para la determinación son:

  Olor:                   Almendra = a, creosota = c, foul = f, anís = l, moho = m, ninguno = n, picante = p
  Color de las esporas:   Chocolate = h, negro = k, marrón = n, verde = r, púrpura = u, blanco = w
  Población:              Abundante = a, agrupado = c, numeroso = n, disperso = s, varios = v, solitario = y
  hábitat:                Bosques = d, hierbas = g, hojas = l, prados = m, caminos = p, urbano = u
  1. Olor {c, f, m, p}; Es venenoso 100% Olor {a, l, n} Se debe aun evaluar el color de las esporas
  2. Color de esporas {r}; Es venenoso 100% Color de esporas {k, n, u, w} Se debe evaluar la población de la que proviene
    1. Población {a, s, v, y} es comestible 100% Población {c, n}; Se debe evaluar el hábitat del que proviene
    2. hábitat {g, m} Es comestible 100% hábitat {l} Es venenoso 100%

Por ejemplo: Si se tiene un hongo con olor Almendra“, antes de comerlo, se debe ver el color de sus esporas. Si estas son”Verdes“, este hongo es Venenoso. Si son, por ejemplo”Negras“, es necesario revisar la población de la cual proviene dicho hongo. Si la población de la que proviene es”Dispersa“, este hongo es comestible. Si su población es”agrupada“, se debe pasar a revisar el hábitat del que proviene. Si proviene de un hábitat de”hojas“, este hongo es venenoso, Sin embargo, si proviene de un hábitat de”Hierbas“, este es un hongo comestible, así como si proviene de”Prados“.

Existe entonces un estricto orden de evaluación de las características de los hongos, para la determinación de, si es o no comestible. La primera característica, la del olor, es la mas significativa en la determinación de esta condición, seguida por el color de las esporas, población y hábitat, en ese orden.

A continuación se genera una matriz de confusión desde los datos clasificados con el árbol anteriormente descrito, en donde aparece de manera vertical los datos predichos y de forma horizontal, los datos reales del dataset de pruebas:

## Loading required package: caret
## Loading required package: lattice
## Loading required package: ggplot2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    e    p
##          e 1045    0
##          p    0  648
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9978, 1)
##     No Information Rate : 0.6172     
##     P-Value [Acc > NIR] : < 2.2e-16  
##                                      
##                   Kappa : 1          
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##              Prevalence : 0.6172     
##          Detection Rate : 0.6172     
##    Detection Prevalence : 0.6172     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : e          
## 

En la tabla anterior, puede observarse que el nivel de exactitud del cálculo realizado con el árbol de clasificación, es de 100%. Es decir que todas las clasificaciónes aparecen como correctas cuando se usa la clasificación sugerida por el árbol.

A continuación, se muestra la gráfica de la curva ROC, para el ejercicio de clasificación del árbol, para el dataset de los hongos:

## Loading required package: ROCR
## Loading required package: gplots
## 
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
## 
##     lowess

La figura anterior, es otra representación de la información de la matriz de confusión ya explicada. Se observa que con una clasificación del 100% de las muestras de prueba, se predijo correctamente el estado de venenosidad o comestibilidad del hongo. Por lo tanto la técnica parece tener buena aplicabilidad.

Conclusiones

Efectuar la técnica de machine learning adecuada, es muy importante para llegar a resultados interesantes. Por ejemplo, para mi caso personal, usé técnicas de reducción de características que no permitieron tomar conclusiones preliminarmente. El resultado en esa ocación era que todas las características eran importantes en la determinación de resultados. Aparecía que el “Olor” era la característica mas importante, lo cual fué confirmado por el árbol de clasifiación. Sin embargo, no lograba concluir cual técnica usar.

Por medio de la lectura de una guía (Machine Learning with R Cookbook by Yu-Wei, Chiu) en la cual se usaba la técnica de clasificación para conocer la probabilidad de perecer en el Titanic de acuerdo a la edad, género, clase, etc, pude concluir que dicha técnica podría también ser usada para clasificar a los hongos, dado que la clase a predecir tenia características similares: Perecer o salvase, Venenoso o comestible, de acuerdo a diferentes atributos.

Para alguien que comienza dentro de el mundo de machine learning, es interesante tomar ejemplos de referencia que le permitan elegir una técnica adecuada de tratamiento de los datos.

De igual forma, se observa el poder potencial que constituye el análisis de información por medio de técnicas de machine learning. De un conjunto plano de datos puede llegarse a conclusiones importantes que ayudan a construir conocimiento, como fue para mi, saber las características distintivas de los hongos comestibles y venenosos. Aun así no me atrevería a comer un hongo que según mis conclusiones debe ser comestible, pero sí intentaría hacer ejercicios reales que me permitan ratificar los resultados, antes de llegar a comerlos aunque la curva ROC se ve perfecta, lo cual me da mas confianza, pero no cuando mi vida depende de ello.

Bibliografía

Mastering Machine Learning with R - Second Edition by Cory Lesmeister Published by Packt Publishing, 2017

Machine Learning with R Cookbook by Yu-Wei, Chiu Published by Packt Publishing, 2015

https://www.kaggle.com/datasets