Menu
CoddyTech

Introdução ao Naive Bayes

Lição 12 de 19 do curso Introdução ao aprendizado de máquina da Coddy.

Naive Bayes é um algoritmo simples, porém poderoso, usado para tarefas de classificação em machine learning.

O algoritmo Naive Bayes é baseado no teorema de Bayes, que nos diz como calcular a probabilidade de um evento (como um e-mail ser spam) com base no conhecimento prévio de condições que podem estar relacionadas ao evento. A parte "naive" (ingênua) vem da suposição de que todas as características (como as palavras no e-mail) são independentes umas das outras, o que simplifica os cálculos. Ser independente significa que o acontecimento de uma coisa não altera as chances de outra coisa acontecer.

Fonte: Wikipedia, Um Classificador Naive Bayes atualizando sua estimativa enquanto mais dados são fornecidos a ele.
Veja como funciona:

  1. Contar Ocorrências: Primeiro, conte quantas vezes cada ponto de dados aparece em diferentes classes. Na detecção de spam de e-mail, contaremos quantas vezes cada palavra apareceu em e-mails de spam ou não spam; no diagnóstico médico, podemos contar quantas vezes (ou por quanto tempo) cada sintoma aparece.
  2. Calcular Probabilidades: Para um novo ponto de dados, calcule a probabilidade de pertencer a cada classe (qual é a probabilidade de um novo e-mail ser spam e qual é a probabilidade de não ser spam) 
  3. Decisão: Finalmente, o algoritmo combina todas essas probabilidades usando o teorema de Bayes e decide se o e-mail tem mais probabilidade de ser spam ou não spam. Quanto maior a probabilidade, maior a probabilidade de pertencer a esta classe.

O legal do Naive Bayes é sua implementação rápida e fácil. Ele funciona bem com dados de alta dimensão (como texto) e pode lidar com valores ausentes. No entanto, a suposição de independência nem sempre é verdadeira na vida real, o que às vezes pode levar a resultados menos precisos em comparação com algoritmos mais complexos.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

challenge icon

Desafio

Médio

Neste desafio, aprenderemos como calcular a probabilidade de pertencer a uma classe específica. O conjunto de dados play_outside.csv contém as seguintes colunas: temperature, mood, motivation, windy, play. Cada linha representa a mesma pessoa e se ela decidiu brincar lá fora ou não com base nas características (temperature, mood, motivation, windy). Nosso objetivo é prever se ela irá brincar lá fora com base nas características (temperature, mood, motivation, windy).

Aqui está um exemplo de um conjunto de dados:

temperaturemoodmotivationwindyplay
lowgoodhighnoyes
moderategoodhighnoyes
lowlowmediumyesno

As seguintes equações podem parecer intimidantes, mas vamos detalhá-las.
Fórmula de Naive Bayes: P(Class|Feature) = P(Feature|Class) * P(Class) / P(Feature)

  • P(Feature|Class) - Verossimilhança (Likelihood)
  • P(Class) - Probabilidade a priori da classe
  • P(Feature) - Probabilidade a priori do preditor
  • P(Class|Feature) - Em outras palavras, qual é a probabilidade de a linha não vista ser classificada na classe <strong>x</strong>. 

Para resolver isso, precisaremos calcular cada um dos componentes da fórmula (P(B|Class) * P(Class) / P(B))

  • P(Class) - Probabilidade a priori da classe
    Isso equivale ao número de ocorrências de cada classe, dividido pelo número total de classes. Por exemplo, em nosso exemplo de 3 linhas, há 2/3 yes e 1/3 no.
    P(yes) = 2/3
    P(no) = 1/3 
  •  P(Feature|Class) - Verossimilhança (Likelihood)
    Isso equivale ao número de ocorrências de cada característica de uma determinada classe. Por exemplo:
    P(temperature = <strong>low</strong>|play = <strong>yes</strong>) - Existem duas linhas onde play = yes, e uma linha onde temperature = low (apenas das linhas onde play = yes), então isso equivale a 1/2.
  • P(Feature)
    Isso equivale ao número de ocorrências de cada característica dividido pelo número total de linhas. Por exemplo:
    p(motivation=high) = 2/3 porque existem duas linhas com alta motivação divididas pelo número total de linhas (3)

O desafio

Você recebe dois dicionários probability_features, probability_target e o dataset_name

Calcule para cada característica (coluna) a probabilidade de cada atributo.
Por exemplo, aqui está o valor de probability_target :

probability_target = {
    "yes": 0.66667, # (2/3)
    "no": 0.33333 # (1/3)   
}

Aqui está o valor de probability_features:

probability_features = {
	"temperature": {
		"low": {
			"yes": 0.5, # (1/2)
			"no": 0.5, # (1/2)
		},
		"moderate": {
			"yes": 1, # (1/1)
			"no": 0, # (0/1)
		}
	}
}

Tenha em mente que os nomes das características e os nomes dos atributos não são constantes. Cada conjunto de dados possui características diferentes e nomes diferentes.

Eu recomendaria usar o módulo pandas para facilitar os cálculos.

Experimente você mesmo

import pandas as pd
probability_features = {}
probability_target = {}
dataset_path = input()
target_variable = input()
df = pd.read_csv(dataset_path)
# Escreva seu código aqui


# -------------------- Ordenar e imprimir --------------------
# Não altere nada abaixo desta linha
sort_features = {q: {k: v for k, v in sorted(a.items() if a != None else {}, key=lambda item: item[0])} for q, a in sorted(probability_features.items(), key=lambda item: item[0])}
sort_target = {k: v for k, v in sorted(probability_target.items(), key=lambda item: item[0])}
print(sort_features)
print(sort_target)

Todas as lições de Introdução ao aprendizado de máquina

Pratique por conta própria: Compilador de Python online