# Modelo de Clasificacion utilizando
# Arboles y Reglas
# Entendiendo los Arboles de Decision
# los arboles de decision son clasificadores poderosos
# los cuales utilizan una estructura de arboles para 
# modelar las relaciones entre las caracteristicas y 
# los potenciales resultados.
# Este ejemplo utiliza la data iris que contiene
# 150 observaciones y cinco caracteristicas, una 
# de ellas es un factor llamado Species y contiene
# los resultados, usaremos esta data para simular
# un modelo de arbol que tratara de predecir
# la especie
data("iris")
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
tail(iris)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica
set.seed(1234)
# creamos un subconjunto aleatorio de la data
# y la usaremos para entrenar nuestro modelo
# en este caso el conjunto de entrenamiento
# tiene 100 observaciones
train_sample <- sample(150,100)
str(train_sample)
##  int [1:100] 18 93 91 92 126 149 2 34 95 73 ...
# dividimos la data en entrenamiento y prueba
iris_train <- iris[train_sample,]
iris_test <- iris[-train_sample,]
# cargamos la libreria C50
library(C50)
# quitamos la columna 5 de la data de entrenamiento
# ya que esa columna contiene los resultados
# que deseamos pronosticar con el modelo
# y corremos el algoritmo que crea el modelo
iris_model <- C5.0(iris_train[-5],iris_train$Species)
iris_model# el modelo generado
## 
## Call:
## C5.0.default(x = iris_train[-5], y = iris_train$Species)
## 
## Classification Tree
## Number of samples: 100 
## Number of predictors: 4 
## 
## Tree size: 3 
## 
## Non-standard options: attempt to group attributes
summary(iris_model)# los detalles del modelo
## 
## Call:
## C5.0.default(x = iris_train[-5], y = iris_train$Species)
## 
## 
## C5.0 [Release 2.07 GPL Edition]      Sun Jan 03 15:26:09 2016
## -------------------------------
## 
## Class specified by attribute `outcome'
## 
## Read 100 cases (5 attributes) from undefined.data
## 
## Decision tree:
## 
## Petal.Length <= 1.9: setosa (38)
## Petal.Length > 1.9:
## :...Petal.Width <= 1.7: versicolor (30/2)
##     Petal.Width > 1.7: virginica (32/1)
## 
## 
## Evaluation on training data (100 cases):
## 
##      Decision Tree   
##    ----------------  
##    Size      Errors  
## 
##       3    3( 3.0%)   <<
## 
## 
##     (a)   (b)   (c)    <-classified as
##    ----  ----  ----
##      38                (a): class setosa
##            28     1    (b): class versicolor
##             2    31    (c): class virginica
## 
## 
##  Attribute usage:
## 
##  100.00% Petal.Length
##   62.00% Petal.Width
## 
## 
## Time: 0.0 secs
# usamos el modelo para hacer las predicciones
iris_pred <- predict(iris_model,iris_test)
# generaremos una Tabla Cruzada para analizar
# los resultados, cargamos la libreria gmodels
library(gmodels)
CrossTable(iris_test$Species,iris_pred,
           prop.chisq = FALSE,prop.c = FALSE,
           prop.r = FALSE,
           dnn = c("Especie Actual","Prediccion"))
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  50 
## 
##  
##                | Prediccion 
## Especie Actual |     setosa | versicolor |  virginica |  Row Total | 
## ---------------|------------|------------|------------|------------|
##         setosa |         12 |          0 |          0 |         12 | 
##                |      0.240 |      0.000 |      0.000 |            | 
## ---------------|------------|------------|------------|------------|
##     versicolor |          0 |         21 |          0 |         21 | 
##                |      0.000 |      0.420 |      0.000 |            | 
## ---------------|------------|------------|------------|------------|
##      virginica |          0 |          3 |         14 |         17 | 
##                |      0.000 |      0.060 |      0.280 |            | 
## ---------------|------------|------------|------------|------------|
##   Column Total |         12 |         24 |         14 |         50 | 
## ---------------|------------|------------|------------|------------|
## 
## 
# los resultados en la diagonal principal
# muestran los aciertos del modelo solamente 
# tres de 17 para virginica resultaron errados