# Adaptado de http://www.statmethods.net/advstats/cart.html
 
# Arbol de clasificación de clases
# Las clases se usan para clasificar variables cualitativas
data(iris)
 
# Selección de una submuestra de 105 (el 70% de los datos)
set.seed(101)
iris.indices <- sample(1:nrow(iris),size=105)
iris.entrenamiento <- iris[iris.indices,]
iris.test <- iris[-iris.indices,]
 
# Texto para los gráficos
texto1 <- "Arbol de clasificación para las especies"
texto2 <- "Arbol de clasificacion podado"
 
library(rpart)
 
# Elaboración del árbol
fit <- rpart(Species ~ ., method="class",data=iris.entrenamiento)
 
printcp(fit) # Mostrar los resultados
plotcp(fit) # visualize cross-validation results
summary(fit) # detailed summary of splits
 
# Matriz de confusión
fit.preds <- predict(fit,newdata = iris.test, type="class")
fit.table <- table(iris.test$Species,fit.preds)
print(fit.table)
 
# plot tree
plot(fit, uniform=TRUE, main=texto1)
text(fit, use.n=TRUE, all=TRUE, cex=.9)
 
# Crea un gráfico en postcript
post(fit, file = "tree.ps", title = texto1)
 
# Podar el árbol,en este caso no varía del anterior
pfit<- prune(fit, cp=fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])
 
# Matriz de confusión
pfit.preds <- predict(pfit,type="class", newdata=iris.test)
pfit.table <- table(iris.test$Species,pfit.preds)
print(pfit.table)
 
# plot the pruned tree
plot(pfit, uniform=TRUE, main=texto2)
text(pfit, use.n=TRUE, all=TRUE, cex=.8)
post(pfit, file = "ptree.ps", title = texto2)
 
Probar este programa
> # Adaptado de http://www.statmethods.net/advstats/cart.html
>
> # Arbol de clasificación de clases
> # Las clases se usan para clasificar variables cualitativas
> data(iris)
>
> # Selección de una submuestra de 105 (el 70% de los datos)
> set.seed(101)
> iris.indices <- sample(1:nrow(iris),size=105)
> iris.entrenamiento <- iris[iris.indices,]
> iris.test <- iris[-iris.indices,]
>
> # Texto para los gráficos
> texto1 <- "Arbol de clasificación para las especies"
> texto2 <- "Arbol de clasificacion podado"
>
> library(rpart)
>
> # Elaboración del árbol
> fit <- rpart(Species ~ ., method="class",data=iris.entrenamiento)
>
> printcp(fit) # Mostrar los resultados
 
Classification tree:
rpart(formula = Species ~ ., data = iris.entrenamiento, method = "class")
 
Variables actually used in tree construction:
[1] Petal.Length
 
Root node error: 67/105 = 0.6381
 
n= 105
 
       CP nsplit rel error  xerror     xstd
1 0.52239      0  1.000000 1.04478 0.072096
2 0.41791      1  0.477612 0.47761 0.070399
3 0.01000      2  0.059701 0.11940 0.040575
> plotcp(fit) # visualize cross-validation results
> summary(fit) # detailed summary of splits
Call:
rpart(formula = Species ~ ., data = iris.entrenamiento, method = "class")
  n= 105
 
         CP nsplit  rel error    xerror       xstd
1 0.5223881      0 1.00000000 1.0447761 0.07209640
2 0.4179104      1 0.47761194 0.4776119 0.07039908
3 0.0100000      2 0.05970149 0.1194030 0.04057527
 
Variable importance
Petal.Length  Petal.Width Sepal.Length  Sepal.Width
          33           30           23           13
 
Node number 1: 105 observations,    complexity param=0.5223881
  predicted class=versicolor  expected loss=0.6380952  P(node) =1
    class counts:    35    38    32
   probabilities: 0.333 0.362 0.305
  left son=2 (35 obs) right son=3 (70 obs)
  Primary splits:
      Petal.Length < 2.45 to the left,  improve=35.08571, (0 missing)
      Petal.Width  < 0.8  to the left,  improve=35.08571, (0 missing)
      Sepal.Length < 5.45 to the left,  improve=25.44210, (0 missing)
      Sepal.Width  < 3.25 to the right, improve=12.48442, (0 missing)
  Surrogate splits:
      Petal.Width  < 0.8  to the left,  agree=1.000, adj=1.000, (0 split)
      Sepal.Length < 5.45 to the left,  agree=0.933, adj=0.800, (0 split)
      Sepal.Width  < 3.25 to the right, agree=0.819, adj=0.457, (0 split)
 
Node number 2: 35 observations
  predicted class=setosa      expected loss=0  P(node) =0.3333333
    class counts:    35     0     0
   probabilities: 1.000 0.000 0.000
 
Node number 3: 70 observations,    complexity param=0.4179104
  predicted class=versicolor  expected loss=0.4571429  P(node) =0.6666667
    class counts:     0    38    32
   probabilities: 0.000 0.543 0.457
  left son=6 (36 obs) right son=7 (34 obs)
  Primary splits:
      Petal.Length < 4.85 to the left,  improve=27.32782, (0 missing)
      Petal.Width  < 1.7  to the left,  improve=27.25952, (0 missing)
      Sepal.Length < 6.15 to the left,  improve=10.67378, (0 missing)
      Sepal.Width  < 2.95 to the left,  improve= 4.01067, (0 missing)
  Surrogate splits:
      Petal.Width  < 1.55 to the left,  agree=0.900, adj=0.794, (0 split)
      Sepal.Length < 6.25 to the left,  agree=0.786, adj=0.559, (0 split)
      Sepal.Width  < 2.95 to the left,  agree=0.671, adj=0.324, (0 split)
 
Node number 6: 36 observations
  predicted class=versicolor  expected loss=0.02777778  P(node) =0.3428571
    class counts:     0    35     1
   probabilities: 0.000 0.972 0.028
 
Node number 7: 34 observations
  predicted class=virginica   expected loss=0.08823529  P(node) =0.3238095
    class counts:     0     3    31
   probabilities: 0.000 0.088 0.912
 
>
> # Matriz de confusión
> fit.preds <- predict(fit,newdata = iris.test, type="class")
> fit.table <- table(iris.test$Species,fit.preds)
> print(fit.table)
            fit.preds
             setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         11         1
  virginica       0          2        16
>
> # plot tree
> plot(fit, uniform=TRUE, main=texto1)
> text(fit, use.n=TRUE, all=TRUE, cex=.9)
>
> # Crea un gráfico en postcript
> post(fit, file = "tree.ps", title = texto1)
>
> # Podar el árbol,en este caso no varía del anterior
> pfit<- prune(fit, cp=fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])
>
> # Matriz de confusión
> pfit.preds <- predict(pfit,type="class", newdata=iris.test)
> pfit.table <- table(iris.test$Species,pfit.preds)
> print(pfit.table)
            pfit.preds
             setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         11         1
  virginica       0          2        16
>
> # plot the pruned tree
> plot(pfit, uniform=TRUE, main=texto2)
> text(pfit, use.n=TRUE, all=TRUE, cex=.8)
> post(pfit, file = "ptree.ps", title = texto2)