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.