6. Aprendizagem Bayesiana
O Naive Bayes é um algoritmo de aprendizado supervisionado baseado no Teorema de Bayes. Ele é amplamente utilizado para filtros de spam, classificação de documentos e análise de risco de crédito.
Teorema de Bayes
P(classe | atributos) = P(atributos | classe) · P(classe) / P(atributos)Na prática, o algoritmo calcula a probabilidade de uma nova entrada pertencer a cada classe e escolhe a de maior probabilidade.
Premissa “Naive” (ingênua)
Assume que os atributos são condicionalmente independentes entre si, dada a classe. Isso simplifica os cálculos, embora raramente seja verdadeiro na realidade — mesmo assim, o classificador costuma funcionar bem.
Correção Laplaciana
Quando uma combinação de atributos nunca apareceu no treino, a probabilidade resulta em zero e o modelo falha. A correção de Laplace adiciona um registro fictício à base para evitar probabilidades nulas.
GaussianNB (Scikit-learn)
Na disciplina, utiliza-se a classe GaussianNB, que assume distribuição Gaussiana (normal) dos atributos numéricos.
| Método | Função |
|---|---|
fit(X, Y) | Gera a tabela de probabilidades a partir do treino. |
predict(X) | Classifica novas entradas. |
accuracy_score | Compara previsões com os valores reais. |
Talk is cheap, show me the code:
Bases utilizadas nesta aula (disponíveis no Google Drive): risco_credito.csv · credito.pkl · creditoSE.pkl
Roteiro para a aula de Aprendizado Bayesiano
1 – Executar a importação das bibliotecas (pode ser no mesmo arquivo da semana passada):
#biblioteca para gerar gráficos dinâmicos
!pip install plotly --upgrade
#pandas é uma biblioteca que trabalha com a importação de arquivos .csv
import pandas as pd
#numpy é uma biblioteca para a realização de operações em arrays
import numpy as np
#seaborn é uma biblioteca para vizualização de gráficos
import seaborn as sb
#matplotlib é também uma biblioteca para a geração de gráficos
import matplotlib.pyplot as plt
import plotly.express as px
2 - Colocar a base de dados 'risco_credito.csv' dentro da pasta do Colab Notebooks e fazer o import da base:
base_risco_credito = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/risco_credito.csv')
3 - Realizar o pré-processamento da base
#pré-processamento
X_risco_credito = base_risco_credito.iloc[:,0:4].values
Y_risco_credito = base_risco_credito.iloc[:,4].values
#transformar de categórico para numérico
from sklearn.preprocessing import LabelEncoder
label_encoder_historia = LabelEncoder()
label_encoder_divida = LabelEncoder()
label_encoder_garantia = LabelEncoder()
label_encoder_renda = LabelEncoder()
X_risco_credito[:, 0] = label_encoder_historia.fit_transform(X_risco_credito[:, 0])
X_risco_credito[:, 1] = label_encoder_divida.fit_transform(X_risco_credito[:, 1])
X_risco_credito[:, 2] = label_encoder_garantia.fit_transform(X_risco_credito[:, 2])
X_risco_credito[:, 3] = label_encoder_renda.fit_transform(X_risco_credito[:, 3])
4 - Salvar a base no drive:
import pickle
with open('risco_credito.pkl', 'wb') as f:
pickle.dump([X_risco_credito, Y_risco_credito], f)
Jogue para o drive o arquivo risco_credito.pkl
5 - Algoritmo Naive Bayes
from sklearn.naive_bayes import GaussianNB # importa a classe para trabalhar com o aprendizado bayesiano
naive_risco_credito = GaussianNB()
naive_risco_credito.fit(X_risco_credito, Y_risco_credito) # faz o treinamento e gera a tabela de probabilidade
#gerar previsao
#historio = Boa (0), divida = Alta (0), garantia nenhuma (1), renda > 35 (2)
#historio = ruim (2), divida = alta (0), garantia = adequada (0), renda < 15 (0)
previsao = naive_risco_credito.predict([[0, 0, 1, 2],[2, 0, 0, 0]]) # a função não retorna a probabilidade
==================================================base de dados credit_data========================================================
1 - Importar o arquivo .pkl salvo na aula aterior (quem não tiver, pegar o enviado pelo professor)
import pickle
with open('/content/drive/MyDrive/Colab Notebooks/credito.pkl', 'rb') as f:
X_credito_treinamento, Y_credito_treinamento, X_credito_teste, Y_credito_teste = pickle.load(f)
2 - Criar a variável naive_bayes_credito para receber a classe GaussianNB
naive_dados_credito = GaussianNB()
naive_dados_credito.fit(X_credito_treinamento, Y_credito_treinamento) # faz os dados de treinamento com a classe de treinamento salva
3 - Fazer a previsão com base nos dados de testes
previsao = naive_dados_credito.predict(X_credito_teste) # função predict faz a predição dos valores que estão na variável X_credito_teste
4- Fazer a seguinte importação:
from sklearn.metrics import accuracy_score #faz a comparação entre o que o algoritmo previu e o que a classe teste possui
accuracy_score(Y_credito_teste, previsao)
5 - Outra forma de comparação - Matriz de confusão
from sklearn.metrics import confusion_matrix
confusion_matrix(Y_credito_teste, previsao)
6 - Outra visualização
from yellowbrick.classifier import ConfusionMatrix
from sklearn.metrics import classification_report
print(classification_report(Y_credito_teste, previsao))
==================================================base de dados credit_data SEM escalonar ========================================================
1 - Importar o arquivo .pkl salvo na aula aterior (quem não tiver, pegar o enviado pelo professor)
import pickle
with open('/content/drive/MyDrive/Colab Notebooks/creditoSE.pkl', 'rb') as f:
X_credito_treinamentoSE, Y_credito_treinamentoSE, X_credito_testeSE, Y_credito_testeSE = pickle.load(f)
2 - Criar a variável naive_bayes_credito para receber a classe GaussianNB
naive_dados_creditoSE = GaussianNB()
naive_dados_creditoSE.fit(X_credito_treinamentoSE, Y_credito_treinamentoSE) # faz os dados de treinamento com a classe de treinamento salva
3 - Fazer a previsão com base nos dados de testes
previsaoSE = naive_dados_creditoSE.predict(X_credito_testeSE) # função predict faz a predição dos valores que estão na variável X_credito_teste
4- Fazer a seguinte importação:
from sklearn.metrics import accuracy_score #faz a comparação entre o que o algoritmo previu e o que a classe teste possui
accuracy_score(Y_credito_testeSE, previsaoSE)
5 - Outra forma de comparação - Matriz de confusão
from sklearn.metrics import confusion_matrix
confusion_matrix(Y_credito_testeSE, previsaoSE)