Se tiene una base de datos que contiene las características de 8124 champiñones, clasificados como comestibles y venenosos (variable objetivo). Se debe construir un modelo que permita predecir el tipo de champiñón en base a estas características (variables independientes) y evaluar los resultados.
mushrooms <- read.csv("mushrooms.csv", stringsAsFactors = TRUE)
dim(mushrooms)
## [1] 8124 23
colnames(mushrooms)
## [1] "type" "cap_shape"
## [3] "cap_surface" "cap_color"
## [5] "bruises" "odor"
## [7] "gill_attachment" "gill_spacing"
## [9] "gill_size" "gill_color"
## [11] "stalk_shape" "stalk_root"
## [13] "stalk_surface_above_ring" "stalk_surface_below_ring"
## [15] "stalk_color_above_ring" "stalk_color_below_ring"
## [17] "veil_type" "veil_color"
## [19] "ring_number" "ring_type"
## [21] "spore_print_color" "population"
## [23] "habitat"
head(mushrooms)
## type cap_shape cap_surface cap_color bruises odor gill_attachment
## 1 poisonous convex smooth brown yes pungent free
## 2 edible convex smooth yellow yes almond free
## 3 edible bell smooth white yes anise free
## 4 poisonous convex scaly white yes pungent free
## 5 edible convex smooth gray no none free
## 6 edible convex scaly yellow yes almond free
## gill_spacing gill_size gill_color stalk_shape stalk_root
## 1 close narrow black enlarging equal
## 2 close broad black enlarging club
## 3 close broad brown enlarging club
## 4 close narrow brown enlarging equal
## 5 crowded broad black tapering equal
## 6 close broad brown enlarging club
## stalk_surface_above_ring stalk_surface_below_ring stalk_color_above_ring
## 1 smooth smooth white
## 2 smooth smooth white
## 3 smooth smooth white
## 4 smooth smooth white
## 5 smooth smooth white
## 6 smooth smooth white
## stalk_color_below_ring veil_type veil_color ring_number ring_type
## 1 white partial white one pendant
## 2 white partial white one pendant
## 3 white partial white one pendant
## 4 white partial white one pendant
## 5 white partial white one evanescent
## 6 white partial white one pendant
## spore_print_color population habitat
## 1 black scattered urban
## 2 brown numerous grasses
## 3 brown numerous meadows
## 4 black scattered urban
## 5 brown abundant grasses
## 6 black numerous grasses
summary(mushrooms)
## type cap_shape cap_surface cap_color bruises
## edible :4208 bell : 452 fibrous:2320 brown :2284 no :4748
## poisonous:3916 conical: 4 grooves: 4 gray :1840 yes:3376
## convex :3656 scaly :3244 red :1500
## flat :3152 smooth :2556 yellow :1072
## knobbed: 828 white :1040
## sunken : 32 buff : 168
## (Other): 220
## odor gill_attachment gill_spacing gill_size gill_color
## none :3528 attached: 210 close :6812 broad :5612 buff :1728
## foul :2160 free :7914 crowded:1312 narrow:2512 pink :1492
## fishy : 576 white :1202
## spicy : 576 brown :1048
## almond : 400 gray : 752
## anise : 400 chocolate: 732
## (Other): 484 (Other) :1170
## stalk_shape stalk_root stalk_surface_above_ring
## enlarging:3516 bulbous:3776 fibrous: 552
## tapering :4608 club : 556 scaly : 24
## equal :1120 silky :2372
## missing:2480 smooth :5176
## rooted : 192
##
##
## stalk_surface_below_ring stalk_color_above_ring stalk_color_below_ring
## fibrous: 600 white :4464 white :4384
## scaly : 284 pink :1872 pink :1872
## silky :2304 gray : 576 gray : 576
## smooth :4936 brown : 448 brown : 512
## buff : 432 buff : 432
## orange : 192 orange : 192
## (Other): 140 (Other): 156
## veil_type veil_color ring_number ring_type spore_print_color
## partial:8124 brown : 96 none: 36 evanescent:2776 white :2388
## orange: 96 one :7488 flaring : 48 brown :1968
## white :7924 two : 600 large :1296 black :1872
## yellow: 8 none : 36 chocolate:1632
## pendant :3968 green : 72
## buff : 48
## (Other) : 144
## population habitat
## abundant : 384 grasses:2148
## clustered: 340 leaves : 832
## numerous : 400 meadows: 292
## scattered:1248 paths :1144
## several :4040 urban : 368
## solitary :1712 waste : 192
## woods :3148
str(mushrooms)
## 'data.frame': 8124 obs. of 23 variables:
## $ type : Factor w/ 2 levels "edible","poisonous": 2 1 1 2 1 1 1 1 2 1 ...
## $ cap_shape : Factor w/ 6 levels "bell","conical",..: 3 3 1 3 3 3 1 1 3 1 ...
## $ cap_surface : Factor w/ 4 levels "fibrous","grooves",..: 4 4 4 3 4 3 4 3 3 4 ...
## $ cap_color : Factor w/ 10 levels "brown","buff",..: 1 10 9 9 4 10 9 9 9 10 ...
## $ bruises : Factor w/ 2 levels "no","yes": 2 2 2 2 1 2 2 2 2 2 ...
## $ odor : Factor w/ 9 levels "almond","anise",..: 8 1 2 8 7 1 1 2 8 1 ...
## $ gill_attachment : Factor w/ 2 levels "attached","free": 2 2 2 2 2 2 2 2 2 2 ...
## $ gill_spacing : Factor w/ 2 levels "close","crowded": 1 1 1 1 2 1 1 1 1 1 ...
## $ gill_size : Factor w/ 2 levels "broad","narrow": 2 1 1 2 1 1 1 1 2 1 ...
## $ gill_color : Factor w/ 12 levels "black","brown",..: 1 1 2 2 1 2 5 2 8 5 ...
## $ stalk_shape : Factor w/ 2 levels "enlarging","tapering": 1 1 1 1 2 1 1 1 1 1 ...
## $ stalk_root : Factor w/ 5 levels "bulbous","club",..: 3 2 2 3 3 2 2 2 3 2 ...
## $ stalk_surface_above_ring: Factor w/ 4 levels "fibrous","scaly",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ stalk_surface_below_ring: Factor w/ 4 levels "fibrous","scaly",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ stalk_color_above_ring : Factor w/ 9 levels "brown","buff",..: 8 8 8 8 8 8 8 8 8 8 ...
## $ stalk_color_below_ring : Factor w/ 9 levels "brown","buff",..: 8 8 8 8 8 8 8 8 8 8 ...
## $ veil_type : Factor w/ 1 level "partial": 1 1 1 1 1 1 1 1 1 1 ...
## $ veil_color : Factor w/ 4 levels "brown","orange",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ ring_number : Factor w/ 3 levels "none","one","two": 2 2 2 2 2 2 2 2 2 2 ...
## $ ring_type : Factor w/ 5 levels "evanescent","flaring",..: 5 5 5 5 1 5 5 5 5 5 ...
## $ spore_print_color : Factor w/ 9 levels "black","brown",..: 1 2 2 1 2 1 1 2 1 1 ...
## $ population : Factor w/ 6 levels "abundant","clustered",..: 4 3 3 4 1 3 3 4 5 4 ...
## $ habitat : Factor w/ 7 levels "grasses","leaves",..: 5 1 3 5 1 1 3 3 1 3 ...
mushrooms$veil_type <- NULL
table(mushrooms$type)
##
## edible poisonous
## 4208 3916
library(OneR)
mushroom_1R <- OneR(type ~ ., data = mushrooms)
mushroom_1R
##
## Call:
## OneR.formula(formula = type ~ ., data = mushrooms)
##
## Rules:
## If odor = almond then type = edible
## If odor = anise then type = edible
## If odor = creosote then type = poisonous
## If odor = fishy then type = poisonous
## If odor = foul then type = poisonous
## If odor = musty then type = poisonous
## If odor = none then type = edible
## If odor = pungent then type = poisonous
## If odor = spicy then type = poisonous
##
## Accuracy:
## 8004 of 8124 instances classified correctly (98.52%)
mushroom_1R_pred <- predict(mushroom_1R, mushrooms)
table(actual = mushrooms$type, predicted = mushroom_1R_pred)
## predicted
## actual edible poisonous
## edible 4208 0
## poisonous 120 3796
library(RWeka)
##
## Attaching package: 'RWeka'
## The following object is masked from 'package:OneR':
##
## OneR
mushroom_JRip <- JRip(type ~ ., data = mushrooms)
mushroom_JRip
## JRIP rules:
## ===========
##
## (odor = foul) => type=poisonous (2160.0/0.0)
## (gill_size = narrow) and (gill_color = buff) => type=poisonous (1152.0/0.0)
## (gill_size = narrow) and (odor = pungent) => type=poisonous (256.0/0.0)
## (odor = creosote) => type=poisonous (192.0/0.0)
## (spore_print_color = green) => type=poisonous (72.0/0.0)
## (stalk_surface_below_ring = scaly) and (stalk_surface_above_ring = silky) => type=poisonous (68.0/0.0)
## (habitat = leaves) and (cap_color = white) => type=poisonous (8.0/0.0)
## (stalk_color_above_ring = yellow) => type=poisonous (8.0/0.0)
## => type=edible (4208.0/0.0)
##
## Number of Rules : 9
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
## 4208 0 | a = edible
## 0 3916 | b = poisonous
Exactitud: 100.00%
Precisión: 100.00%
Sensibilidad: 100.00%
Especificidad: 100.00%
Tasa de falsos positivos: 0.00%. Es la probabilidad de que se clasifique como positivo (venenoso) cuando el valor verdadero sea negativo (comestible).
Tasa de falsos negativos: 0.00%. Es la probabilidad de que se clasifique como negativo (comestible) cuando el valor verdadero sea positivo (venenoso).
F1 Score: 100.00%
En base a las métricas calculadas, se puede observar una alta exactitud 100%. Además, se puede evidenciar una alta precisión 100% y alta sensibilidad 100%, por lo tanto, el modelo RJip entrenado es altamente confiable en la predicción de la clase venenoso, y también detecta perfectamente la clase (venenoso) respecto a los valores observados sin presencia de falsos negativos
summary(library(C50))
## Length Class Mode
## 10 character character
mushroom_c5rules <- C5.0(type ~ odor + gill_size, data = mushrooms, rules = TRUE)
summary(mushroom_c5rules)
##
## Call:
## C5.0.formula(formula = type ~ odor + gill_size, data = mushrooms, rules = TRUE)
##
##
## C5.0 [Release 2.07 GPL Edition] Wed Sep 14 23:33:45 2022
## -------------------------------
##
## Class specified by attribute `outcome'
##
## Read 8124 cases (3 attributes) from undefined.data
##
## Rules:
##
## Rule 1: (4328/120, lift 1.9)
## odor in {almond, anise, none}
## -> class edible [0.972]
##
## Rule 2: (3796, lift 2.1)
## odor in {creosote, fishy, foul, musty, pungent, spicy}
## -> class poisonous [1.000]
##
## Default class: edible
##
##
## Evaluation on training data (8124 cases):
##
## Rules
## ----------------
## No Errors
##
## 2 120( 1.5%) <<
##
##
## (a) (b) <-classified as
## ---- ----
## 4208 (a): class edible
## 120 3796 (b): class poisonous
##
##
## Attribute usage:
##
## 100.00% odor
##
##
## Time: 0.0 secs
Exactitud: 98.52%
Precisión: 100.00%
Sensibilidad: 96.94%
Especificidad: 100.00%
Tasa de falsos positivos: 0.00%. Es la probabilidad de que se clasifique como positivo (venenoso) cuando el valor verdadero sea negativo (comestible).
Tasa de falsos negativos: 3.06%. Es la probabilidad de que se clasifique como negativo (comestible) cuando el valor verdadero sea positivo (venenoso).
F1 Score: 98.44%
En base a las métricas calculadas, se puede observar una alta exactitud 98.52%. Además,se puede evidenciar una alta precisión 100% y alta sensibilidad 96.94%, por lo tanto, el modelo C5.0 entrenado es altamente confiable en la predicción de la clase venenoso, y en menor medida detecta la clase (venenoso) respecto a los valores observados ya que presenta falsos negativos, es decir, predice como negativo (comestible) un 3.06% cuando el valor verdadero es positivo (venenoso)
En conclusión, el algoritmo C50 usado para entrenar un modelo de aprendizaje basado en reglas usando árboles de decisión no muestra un desempeño superior que el algoritmo 1R, que es más simple, pero esto no significa que en todos los casos será así porque solo se ha especificado 2 características para entrenar el C50.
-Elegiremos como mejor modelo el algoritmo Ripper (RJip), ya que se evidencia que el modelo escogido para entrenar la data maneja perfectamente la clase de la variable objetivo (venenoso/comestible). No hay presencia de errores, con una alta precisión 100% y alta sensibilidad 100%, siendo el modelo altamente confiable en la predicción de la clase venenoso, y también detecta perfectamente la clase venenoso respecto a los valores observados sin presencia de falsos negativos.
-Por otro lado, tanto el modelo One Rule como el árbol de decisión C5.0, si generan error de 1.48%. Y una tasa de falsos negativos del 3.06%, es decir, la probabilidad de que se clasifique como negativo (comestible) cuando el valor verdadero sea positivo (venenoso)