Está en la página 1de 4

Tema 4 - Aprendizaje Probabilístico.

Clasificación
Mediante Naive Bayes
Resumen
El algoritmo Naive Bayes define un método simple para aplicar el teorema de Bayes a
problemas de clasificación. Aunque no es el único método de Machine Learning que
utiliza métodos bayesianos, sí es el más común debido a su éxito clasificando textos,
terreno en el que este algoritmo se ha convertido en el estándar de facto.

Repaso: El Teorema de Bayes


El teorema de Bayes fue enunciado por el matemático inglés Thomas Bayes (1702-
1761) y constituye un sistema de cálculo de probabilidades realizado de manera
inversa a cómo se calculan habitualmente.
Con el teorema de Bayes es posible calcular la probabilidad de un suceso, teniendo
información de antemano sobre el mismo. En particular, el teorema establece que la
probabilidad de que se dé el suceso A condicionado a la aparición del suceso B,
representada por P(A|B) se obtiene como:

Donde P(A) y P(B) son, respectivamente, las probabilidades a priori de los suceso A,
P(B) es P(B|A) es la probabilidad de que se dé el suceso B para cada hipótesis de A.

Las fortalezas y debilidades que tiene el clasificador Naive Bayes se resume en la


siguiente table:

Fortalezas Debilidades
Simple, rápido y muy efectivo Se basa en una suposición a menudo
incorrecta: las características son
independientes y tienen la misma relevancia.
Funciona bien incluso con datos No es recomendable para conjuntos de datos
incompletos o con ruido. con muchos valores numéricos
Requiere relativamente pocos casos Las clases estimadas son menos fiables que
para ser entrenado. las predichas
Resulta sencillo obtener la
probabilidad de una predicción.
Librerías Usadas en R
Las librerías que se han usado para el clasificador han sido:
• caret: usado para realizar una matriz de confusión y ver los resultados de las
predicciones contra las clases reales. Puede encontrarse toda la información
sobre esta librería en la web:
https://www.rdocumentation.org/packages/caret/versions/6.0-86
• e1071: desarrollado por la Universidad Tecnológica de Viena, esta librería
contiene funciones de Machine Learning. Puede encontrarse más información en
https://www.rdocumentation.org/packages/e1071/versions/1.7-4

if (!require(caret)) install.packages('caret', dependencies = T)


library(caret)

if (!require(e1071)) install.packages('e1071', dependencies = T)


library(e1071)

Ejemplo: Predicción de Supervivientes en el Titanic


En esta ocasión, usaremos el dataset Titanic, instalado por defecto en la librería de R.
Cargaremos el dataset con la función data() y veremos un resumen de las
características del dataset con la función str():
data(Titanic)
original_data <- as.data.frame(Titanic)
str(original_data)

'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 ...

El dataset Titanic está compuesto por 32 observaciones y 5 variables, de las cuales 4


son variables cualitativas (Class, Sex, Age, Survived) y 1 númerica (Freq).
Vamos a tratar de predecir la clase Survived a partir de las variables Class, Sex y Age.
Como podemos observar el dataset es un resumen de los datos, no existen
observaciones como las que podría haber en otros datasets. Existe una variable
llamada Freq que indica el número observaciones de una clase, sexo y edad que han
muerto o sobrevivido. Es por ello por lo que antes de empezar deberemos convertir
dicho Summary en observaciones.
repeating_sequence=rep.int(seq_len(nrow(data)), data$Freq)
data=original_data[repeating_sequence,]
dim(data)

[1] 2201 5

Ahora ya tenemos 2201 observaciones de 5 variables. Pasamos a crear los conjuntos


de entrenamiento (80%) y validación (20%) usando una semilla aleatoria:
set.seed(12345)

size <- floor(nrow(data) * 0.8)


idx <- sample(seq_len(nrow(data)), size = size)

data_train <- data[idx, ]


data_test <- data[-idx, ]

Con los datos separados en los datasets de entrenamiento y validación, llamamos a la


función naiveBayes() de la librería paquete e1071. Dicha función tiene como
parámetros:
• formula: fórmula en formato R de las variables a predecir
• data: dataset de entrenamiento sin la variable categórica

classifier <- naiveBayes(


Survived ~ Class + Sex + Age,
data=data_train
)

classifier

Naive Bayes Classifier for Discrete Predictors

Call:
naiveBayes.default(x = X, y = Y, laplace = laplace)

A-priori probabilities:
Y
No Yes
0.6738636 0.3261364

Conditional probabilities:
Class
Y 1st 2nd 3rd Crew
No 0.08178752 0.11045531 0.34991568 0.45784148
Yes 0.28571429 0.17421603 0.24912892 0.29094077
Sex
Y Male Female
No 0.91399663 0.08600337
Yes 0.50871080 0.49128920

Age
Y Child Adult
No 0.03372681 0.96627319
Yes 0.07665505 0.92334495

Con el clasificador Naive Bayes ya entrenado, podemos predecir la clase del nuevo
dataset de validación.
prediction <- predict(
classifier,
data_test[, -which(names(data_test) %in% c("Survived"))]
)

confusionMatrix(prediction, data_test$Survived)
Confusion Matrix and Statistics

Reference
Prediction No Yes
No 280 74
Yes 24 63

Accuracy : 0.7778
95% CI : (0.736, 0.8157)
No Information Rate : 0.6893
P-Value [Acc > NIR] : 2.277e-05
Kappa : 0.4233

Mcnemar's Test P-Value : 7.431e-07

Sensitivity : 0.9211
Specificity : 0.4599
Pos Pred Value : 0.7910
Neg Pred Value : 0.7241
Prevalence : 0.6893
Detection Rate : 0.6349
Detection Prevalence : 0.8027
Balanced Accuracy : 0.6905

'Positive' Class : No

La matriz de confusión de la validación realizada nos indica que tenemos un 77.78%


de porcentaje de éxito en la clasificación.

También podría gustarte