Como desenvolver um classificador de Bayes ingênuo do zero em Python

Tweet Share

última atualização em 10 de janeiro de 2020

classificação é um problema de modelagem preditiva que envolve a atribuição de um rótulo para uma dada amostra de dados de entrada.

O problema da modelagem preditiva de classificação pode ser enquadrado como o cálculo da probabilidade condicional de uma etiqueta de classe dada uma amostra de dados., O teorema de Bayes fornece uma maneira de calcular esta probabilidade condicional, embora na prática requeira um enorme número de amostras (conjunto de dados de tamanho muito grande) e é computacionalmente caro.

em vez disso, o cálculo do Teorema de Bayes pode ser simplificado fazendo algumas suposições, como cada variável de entrada é independente de todas as outras variáveis de entrada. Embora uma suposição dramática e irrealista, isso tem o efeito de fazer os cálculos da probabilidade condicional tractable e resulta em um modelo de classificação eficaz referido como Bayes ingênuos.,

neste tutorial, você irá descobrir o algoritmo ingênuo de Bayes para modelagem preditiva de classificação.

Depois de completar este tutorial, você saberá:

  • como enquadrar a modelagem preditiva de classificação como um modelo de probabilidade condicional.
  • How to use Bayes Theorem to solve the conditional probability model of classification.
  • How to implement simplified Bayes Theorem for classification, called the Naive Bayes algorithm.,

kick-start o seu projecto com a minha nova probabilidade de livro para a aprendizagem de máquinas, incluindo tutoriais passo-a-passo e os ficheiros de código-fonte Python para todos os exemplos.vamos começar.

  • updated Oct / 2019: Fixed minor inconsistency issue in math notation.Update Jan / 2020: Updated for changes in scikit-learn v0. 22 API.

Como Desenvolver um Classificador Naive Bayes a partir do Zero em Python
Foto por Ryan Dickey, alguns direitos reservados.,

Tutorial Visão geral

Este tutorial é dividido em cinco partes, quais sejam:

  1. Probabilidade Condicional Modelo de Classificação
  2. Simplificado ou Naive Bayes
  3. Como Calcular o Antes e Probabilidades Condicionais
  4. Exemplo Trabalhado de Naive Bayes
  5. 5 Dicas Ao Usar Naive Bayes

Probabilidade Condicional Modelo de Classificação

Em aprendizado de máquina, estamos muitas vezes interessados em modelagem preditiva problema onde queremos prever uma classe label para uma dada observação., Por exemplo, classificando a espécie de planta com base em medições da flor.

problemas deste tipo são referidos como problemas de modelagem preditiva de classificação, ao contrário de problemas de regressão que envolvem a previsão de um valor numérico. A observação ou entrada no modelo é referida como X e o rótulo da classe ou saída do modelo é referido como y.

em conjunto, X e y representam observações recolhidas do domínio, ou seja, uma tabela ou matriz (colunas e linhas ou características e amostras) de dados de formação utilizados para encaixar num modelo., O modelo deve aprender a mapear exemplos específicos para etiquetas de classe ou y = f (X) que minimizaram o erro de erro de classificação.uma abordagem para resolver este problema é desenvolver um modelo probabilístico. De uma perspectiva probabilística, estamos interessados em estimar a probabilidade condicional do rótulo da classe, dada a observação.

Por exemplo, um problema de classificação pode ter etiquetas de classe k y1, y2,…, YK e n variáveis de entrada, X1, X2,…, Xn., Podemos calcular a probabilidade condicional de uma classe com a etiqueta de uma dada instância ou conjunto de valores de entrada para cada coluna de x1, x2, …, xn da seguinte forma:

  • P(yi | x1, x2, …, xn)

A probabilidade condicional pode ser calculada para cada classe de etiqueta no problema e a etiqueta com o maior probabilidade pode ser retornada como o mais provável de classificação.

a probabilidade condicional pode ser calculada usando a probabilidade conjunta, embora fosse intratável. O teorema de Bayes fornece uma forma de princípio para calcular a probabilidade condicional.,

A forma simples de cálculo para o Teorema de Bayes é a seguinte:

  • P(A|B) = P(B|A) * P(A) / P(B)

, Onde a probabilidade de que estamos interessados em calcular P(A|B) é chamado posterior e a probabilidade marginal de probabilidade do evento a, P(A) é chamado antes.,

podemos classificação do quadro como um condicional classificação problema com Bayes o Teorema da seguinte forma:

  • P(yi | x1, x2, …, xn) = P(x1, x2, …, xn | yi) * P(yi) / P(x1, x2, …, xn)

antes de P(yi) é fácil estimar a partir de um conjunto de dados, mas a probabilidade condicional de a observação com base na classe P(x1, x2, …, xn | yi) não é viável, a menos que o número de exemplos é extraordinariamente grande, seja grande o suficiente para efetivamente estimar a distribuição de probabilidade para todas as diferentes combinações possíveis de valores.,

Como tal, a aplicação direta do Teorema de Bayes também se torna intratável, especialmente quando o número de variáveis ou características (n) aumenta.

quer aprender a probabilidade de aprendizagem por máquina

faça agora o meu curso gratuito de 7 dias de acidente por e-mail (com código de exemplo).

Clique para se inscrever e também obter uma versão ebook PDF livre do curso.,

baixar o seu Mini-curso gratuito

Bayes simplificadas ou ingénuas

a solução para usar o teorema de Bayes para um modelo condicional de classificação de probabilidade é simplificar o cálculo.

O Teorema de Bayes assume que cada variável de entrada é dependente de todas as outras variáveis. Esta é uma causa de complexidade no cálculo. Podemos remover esta suposição e considerar cada variável de entrada como sendo independente uma da outra.,

isto muda o modelo de um modelo de probabilidade condicional dependente para um modelo de probabilidade condicional independente e simplifica drasticamente o cálculo.

primeiro, o denominador é removido do cálculo P(x1, x2, …, xn) como é uma constante usada no cálculo da probabilidade condicional de cada classe para uma dada instância e tem o efeito de normalizar o resultado.,

  • P(yi | x1, x2, …, xn) = P(x1, x2, …, xn | yi) * p (yi)

a seguir, a probabilidade condicional de todas as variáveis dado o rótulo da classe é alterada em probabilidades condicionais separadas de cada valor variável dado o rótulo da classe. Estas variáveis condicionais independentes são então multiplicadas em conjunto. Por exemplo:

  • P(yi | x1, x2, …, xn) = P(x1|yi) * P(x2|yi) * … P(xn|yi) * P(yi)

Este cálculo pode ser realizado para cada classe de etiquetas e etiqueta com o maior probabilidade pode ser selecionada como a classificação para a instância dada., Esta regra de decisão é designada por regra de decisão máxima a posteriori ou MAP.

esta simplificação do Teorema de Bayes é comum e amplamente utilizado para a classificação de problemas de modelagem preditiva e é geralmente referido como Bayes ingênuo.

A Palavra “ingênuo “é francesa e tipicamente tem uma diaérese (umlaut) sobre o” i”, que é comumente deixado de fora por simplicidade, e” Bayes ” é capitalizado como é nomeado em homenagem ao Reverendo Thomas Bayes.,

como calcular as probabilidades prévias e condicionais

Agora que sabemos o que são Bayes ingénuos, podemos ver mais de perto como calcular OS Elementos da equação.

o cálculo do anterior P (yi) é simples. Pode ser estimado dividindo a frequência de observações no conjunto de dados de formação que têm o rótulo da classe pelo número total de exemplos (linhas) no conjunto de dados de formação., Por exemplo:

  • P ( yi) = exemplos com exemplos de yi / total

a probabilidade condicional de um valor de recurso dado o rótulo da classe também pode ser estimada a partir dos dados. Especificamente, os exemplos de dados que pertencem a uma determinada classe, e uma distribuição de dados por variável. Isto significa que se existem classes K e variáveis n, que K * N diferentes distribuições de probabilidade devem ser criadas e mantidas.é necessária uma abordagem diferente, dependendo do tipo de dados de cada característica., Especificamente, os dados são usados para estimar os parâmetros de uma de três distribuições de probabilidade padrão.

no caso de variáveis categóricas, como contagens ou rótulos, uma distribuição multinomial pode ser usada. Se as variáveis são binárias, como sim/não ou true/false, uma distribuição binomial pode ser usada. Se uma variável é numérica, como uma medida, muitas vezes uma distribuição gaussiana é usada.

  • binário: distribuição Binomial.
  • categórica: distribuição Multinomial.
  • numérico: distribuição gaussiana.,

estas três distribuições são tão comuns que a implementação ingênua do Bayes é muitas vezes nomeada após a distribuição. Por exemplo:

  • Binomial Naive Bayes: Naive Bayes that uses a binomial distribution.Multinomial Naive Bayes: Naive Bayes that uses a multinomial distribution.Bayes ingênuos Gaussianos: Bayes ingênuos que usam uma distribuição gaussiana.

um conjunto de dados com tipos de dados mistos para as variáveis de entrada pode exigir a selecção de diferentes tipos de distribuições de dados para cada variável.,

usando uma das três distribuições comuns não é obrigatório; por exemplo, se uma variável de valor real é conhecida por ter uma distribuição específica diferente, como exponencial, então essa distribuição específica pode ser usada em vez disso. Se uma variável real não tem uma distribuição bem definida, como bimodal ou multimodal, então um estimador de densidade do núcleo pode ser usado para estimar a distribuição de probabilidade.

O algoritmo ingênuo de Bayes provou ser eficaz e, portanto, é popular para tarefas de classificação de texto., As palavras em um documento podem ser codificadas como Binárias (palavra presente), contagem (palavra ocorrência), ou frequência (tf/idf) vetores de entrada e Binárias, multinomiais, ou distribuições de probabilidade Gaussianas usadas respectivamente.

trabalhou como exemplo de Bayes ingênuos

nesta seção, vamos fazer o cálculo ingênuo Bayes concreto com um pequeno exemplo em um conjunto de dados de aprendizagem de máquina.

Podemos gerar um pequeno problema de classificação binária (2 classe) usando a função make_blobs() da API scikit-learn.,

o exemplo abaixo gera 100 exemplos com duas variáveis numéricas de entrada, cada uma com uma de duas classes.

correr o exemplo gera o conjunto de dados e resume o tamanho, confirmando que o conjunto de dados foi gerado como esperado.

o argumento “random_state” é definido como 1, garantindo que a mesma amostra aleatória de observações é gerada cada vez que o código é executado.

os elementos de entrada e saída dos cinco primeiros exemplos também são impressos, mostrando que, de fato, as duas variáveis de entrada são numéricas e as etiquetas de classe são 0 ou 1 para cada exemplo.,

iremos modelar as variáveis de entrada numéricas usando uma distribuição de probabilidade Gaussiana.

isto pode ser alcançado usando a norma SciPy API. Em primeiro lugar, a distribuição pode ser construída especificando os parâmetros da distribuição, por exemplo, a média e o desvio padrão, então a função densidade de probabilidade pode ser amostrada para valores específicos usando a norma.pdf() function.

podemos estimar os parâmetros da distribuição a partir do conjunto de dados usando as funções NumPy média() e std ().,

a função fit_distribution() abaixo apresenta uma amostra de dados para uma variável e encaixa numa distribuição de dados.

Recall that we are interested in the conditional probability of each input variable. Isto significa que precisamos de uma distribuição para cada uma das variáveis de entrada, e um conjunto de distribuições para cada uma das etiquetas de classe, ou quatro distribuições no total.em primeiro lugar, temos de dividir os dados em grupos de amostras para cada uma das etiquetas da classe.,

1
2
3
4
5

# ordenar os dados para classes
Xy0 = X
Xy1 = X
imprimir(Xy0.,forma, Xy1.shape)

podemos então utilizar estes grupos para calcular as probabilidades anteriores de uma amostra de dados pertencente a cada grupo.

isto será 50% exatamente dado que criamos o mesmo número de exemplos em cada uma das duas classes; no entanto, vamos calcular estes antecedentes para a completude.,

1
2
3
4
5

…,
# calcular priores
priory0 = len(Xy0) / len(X)
priory1 = len(Xy1) / len(X)
print(priory0, priory1)

Finalmente, podemos chamar o fit_distribution() função que definimos para preparar uma distribuição de probabilidade para cada variável, para cada rótulo de classe.atando tudo isto, o modelo probabilístico completo do conjunto de dados é apresentado a seguir.,

executando o exemplo primeiro divide o conjunto de dados em dois grupos para as duas etiquetas de classe e confirma o tamanho de cada grupo é par e os priores são 50%.

distribuições de probabilidade são então preparadas para cada variável para cada etiqueta da classe e os parâmetros de média e desvio padrão de cada distribuição são reportados, confirmando que as distribuições diferem.a seguir, podemos usar o modelo probabilístico preparado para fazer uma previsão.,

a probabilidade condicional independente para cada etiqueta de classe pode ser calculada usando o prior para a classe (50%) e a probabilidade condicional do valor para cada variável.

a função probabilidade() abaixo executa este cálculo para um exemplo de entrada (matriz de dois valores) dada a distribuição de probabilidade prévia e condicional para cada variável. O valor retornado é uma pontuação ao invés de uma probabilidade, uma vez que a quantidade não é normalizada, uma simplificação muitas vezes realizada ao implementar bayes ingênuos.,

Podemos usar esta função para calcular a probabilidade de um exemplo pertencente a cada classe.

Primeiro, podemos selecionar um exemplo a ser classificado; neste caso, o primeiro exemplo no conjunto de dados.,

1
2
3

…,
# classificar um exemplo
Xsample, ysample = X, y

em seguida, podemos calcular a pontuação do exemplo pertencentes à primeira classe, em seguida, a segunda classe, em seguida, relatar os resultados.

A classe com a maior pontuação será a classificação resultante.o exemplo completo de encaixar o modelo ingênuo de Bayes e usá-lo para fazer uma previsão é listado abaixo.,

executando o exemplo primeiro prepara as probabilidades prévias e condicionais como antes, em seguida, usa-os para fazer uma predição para um exemplo.

a pontuação do exemplo pertencente a y = 0 é de cerca de 0, 3 (lembre-se que esta é uma probabilidade não formalizada), enquanto a pontuação do exemplo pertencente a y=1 é 0, 0. Portanto, classificaríamos o exemplo como pertencendo a y = 0.

neste caso, o resultado verdadeiro ou real é conhecido, y = 0, que corresponde à previsão do nosso modelo ingênuo Bayes.,

1
2
3

P(y=0 | ) = 0.348
P(y=1 | ) = 0.,000
Truth: y=0

na prática, é uma boa ideia usar implementações optimizadas do algoritmo de Bayes ingénuo. O scikit-aprender biblioteca fornece três implementações, uma para cada um dos três principais distribuições de probabilidade; por exemplo, BernoulliNB, MultinomialNB, e GaussianNB para binomial, multinomial e a distribuição Gaussiana variáveis de entrada, respectivamente.

para usar um modelo scikit-learn Naive Bayes, primeiro o modelo é definido, então ele é adequado no conjunto de dados de treinamento., Uma vez que se encaixem, probabilidades podem ser previstas através da função predict_proba() e etiquetas de classe podem ser previstas diretamente através da função predict ().

o exemplo completo de encaixar um modelo de Bayes ingênuo Gaussiano (GaussianNB) no mesmo conjunto de dados de teste está listado abaixo.

executando o exemplo encaixa o modelo no conjunto de dados de treinamento, então faz previsões para o mesmo primeiro exemplo que usamos no exemplo anterior.

neste caso, a probabilidade do exemplo pertencente a y=0 é 1.0 ou uma certeza. A probabilidade de y = 1 é um valor muito pequeno próximo de 0.0.,

finalmente, o rótulo da classe é previsto diretamente, mais uma vez correspondendo a verdade do solo para o exemplo.,iv>

1
2
3

Previstos Probabilidades: ]
Previsto Classe:
a Verdade: y=0

5 Dicas Ao Usar Naive Bayes

Esta seção lista algumas dicas práticas quando se trabalha com Naive Bayes modelos.,

Use um KDE para distribuições complexas

Se a distribuição de probabilidade de uma variável é complexa ou desconhecida, pode ser uma boa ideia usar um estimador de densidade de kernel ou KDE para aproximar a distribuição diretamente das amostras de dados.

um bom exemplo seria o KDE Gaussiano.

desempenho diminuído com dependência variável crescente

Por definição, o Ingenuble Bayes assume que as variáveis de entrada são independentes umas das outras.

isso funciona bem na maioria das vezes, mesmo quando algumas ou a maioria das variáveis são de fato dependentes., No entanto, o desempenho do algoritmo degrada o mais dependente as variáveis de entrada acontece ser.

evite o sub-fluxo numérico com Log

o cálculo da probabilidade condicional independente para um exemplo para uma classe label envolve a multiplicação de muitas probabilidades juntas, uma para a classe e uma para cada variável de entrada. Como tal, a multiplicação de muitos pequenos números juntos pode se tornar numericamente instável, especialmente como o número de variáveis de entrada aumenta.,

para superar este problema, é comum mudar o cálculo do produto de probabilidades para a soma de probabilidades de log. Por exemplo:

  • P(yi | x1, x2, …, xn) = log(P(x1|y1)) + log(P(x2|y1)) + … (log P(xn|y1)) + log(P(yi))

Calcular o logaritmo natural de probabilidades tem o efeito de criar maior (negativo) números e adicionar os números juntos significa que maiores probabilidades vai estar mais perto de zero. Os valores resultantes ainda podem ser comparados e maximizados para dar o rótulo de classe mais provável.,

isto é muitas vezes chamado de log-trick ao multiplicar probabilidades.

actualizar as distribuições de probabilidade

À medida que novos dados se tornam disponíveis, pode ser relativamente simples utilizar estes novos dados com os dados antigos para actualizar as estimativas dos parâmetros para a distribuição de probabilidade de cada variável.

Isto permite que o modelo faça facilmente uso de novos dados ou as distribuições de dados em mudança ao longo do tempo.

Use as a Generative Model

The probability distributions will summarize the conditional probability of each input variable value for each class label.,

estas distribuições de probabilidade podem ser úteis mais geralmente além do uso em um modelo de classificação.

Por exemplo, as distribuições de probabilidade preparadas podem ser amostradas aleatoriamente, a fim de criar novas instâncias de dados plausíveis. O pressuposto de independência condicional assumido pode significar que os exemplos são mais ou menos plausíveis com base no quanto existe interdependência real entre as variáveis de entrada no conjunto de dados.

Leitura Adicional

Esta secção fornece mais recursos sobre o tópico se você está procurando ir mais fundo.,

Tutoriais

  • Naive Bayes Tutorial para Aprendizado de Máquina
  • Naive Bayes para Machine Learning
  • Melhor Naive Bayes: 12 Dicas Para Obter O máximo do Algoritmo Bayes Naive

Livros

  • Aprendizado de Máquina, 1997.
  • Machine Learning: a Probabilistic Perspective, 2012.reconhecimento de padrões e aprendizagem de máquinas, 2006.Data Mining: Practical Machine Learning Tools and Techniques, 4th edition, 2016.

API

Articles

  • Bayes ‘ theorem, Wikipedia.
  • Naive Bayes classificier, Wikipedia.,
  • Maximum a posteriori estimation, Wikipedia.

resumo

neste tutorial, você descobriu o algoritmo ingênuo de Bayes para modelagem preditiva de classificação.

especificamente, você aprendeu:

  • como enquadrar a modelagem preditiva de classificação como um modelo de probabilidade condicional.
  • How to use Bayes Theorem to solve the conditional probability model of classification.
  • How to implement simplified Bayes Theorem for classification called the Naive Bayes algorithm.tem alguma pergunta?,Faça suas perguntas nos comentários abaixo e farei o meu melhor para responder.

    get a Handle on Probability for Machine Learning!

    desenvolver a sua compreensão da probabilidade

    …with just a few lines of python code

    Discover how in my new eBook:
    Probability for Machine Learning

    It provides self-study tutorials and end-to-end projects on:
    Bayes Theorem, Bayesian Optimization, Distributions, Maximum Probability, Cross-Entropy, Calibrating Models
    and much more…,

    finalmente aproveitar a incerteza em seus projetos

    saltar os acadêmicos. Apenas Resultados.Ver o que está dentro de

    Tweet Share

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *