O classificador bayesiano é baseado no teorema de Bayes, que tem como principal base a independência entre preditores. É um modelo fácil de construir, sem uma estimativa complicada de parâmetros iterativos, o que o torna particularmente útil para conjuntos de dados muito grandes. Apesar de sua simplicidade, o modelo bayesiano geralmente produz resultados rápidos.

Talvez o maior problema, é quando há parâmetros que possuem alguma ligação ou dependência, pois neste modelo (bayesiano), os parâmetros são vistos como independentes.

Para mais informações sobre o teorema de Bayes deixo-vos os dois links abaixo:

É um modelo rápido e que produz informações de simples interpretação, mas que não se pode aplicar em casos que hajam dependências entre preditores.

Let’s play:

Aqui utilizo Python, SKLearn e a IDE Spyder.

Para um simples teste, utilizei aqui um dataset disponível na plataforma do Kaggle (Ver Link), que possui um conjunto de valores de meteorologia, como temperatura, velocidade do vento, humidade e etc. E a estes valores está associado se haverá precipitação de chuva ou neve.

Importação do csv para dataframe:

import pandas as pd
base = pd.read_csv(‘weatherHistory.csv’)

O dataframe está preenchido com 96.453 linhas.

Correção de valores NaN (excluindo dados faltantes):

base.loc[pd.isnull(base[‘Precip Type’])]

Há 517 linhas com valores nulo para a coluna “Precip Type” que contém os valores rain e snow.


base2 = base.dropna()

Preferi excluir as linhas com valores faltantes, simplesmente para facilitar e aqui temos nosso novo dataframe (base2) sem valores nulos:

Criando dataframe para as classes (chuva e neve) e previsores (com as variáveis):

previsores = base2.iloc[:, 3:11].values
classe = base2.iloc[:, 2].values

Se olharmos para os valores do dataframe previsões, é possível perceber que há uma discrepância de valores e que pode induzir o algoritmo a dar maior importância mais para uma variável do que outra:

Neste momento, é importante colocarmos estes valores dentro de uma mesma escala.

Pré-processamento Escalonamento:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
previsores = scaler.fit_transform(previsores)

Após o escalonamento, temos nosso dataframe com valores ajustados:

Dividindo os dataframes em Treino e Teste:

from sklearn.model_selection import train_test_split
previsores_treinamento, previsores_teste, classe_treinamento, classe_teste = train_test_split(previsores, classe, test_size=0.15, random_state=0)

Estou a definir que nossa base de dados de teste, terá um tamanho de 15% da base de dados original (base2).


Treino:

from sklearn.naive_bayes import GaussianNB
classificador = GaussianNB()
classificador.fit(previsores_treinamento, classe_treinamento)

Teste:

previsoes = classificador.predict(previsores_teste)

Avaliação da precisão e matriz de comparação

from sklearn.metrics import confusion_matrix, accuracy_score
precisao = accuracy_score(classe_teste, previsoes)
matriz = confusion_matrix(classe_teste, previsoes)

Para a precisão, temos que um valor de 93%, ou seja, o modelo NB atribuiu (chuva ou neve) para 93% dos registos do dataframe de teste (previsores_teste).

Se olharmos ainda para a matriz de comparação, e o que importa são as interseções (0 com 0 e 1 com 1) e que representa os acertos. Os valores 0 com 1 e 1 com 0 são os erros do algoritmo.

Podes obter o código e o dataset no link abaixo: