Naive Bayes

Equipo 2: Christian Acedo, Jorgue Figueroa, Miguel Espinoza, Alejandro Gil

01/04/2022

Introducción

A continuación se mostrará una demostración del algoritmo supervisado de Naive Bayes. En esta simple demostración Usaremos los datos de supervivientes del Titanic que vienen en los datasets de R por defecto. La tabla de datos tiene 32 filas pero en realidad esconde en la columna freq el número de repeticiones de cada caso. El primer caso sería almacenar los valores con los que estaremos trabajando en un data frame

El primer paso es importar las librerías para utilizar el presente algoritmo

library(e1071,naivebaye)
#Cargamos los datos del Titanic desde los datasets
data("Titanic")
#Los almacenamos en un data frame
Titanic_df=as.data.frame(Titanic)
str(Titanic_df)
## 'data.frame':    32 obs. of  5 variables:
##  $ Class   : Factor w/ 4 levels "1st","2nd","3rd",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ Sex     : Factor w/ 2 levels "Male","Female": 1 1 1 1 2 2 2 2 1 1 ...
##  $ Age     : Factor w/ 2 levels "Child","Adult": 1 1 1 1 1 1 1 1 2 2 ...
##  $ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Freq    : num  0 0 35 0 0 0 17 0 118 154 ...

Creamos una tabla de casos completos a partir de la frecuencia de cada uno.

## Esto repite cada caso según la frecuencia dada en la col de la tabla.
repeating_sequence=rep.int(seq_len(nrow(Titanic_df)), Titanic_df$Freq) 

Creamos una nueva tabla repitiendo los casos según el modelo anterior.

 Titanic_dataset=Titanic_df[repeating_sequence,]

    #Aquí no necesitaremos más la tabla de frecuencias
    Titanic_dataset$Freq=NULL
    head(Titanic_dataset)
##     Class  Sex   Age Survived
## 3     3rd Male Child       No
## 3.1   3rd Male Child       No
## 3.2   3rd Male Child       No
## 3.3   3rd Male Child       No
## 3.4   3rd Male Child       No
## 3.5   3rd Male Child       No

Todos los factores

str(Titanic_dataset)
## 'data.frame':    2201 obs. of  4 variables:
##  $ Class   : Factor w/ 4 levels "1st","2nd","3rd",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ Sex     : Factor w/ 2 levels "Male","Female": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Age     : Factor w/ 2 levels "Child","Adult": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...

Ajustamos un modelo de naive bayes con la librería e1071 para posteriormente visualizar el modelo

m.e1071 <- naiveBayes(Survived ~ ., data = Titanic_dataset)
m.e1071 
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
## 
## A-priori probabilities:
## Y
##       No      Yes 
## 0.676965 0.323035 
## 
## Conditional probabilities:
##      Class
## Y            1st        2nd        3rd       Crew
##   No  0.08187919 0.11208054 0.35436242 0.45167785
##   Yes 0.28551336 0.16596343 0.25035162 0.29817159
## 
##      Sex
## Y           Male     Female
##   No  0.91543624 0.08456376
##   Yes 0.51617440 0.48382560
## 
##      Age
## Y          Child      Adult
##   No  0.03489933 0.96510067
##   Yes 0.08016878 0.91983122

Visualización del Dataset

str(Titanic_df)
## 'data.frame':    32 obs. of  5 variables:
##  $ Class   : Factor w/ 4 levels "1st","2nd","3rd",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ Sex     : Factor w/ 2 levels "Male","Female": 1 1 1 1 2 2 2 2 1 1 ...
##  $ Age     : Factor w/ 2 levels "Child","Adult": 1 1 1 1 1 1 1 1 2 2 ...
##  $ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Freq    : num  0 0 35 0 0 0 17 0 118 154 ...

Realizamos la prediccion con el modelo

predicciones.m<-predict(m.e1071,Titanic_dataset)
# Matriz de confusión 
table(predicciones.m,Titanic_dataset$Survived)
##               
## predicciones.m   No  Yes
##            No  1364  362
##            Yes  126  349
hecho<-data.frame(Class="1rd",Sex="Female",Age="Child")
predict(m.e1071,hecho)
## [1] Yes
## Levels: No Yes

Conclusión personal

En muchas ocasiones los datos no contienen muestras a priori de todas las combinaciones de variables posibles, por lo que las probabilidades de casos raros salen excesivamente bajas. Para corregir esto el modelo naiveBayes tiene la opción de añadir en la fórmula el argumento de laplace=1, en el que indicamos que, al menos, se debe contar con una aparición de cada posible combinación de factores. Este parámetro se puede aumentar a criterio del investigador, y permite incorporar casos raros dentro del pronóstico que de otra forma, por la simplificación del modelo de Bayes, darían probabilidad cero.