1. Instalar los paquetes para poder realizar árboles de decisión
install.packages("rpart")
install.packages("rpart.plot")
  1. Cargar paquetes del laboratorio
library(rpart)
## Warning: package 'rpart' was built under R version 4.0.3
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.0.3
library(data.table)
library(caret)
## Warning: package 'caret' was built under R version 4.0.3
## Loading required package: lattice
## Loading required package: ggplot2
  1. Cargamos los datos iris que pertenecen a una base del set de datos de R.
datos<-iris
  1. Creamos el árbol de decisión con r.part.
arb1 <- rpart(Species~., data = datos,method="class") #~. quiere decir que incluye a todas las variables después de Species
  1. Ploteamos el árbol de decisión
rpart.plot(arb1)

Ahora evaluamos la precisión del modelo fuera de muestra

  1. Creamos un set de entrenamiento y uno de prueba.
set.seed(12345)

ind<-createDataPartition(datos$Species,times = 1,p = 0.8,list = F) # dividimos la muestra en dos partes

train<-datos[ind,] # datos de entrenamiento
test<-datos[-ind,] # datos de prueba
  1. Armamos nuestro árbol de decición considerando solo los datos de entrenamiento.
arb2 <- rpart(Species~., data = train,method="class")

rpart.plot(arb2)

  1. Evaluamos en los datos de prueba
pred<-predict(arb2,newdata = test,type="class")
  1. Creamos la matriz de confusión
matconf<-table(test$Species,pred)

matconf
##             pred
##              setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         0
##   virginica       0          2         8
  1. Calculamos la precisión
precis<-sum(diag(matconf))/sum(matconf)
precis
## [1] 0.9333333

Todos los pasos anteriormente descritos (3-4-5) se pueden condensar en una función:

prec<-function(x,y,z) {
  pred <- predict(x, y, type = "class")
  matconf <- table(y[,z], pred)
  test<- sum(diag(matconf)) / sum(matconf)
  test
}

prec(arb2,test,"Species")
## [1] 0.9333333

¿Qué sucede si cambiamos el mínimo de separaciones de nuestro modelo?

prcr<-rpart.control(minsplit = 6) # número mínimo de observaciones que deben existir en un nodo para que se intente una división

arb3 <- rpart(Species~., data = train,method="class",control=prcr)

rpart.plot(arb3)

prec(arb3,test,"Species")
## [1] 0.9333333