Este relatório apresenta a resolução completa da Atividade Prática 2 focada no classificador probabilístico Naive Bayes. O contexto da atividade envolve uma aplicação prática de visão computacional na agricultura, onde um sistema de monitoramento automático analisa fotos de folhas de plantações e registra três características para cada folha:
O objetivo é treinar um classificador estatístico para inferir a classe final da folha: se ela está saudável ou doente.
Para realizar esta análise, utilizaremos a biblioteca
e1071, que fornece a implementação robusta do algoritmo
Naive Bayes no R.
Agora, realizamos a importação da base de dados histórica. O arquivo
base_naive_bayes_folhas_simples.csv contém o registro
histórico de observações que servirá como base de treinamento (treino)
para o nosso classificador.
# Importação garantindo fatores para variáveis categóricas
nome_arquivo <- "base_naive_bayes_folhas_simples.csv"
if (!file.exists(nome_arquivo) & file.exists("base_naive_bayes_folhas_simples_(1).csv")) {
nome_arquivo <- "base_naive_bayes_folhas_simples_(1).csv"
}
dados <- read.csv(nome_arquivo, stringsAsFactors = TRUE, fileEncoding = "UTF-8-BOM")
# Visualização das primeiras linhas e das dimensões dos dados
head(dados)#> id cor manchas textura classe
#> 1 1 verde presentes uniforme saudavel
#> 2 2 verde ausentes uniforme saudavel
#> 3 3 verde ausentes uniforme saudavel
#> 4 4 amarelada presentes uniforme doente
#> 5 5 verde presentes uniforme saudavel
#> 6 6 verde presentes uniforme saudavel
#> [1] 40 5
Pergunta: 1. Quantas observações existem? 2. Qual é a variável resposta? 3. Quais são as duas classes? 4. Quais características serão utilizadas para a classificação?
Resposta:
A partir das funções estruturais do R, podemos obter essas informações diretamente:
#> [1] 40
#> [1] "doente" "saudavel"
classe.saudavel (saudável) e
doente (doente).cor,
manchas e
textura. A coluna id é apenas
um identificador numérico único e deve ser descartada para a construção
do modelo preditivo.As probabilidades a priori representam o nosso conhecimento de base sobre a distribuição das classes antes de observarmos qualquer característica de uma folha específica.
Executamos a contagem absoluta e o cálculo das proporções relativas na base de dados histórica:
#>
#> doente saudavel
#> 16 24
# Tabela de proporções (probabilidade a priori)
proporcoes_priori <- prop.table(tabela_priori)
proporcoes_priori#>
#> doente saudavel
#> 0.4 0.6
Registro: * \(P( ext{Saudável}) =\) 0.60 (60% das observações na base histórica são de folhas saudáveis). * \(P( ext{Doente}) =\) 0.40 (40% das observações na base histórica são de folhas doentes).
Pergunta: Antes de observarmos a nova folha, qual
das duas classes é mais provável? Resposta: A priori, a
classe saudavel é a mais provável,
apresentando uma chance de 60% de ocorrência contra 40%
da classe doente.
As probabilidades condicionais determinam o comportamento de cada característica dadas as classes. No Naive Bayes, estas probabilidades correspondem à verossimilhança de observar determinado atributo se soubermos de antemão que a folha pertence àquela classe específica.
Geramos as tabelas de contingência cruzadas com as proporções
condicionais calculadas por coluna (parâmetro margin = 2),
garantindo que a soma de cada classe seja igual a 1 (100%):
#>
#> doente saudavel
#> amarelada 13 1
#> verde 3 23
#>
#> doente saudavel
#> amarelada 0.81250000 0.04166667
#> verde 0.18750000 0.95833333
#>
#> doente saudavel
#> ausentes 4 15
#> presentes 12 9
#>
#> doente saudavel
#> ausentes 0.250 0.625
#> presentes 0.750 0.375
#>
#> doente saudavel
#> irregular 12 4
#> uniforme 4 20
#>
#> doente saudavel
#> irregular 0.7500000 0.1666667
#> uniforme 0.2500000 0.8333333
Com base nos resultados das tabelas probabilísticas condicionais calculadas acima:
Folhas amareladas aparecem com maior frequência em qual
classe? Aparecem com maior frequência na classe
doente. Exatamente 81,25%
(13 de 16) das folhas doentes apresentam coloração amarelada, enquanto
apenas 4,17% (1 de 24) das folhas saudáveis exibem essa
cor.
Manchas presentes aparecem com maior frequência em qual
classe? Aparecem com maior frequência na classe
doente. Das folhas doentes,
75,00% (12 de 16) contam com a presença de manchas, em
comparação com 37,50% (9 de 24) das folhas
saudáveis.
Textura irregular aparece com maior frequência em qual
classe? Aparecem com maior frequência na classe
doente. Cerca de 75,00%
(12 de 16) das folhas doentes apresentam textura irregular, ao passo que
apenas 16,67% (4 de 24) das folhas saudáveis são
irregulares.
Qual conjunto de características parece mais associado a
uma folha doente? O conjunto de características fortemente
associado ao estado patológico (doente) é a combinação de cor
amarelada, presença de manchas e textura irregular, uma vez que
todas essas categorias apresentam forte dominância proporcional dentro
da classe doente.
Agora que extraímos todas as contagens necessárias para ilustrar a
matemática por trás do algoritmo, construímos o classificador preditivo
no R. Antes disso, removemos a variável id, que não possui
valor preditivo.
# Filtra colunas de interesse
dados_modelo <- dados[, c("cor", "manchas", "textura", "classe")]
# Treina o modelo Naive Bayes
modelo <- naiveBayes(classe ~ cor + manchas + textura, data = dados_modelo)
print(modelo)#>
#> Naive Bayes Classifier for Discrete Predictors
#>
#> Call:
#> naiveBayes.default(x = X, y = Y, laplace = laplace)
#>
#> A-priori probabilities:
#> Y
#> doente saudavel
#> 0.4 0.6
#>
#> Conditional probabilities:
#> cor
#> Y amarelada verde
#> doente 0.81250000 0.18750000
#> saudavel 0.04166667 0.95833333
#>
#> manchas
#> Y ausentes presentes
#> doente 0.250 0.750
#> saudavel 0.625 0.375
#>
#> textura
#> Y irregular uniforme
#> doente 0.7500000 0.2500000
#> saudavel 0.1666667 0.8333333
Considere o caso de uma nova observação colhida em campo que exibe as
seguintes propriedades: * cor: amarelada *
manchas: presentes * textura:
irregular
Expectativa Teórica: Pela análise do Exercício 3, todas as três características individuais estão altamente associadas a folhas doentes. Multiplicando essas probabilidades com a probabilidade a priori, espera-se fortemente que o Naive Bayes a classifique como doente.
Executando a predição e obtendo as probabilidades a posteriori exatas no R:
# Criação do data frame para a nova folha
nova_folha <- data.frame(
cor = factor("amarelada", levels = levels(dados_modelo$cor)),
manchas = factor("presentes", levels = levels(dados_modelo$manchas)),
textura = factor("irregular", levels = levels(dados_modelo$textura))
)
# 1. Predição da Classe
classe_prevista_1 <- predict(modelo, nova_folha)
classe_prevista_1#> [1] doente
#> Levels: doente saudavel
# 2. Obtenção das Probabilidades Posteriores
probabilidades_1 <- predict(modelo, nova_folha, type = "raw")
round(probabilidades_1, 4)#> doente saudavel
#> [1,] 0.9915 0.0085
Registro de Resultados: * Classe
prevista: doente * $P(
ext{Saudável} X) = \(** **0.0085** (0,85%)
* **\)P( ext{Doente} X) = $ 0.9915
(99,15%)
Interpretação das Perguntas: 1. Qual
probabilidade é maior? A probabilidade a posteriori da classe
doente (\(99,15\%\)) é expressivamente maior do que a
da classe saudavel (\(0,85\%\)). 2. As duas
probabilidades somam aproximadamente 1? Sim. \(0.9915 + 0.0085 = 1.0000\) (exatamente
100%). 3. A classe prevista corresponde à maior
probabilidade? Sim, o comando
predict(modelo, nova_folha) escolheu a classe de maior
probabilidade, classificando a folha como doente. 4.
O resultado coincide com sua expectativa inicial? Sim.
Como todas as características observadas eram fortes indícios de doença,
o modelo combinou-as para gerar uma decisão de alta confiança.
Agora, avaliaremos um segundo espécime com características opostas: *
cor: verde * manchas:
ausentes * textura:
uniforme
Executando a classificação:
# Criação do data frame para a folha 2
nova_folha_2 <- data.frame(
cor = factor("verde", levels = levels(dados_modelo$cor)),
manchas = factor("ausentes", levels = levels(dados_modelo$manchas)),
textura = factor("uniforme", levels = levels(dados_modelo$textura))
)
# 1. Predição da Classe
classe_prevista_2 <- predict(modelo, nova_folha_2)
classe_prevista_2#> [1] saudavel
#> Levels: doente saudavel
# 2. Obtenção das Probabilidades Posteriores
probabilidades_2 <- predict(modelo, nova_folha_2, type = "raw")
round(probabilidades_2, 4)#> doente saudavel
#> [1,] 0.0154 0.9846
Respostas Comparativas:
Criação de um exemplo personalizado combinando características
mistas. Escolheremos uma folha com a seguinte configuração: *
cor: verde (comum em saudável) *
manchas: presentes (comum em doente) *
textura: uniforme (comum em saudável)
# Criação da folha personalizada
minha_folha <- data.frame(
cor = factor("verde", levels = levels(dados_modelo$cor)),
manchas = factor("presentes", levels = levels(dados_modelo$manchas)),
textura = factor("uniforme", levels = levels(dados_modelo$textura))
)
# Predição
class_desafio <- predict(modelo, minha_folha)
prob_desafio <- predict(modelo, minha_folha, type = "raw")
cat("Classe Predita:
")#> Classe Predita:
#> [1] saudavel
#> Levels: doente saudavel
#>
#> Probabilidades:
#> doente saudavel
#> [1,] 0.0726 0.9274
Interpretação Estatística do Desafio: Nesse caso de
dados mistos, o classificador prediz que a folha é
saudavel com \(92,74\%\) de probabilidade (\(0.9274\)), restando apenas \(7,26\%\) de chance de ser
doente.
Isso ocorre porque, apesar da presença de manchas (que pontua a favor
de doença), as características de cor verde (altamente
saudável) e textura uniforme (também altamente saudável)
juntas superam o impacto negativo das manchas, ilustrando como o Naive
Bayes equilibra as evidências ponderadas de forma elegante.