• Pacotes que utilizei para apresentação
library(knitr) # colocar figuras/imagens na apresentação
library(readxl) # leitura dos dados em excel
library(flextable) # Construir Tabelas
library(officer) # Pacote para utilizar algumas opções extras do pacote flextable
library(DT) # pacote para construir tabelas dinâmicas

1 Introdução

Neste presente trabalho será apresentado a definição de alguns classificadores bayesianos e a sua aplicação na classificação de texto, implementação dos classificadores em alguns exemplos no Rstudio/Rmarkdown.

2 Definição do Classificador Naive Bayes

O algoritmo “Naive Bayes” é um classificador probabilístico baseado no “Teorema de Bayes”, o qual foi criado por Thomas Bayes (1701 - 1761) para tentar provar a existência de Deus.

Hoje é utilizado na área de Aprendizado de Máquina (Machine Learning) para categorizar textos com base na frequência das palavras usadas.

Exemplos de Utilização do Classificador:

  • Classificação de textos;

  • Pode ser usado para identificar se determinado e-mail é um SPAM ou sobre qual assunto se refere determinado texto;

  • Análise de sentimento em redes sociais.

knitr::include_graphics("Thomas_Bayes.gif")

Figura 1: Thomas Bayes (1701-1761).

3 Implementando no R para variáveis categóricas

  • Carregando pacotes
library(lattice)
library(latticeExtra)
# Carrega.
data(UCBAdmissions)

# Dados da forma de um array cúbico.
str(UCBAdmissions)
##  'table' num [1:2, 1:2, 1:6] 512 313 89 19 353 207 17 8 120 205 ...
##  - attr(*, "dimnames")=List of 3
##   ..$ Admit : chr [1:2] "Admitted" "Rejected"
##   ..$ Gender: chr [1:2] "Male" "Female"
##   ..$ Dept  : chr [1:6] "A" "B" "C" "D" ...
addmargins(margin.table(UCBAdmissions, 1:2))
##           Gender
## Admit      Male Female  Sum
##   Admitted 1198    557 1755
##   Rejected 1493   1278 2771
##   Sum      2691   1835 4526
# Gráfico de mosaico.
mosaicplot(UCBAdmissions)

da <- as.data.frame(UCBAdmissions)
da
##       Admit Gender Dept Freq
## 1  Admitted   Male    A  512
## 2  Rejected   Male    A  313
## 3  Admitted Female    A   89
## 4  Rejected Female    A   19
## 5  Admitted   Male    B  353
## 6  Rejected   Male    B  207
## 7  Admitted Female    B   17
## 8  Rejected Female    B    8
## 9  Admitted   Male    C  120
## 10 Rejected   Male    C  205
## 11 Admitted Female    C  202
## 12 Rejected Female    C  391
## 13 Admitted   Male    D  138
## 14 Rejected   Male    D  279
## 15 Admitted Female    D  131
## 16 Rejected Female    D  244
## 17 Admitted   Male    E   53
## 18 Rejected   Male    E  138
## 19 Admitted Female    E   94
## 20 Rejected Female    E  299
## 21 Admitted   Male    F   22
## 22 Rejected   Male    F  351
## 23 Admitted Female    F   24
## 24 Rejected Female    F  317
# Total de casos.
tot <- sum(da$Freq)
tot
## [1] 4526
# Divide nos níveis de Admit e calcula a marginal e todas as
# condicionais. Retorna as probabilidades.
probs <- by(data = da,
            INDICES = da$Admit,
            FUN = function(a_subset) {
                with(a_subset, {
                    a <- as.character(a_subset$Admit[1])
                    # Freq(A = a) e Prob(A = a)
                    f_a <- sum(Freq)
                    p_a <- f_a/tot
                    # Freq(g | A = a) e Prob(g | A = a)
                    f_g.a <- tapply(Freq, Gender, sum)
                    p_g.a <- f_g.a/f_a
                    # Freq(d | A = a) e Prob(g | A = a).
                    f_d.a <- tapply(Freq, Dept, sum)
                    p_d.a <- f_d.a/f_a
                    cat("------------------------------\n")
                    cat(sprintf("P(A = %s): %0.3f", a, p_a), "\n\n")
                    cat(sprintf("P(G = %s | A = %s): %0.3f",
                                names(p_g.a), a, p_g.a),
                        sep = "\n")
                    cat("\n")
                    cat(sprintf("P(D = %s | A = %s): %0.3f",
                                names(p_d.a), a, p_d.a),
                        sep = "\n")
                    cat("\n")
                    probs <- (p_a) * outer(p_g.a, p_d.a, FUN = "*")
                    probs <- plyr::adply(probs, seq_along(dim(probs)))
                    names(probs) <- c("Gender", "Dept", a)
                    return(probs)
                })
            })
## ------------------------------
## P(A = Admitted): 0.388 
## 
## P(G = Male | A = Admitted): 0.683
## P(G = Female | A = Admitted): 0.317
## 
## P(D = A | A = Admitted): 0.342
## P(D = B | A = Admitted): 0.211
## P(D = C | A = Admitted): 0.183
## P(D = D | A = Admitted): 0.153
## P(D = E | A = Admitted): 0.084
## P(D = F | A = Admitted): 0.026
## 
## ------------------------------
## P(A = Rejected): 0.612 
## 
## P(G = Male | A = Rejected): 0.539
## P(G = Female | A = Rejected): 0.461
## 
## P(D = A | A = Rejected): 0.120
## P(D = B | A = Rejected): 0.078
## P(D = C | A = Rejected): 0.215
## P(D = D | A = Rejected): 0.189
## P(D = E | A = Rejected): 0.158
## P(D = F | A = Rejected): 0.241
probs
## da$Admit: Admitted
##    Gender Dept    Admitted
## 1    Male    A 0.090644116
## 2  Female    A 0.042144218
## 3    Male    B 0.055804198
## 4  Female    B 0.025945691
## 5    Male    C 0.048564735
## 6  Female    C 0.022579764
## 7    Male    D 0.040571160
## 8  Female    D 0.018863219
## 9    Male    E 0.022170857
## 10 Female    E 0.010308153
## 11   Male    F 0.006937819
## 12 Female    F 0.003225681
## ------------------------------------------------------------ 
## da$Admit: Rejected
##    Gender Dept   Rejected
## 1    Male    A 0.03952272
## 2  Female    A 0.03383124
## 3    Male    B 0.02559453
## 4  Female    B 0.02190878
## 5    Male    C 0.07095042
## 6  Female    C 0.06073318
## 7    Male    D 0.06226019
## 8  Female    D 0.05329439
## 9    Male    E 0.05202237
## 10 Female    E 0.04453087
## 11   Male    F 0.07952162
## 12 Female    F 0.06807008

4 Outros Classificadores

Naive-Bayes

Redes neurais

SOM

Árvores de decisão

Regras de decisão