5.3 Naive Bayes

El método naive Bayes (Bayes ingenuo) es una simplificación de los métodos anteriores en la que se asume que las variables explicativas son independientes. Esta es una suposición extremadamente fuerte y en la práctica difícilmente nos encontraremos con un problema en el que los predictores sean independientes, pero a cambio se va a reducir mucho la complejidad del modelo. Esta simplicidad del modelo le va a permitir manejar un gran número de predictores, incluso con un tamaño muestral moderado, situaciones en las que puede ser imposible utilizar LDA o QDA. Otra ventaja asociada con su simplicidad es que el cálculo de las predicciones va a poder hacer muy rápido incluso para tamaños muestrales muy grandes. Además, y quizás esto sea lo más sorprendente, en ocasiones su rendimiento es muy competitivo.

Asumiendo normalidad, este modelo no es más que un caso particular de QDA con matrices \(\Sigma_k\) diagonales. Cuando las variables predictoras son categóricas, lo más habitual es modelizar su distribución utilizando distribuciones multinomiales. Siguiendo con los ejemplos anteriores, empleamos la función e1071::naiveBayes() para realizar la clasificación:

library(e1071)
nb <- naiveBayes(taste ~ ., data = train)
nb
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
## 
## A-priori probabilities:
## Y
##  good   bad 
## 0.662 0.338 
## 
## Conditional probabilities:
##       fixed.acidity
## Y          [,1]      [,2]
##   good 6.726888 0.8175101
##   bad  7.030030 0.9164467
## 
##       volatile.acidity
## Y           [,1]       [,2]
##   good 0.2616994 0.08586935
##   bad  0.3075148 0.11015113
## 
##       citric.acid
## Y           [,1]      [,2]
##   good 0.3330211 0.1231345
##   bad  0.3251775 0.1334682
## 
##       residual.sugar
## Y          [,1]     [,2]
##   good 6.162009 4.945483
##   bad  6.709024 5.251402
## 
##       chlorides
## Y            [,1]       [,2]
##   good 0.04420242 0.02237654
##   bad  0.05075740 0.03001672
## 
##       free.sulfur.dioxide
## Y          [,1]     [,2]
##   good 34.75831 14.87336
##   bad  35.41124 19.26304
## 
##       total.sulfur.dioxide
## Y          [,1]     [,2]
##   good 132.7568 38.05871
##   bad  147.4615 47.34668
## 
##       density
## Y           [,1]       [,2]
##   good 0.9935342 0.00285949
##   bad  0.9950789 0.00256194
## 
##       pH
## Y          [,1]      [,2]
##   good 3.209668 0.1604529
##   bad  3.166331 0.1472261
## 
##       sulphates
## Y           [,1]       [,2]
##   good 0.4999396 0.11564067
##   bad  0.4763905 0.09623778
## 
##       alcohol
## Y           [,1]      [,2]
##   good 10.786959 1.2298425
##   bad   9.845611 0.8710844

En las tablas correspondientes a los predictores31, se muestran la media y la desviación típica de sus distribuciones condicionadas a las distintas clases.

En este caso los resultados obtenidos en la muestra de test son peores que con los métodos anteriores:

pred <- predict(nb, newdata = test)
# p.est <- predict(nb, newdata = test, type = "raw")
caret::confusionMatrix(pred, test$taste)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction good bad
##       good  136  47
##       bad    30  37
##                                           
##                Accuracy : 0.692           
##                  95% CI : (0.6307, 0.7486)
##     No Information Rate : 0.664           
##     P-Value [Acc > NIR] : 0.19255         
##                                           
##                   Kappa : 0.2734          
##                                           
##  Mcnemar's Test P-Value : 0.06825         
##                                           
##             Sensitivity : 0.8193          
##             Specificity : 0.4405          
##          Pos Pred Value : 0.7432          
##          Neg Pred Value : 0.5522          
##              Prevalence : 0.6640          
##          Detection Rate : 0.5440          
##    Detection Prevalence : 0.7320          
##       Balanced Accuracy : 0.6299          
##                                           
##        'Positive' Class : good            
## 

  1. Aunque al imprimir los resultados aparece Naive Bayes Classifier for Discrete Predictors, se trata de un error. En este caso todos los predictores son continuos.↩︎