Titanic - Mas Precisión con un Bosque al Azar?

En la publicación anterior se creó un modelo de classificación para predecir si alguien en el Titanic sobrevivió o murió. Se usaba un modelo de árbol de decisión con validación cruzada, y sacó una precisión de 80,79%.

En esta nueva publicación, se usa un modelo de Bosque al Azar para ver si se puede mejorar la precisión. Para partir se usan las bases de datos con las que se terminaba la publicación anterior (total, entrenar_val, entrenar_ensayo_val). Por lo tanto todos los procesos de ingeniería de características ya se han llevado a cabo.

2) Paquetes

Los siguientes paquetes se usan en esta publicación.

library(dplyr)
library(tidyr)
library(ggplot2)
library(knitr)
library(DT)
library(purrr)
library(corrplot)
library(randomForest)
library(caret)
library(rpart)
library(rpart.plot)

3) Cargar Datos

Los datos se cargan con la siguiente sintaxis.

setwd("~/Documents/Machine Learning/15. Hugo/academic-kickstart-master/content/es/post/Bosque-al-Azar")

total <- read.csv("total2.csv")

total <- total[,-1]

entrenar_val <- read.csv("train_val.csv")

entrenar_val <- entrenar_val[,-1]

entrenar_ensayo_val <- read.csv("test_val.csv")

entrenar_ensayo_val <- entrenar_ensayo_val[,-1]

Se cambian las variables de Title y Age Group, a factores.

entrenar_val$Title <- as.factor(entrenar_val$Title)
entrenar_val$Age_Group <- as.factor(entrenar_val$Age_Group)
entrenar_val$Survived <- as.factor(entrenar_val$Survived)

4) Variables y Datos

La base de datos total tiene 1.309 observaciones y 16 variables. Estas 1.309 observaciónes incluyen 891 que son del grupo de entrenar, y 418 que son del grupo de prueba.

Para entrenar el modelo se usan las 891 observaciónes de etrenamiento que se dividen en dos grupos. EL primer grupo es entrenar_val y tiene 714 de esas observaciones. Con este grupo se entrena el modelo. Luego se ensaya el modelo contra el segundo grupo de entrenar_ensayo_val que acatua como un grupo de prueba preliminar. Se espera que con este modelo se pueda obtener una mayor precisión que la obtenida antes con un árbol de decisión.

Se debe notar que después de la ingeniería de caracteristicas en la publicacion anterior, entrenar_val y entrenar_ensayo_val solo tienen siete variables.

Variable Descripción
Survived Sobrevivió (1) or muriò (0)
Pclass Clase social del pasajero
Title Titulo del pasajero
Sexo Sexo del pasajero
Age Group Grupo de edad del pasajero
Family_size Numero de familia a bordo
Embarked Puerto de embarque

5) Que es un Modelo de Bosque al Azar?

Un Bosque al Azar es una coleccion de árboles de decisión que se unen para formar un bosque. Esta variedad de árboles es lo que hace que un model de Bosque al azar sea mas eficiente que un árbol de decisión.

Para el modelo de esta publicación que quiere predecir si alguien murió o sobrevivió en el Titanic, cada árbol da una classificación de sobrviviencia o muerte (1 o 0). Para cada observación, se toma como resultado la clasificación más común, es decir, si hay 300 árboles que predicen que una observación sobrevivió y solo 200 arboles prediciendo que murió, se classifica la observación como sobrevivió.

6) Creando el modelo

Se crea el modelo usando Survied como el variable dependiente y las otras seis variables como variables independientes. Se ejecuta el modelo y se muestra que ha sacado un precisión de 83.47% (100 - tasa de error (16.53)). El modelo utiliza 500 arboles con dos variables probabdas en cada nodo. Mas adelante se verifican si estas configuraciones son las mejores.

set.seed(1234)
rf_model <- randomForest(Survived ~ Pclass + Title + Sex + Embarked + Family_size + Age_Group, data = entrenar_val, ntree = 500)


rf_model
## 
## Call:
##  randomForest(formula = Survived ~ Pclass + Title + Sex + Embarked +      Family_size + Age_Group, data = entrenar_val, ntree = 500) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 16.53%
## Confusion matrix:
##     0   1 class.error
## 0 409  31  0.07045455
## 1  87 187  0.31751825

6.1) Numero de Árboles

Se verifica si se necesita aumentar el número de árboles. Se crea una tabla que muestra la tasa de error para cada uno de los 500 árboles. Para cada árbol hay tres tasas de error:

  • para valores de 0 (alguien que murió)
  • para valores de 1 (alguien que sobrevivió)
  • para todo el modelo (inclyendo gente que murió y sobrevivó)

Se trazan estas tasas de error para ver la varianza. Se espera que antes de 500 árboles la tasa de error se haya estabilizado con una línea recta.

oob.error.data <- data.frame(
  Trees=rep(1:nrow(rf_model$err.rate), times=3),
  Type=rep(c("OOB", "0", "1"), each=nrow(rf_model$err.rate)),
  Error=c(rf_model$err.rate[,"OOB"],
          rf_model$err.rate[,"0"],
          rf_model$err.rate[,"1"]))
ggplot(data=oob.error.data, aes(x=Trees, y=Error)) + 
  geom_line(aes(color=Type))

En el gráfico se puede ver que la tasa de error se ha estabilizado después del arbol 300. Significa que no es necesario agregar más árboles al modelo ya que no reducirían la tasa de error mas.

6.2) Numero de variables probadas

Se prueba si se debe ejecutar el modelo con mas variables probadas en cada nodo. Actualmente en cada nodo se prueban dos variables.

Se expone en oob.values que mtry=2 da el valor de error mas bajo (0.1666667) y así es el valor de divisiones que se deben usar.

oob.values <- vector(length = 10)
for(i in 1:10) {
  temp.model <- randomForest(Survived ~ Pclass + Title + Sex + Embarked + Family_size + Age_Group, data = entrenar_val, mtry=i, ntree=500)
  oob.values[i] <- temp.model$err.rate[nrow(temp.model$err.rate),1]
  }

oob.values
##  [1] 0.1918768 0.1666667 0.1778711 0.1806723 0.1764706 0.1778711 0.1806723
##  [8] 0.1806723 0.1792717 0.1736695

6.3) Importancia de las variables

Se pueden analizar el valor de Gini para las variables para determinar cual variables son las mas y las menos importantes. La tabla y gráfico a la continuación muestran que las variables de Age_Group y Embarked tienen una importancia muy baja en el modelo. Por lo tanto, se prueban un nuevo modelo sin estas dos variables.

importance(rf_model)
##             MeanDecreaseGini
## Pclass              33.40132
## Title               62.14757
## Sex                 42.51139
## Embarked            11.08408
## Family_size         22.26955
## Age_Group           11.74166
varImpPlot(rf_model)

7) Nuevo Modelo

Un nuevo modelo se crea sin las variables Age_Group, y Embarked. Se usan 500 árboles y dos variables en cada nodo.

Sin embargo, cuando el modelo se ejecuta parece que esas variables se necesitan en el modelo ya que ahora el modelo saca una precisión de 82.63% (100 - tasa de error (17.37)). Por lo tanto, se usa el primer modelo con todas las variables como el modelo final.

entrenar_val1=entrenar_val[,c(-4,-6)]

entrenar_ensayo_val1=entrenar_ensayo_val[,c(-4,-6)]
set.seed(1234)
rf_model2 <- randomForest(Survived ~ Pclass + Title + Sex + Family_size, data = entrenar_val1, ntree=500)

rf_model2
## 
## Call:
##  randomForest(formula = Survived ~ Pclass + Title + Sex + Family_size,      data = entrenar_val1, ntree = 500) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 17.37%
## Confusion matrix:
##     0   1 class.error
## 0 387  53   0.1204545
## 1  71 203   0.2591241
varImpPlot(rf_model2)

8) Ensayo del Modelo

En esta seccion se ensaya el modelo con la base de datos entrenar_ensayo_val. Primero se hacen algunas cambias a la base entrenar_ensayo_val para prepararla para el ensayo. Luego se ejecuta el modelo rf_modelo para predecir quien murió y quien sobrevivió entre las personas en esta base. EL modelo saca una precision de 83.05% con un valor de Kappa de 0.6316.

entrenar_ensayo_val$Title <- as.factor(entrenar_ensayo_val$Title)
entrenar_ensayo_val$Age_Group <- as.factor(entrenar_ensayo_val$Age_Group)
entrenar_ensayo_val$Survived <- as.factor(entrenar_ensayo_val$Survived)
set.seed(1234)
rf_predictions <- predict(rf_model, entrenar_ensayo_val)
confusionMatrix(entrenar_ensayo_val$Survived, rf_predictions)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 99 10
##          1 20 48
##                                          
##                Accuracy : 0.8305         
##                  95% CI : (0.767, 0.8826)
##     No Information Rate : 0.6723         
##     P-Value [Acc > NIR] : 1.683e-06      
##                                          
##                   Kappa : 0.6316         
##                                          
##  Mcnemar's Test P-Value : 0.1003         
##                                          
##             Sensitivity : 0.8319         
##             Specificity : 0.8276         
##          Pos Pred Value : 0.9083         
##          Neg Pred Value : 0.7059         
##              Prevalence : 0.6723         
##          Detection Rate : 0.5593         
##    Detection Prevalence : 0.6158         
##       Balanced Accuracy : 0.8298         
##                                          
##        'Positive' Class : 0              
## 

9) Conclusión

En esta publicacion se crea un modelo de bosque al azar para predecir si alguien sobrevivió o murió en el Titanic. En la matriz de arriba se muestra que el modelo sacó una precisión de 83.05% que es mejor que la precisión de 80.79% que sacó el modelo de arbol de decisión en la publicación anterior. Se usan 500 arboles con dos variables en cada nodo. Gracias por tomar el tiempo para leer esta publicación y ojalá que te haya servido. Muchas gracias.

James Attwood
James Attwood
Científico de Datos

Relacionado