Comment développer un classificateur naïf Bayes à partir de zéro en Python

Tweet Share Share

dernière mise à jour le 10 janvier 2020

la Classification est un problème de modélisation prédictive qui consiste à attribuer une étiquette à un échantillon de données d’entrée donné.

le problème de la modélisation prédictive de classification peut être défini comme le calcul de la probabilité conditionnelle d’une étiquette de classe à partir d’un échantillon de données., Le théorème de Bayes fournit un moyen de principe pour calculer cette probabilité conditionnelle, bien qu’en pratique, il nécessite un nombre énorme d’échantillons (ensemble de données de très grande taille) et est coûteux en calcul.

Au Lieu de cela, le calcul du théorème de Bayes peut être simplifié en faisant certaines hypothèses, telles que chaque variable d’entrée est indépendante de toutes les autres variables d’entrée. Bien qu’une hypothèse dramatique et irréaliste, cela a pour effet de rendre les calculs de la probabilité conditionnelle traçables et aboutit à un modèle de classification efficace appelé Bayes naïf.,

dans ce tutoriel, vous découvrirez L’algorithme naïf de Bayes pour la modélisation prédictive de classification.

Après avoir terminé ce tutoriel, vous saurez:

  • Comment encadrer la modélisation prédictive de classification en tant que modèle de probabilité conditionnelle.
  • comment utiliser le théorème de Bayes pour résoudre le modèle de probabilité conditionnelle de classification.
  • comment implémenter le théorème de Bayes simplifié pour la classification, appelé algorithme de Bayes naïf.,

lancez votre projet avec mon nouveau livre Probability for Machine Learning, y compris des tutoriels étape par étape et les fichiers de code source Python pour tous les exemples.

nous allons commencer.

  • mise à jour Oct / 2019: correction d’un problème d’incohérence mineure dans la notation mathématique.
  • mise à jour Jan/2020: mise à jour pour les changements dans l’API scikit-learn v0.22.

Comment Développer un Classificateur de Bayes Naïf à partir de Zéro en Python
Photo de Ryan Dickey, certains droits réservés.,

aperçu du tutoriel

ce tutoriel est divisé en cinq parties:

  1. modèle de probabilité conditionnelle de Classification
  2. Bayes simplifiées ou naïves
  3. Comment calculer les probabilités antérieures et conditionnelles
  4. exemple travaillé de Bayes naïves
  5. 5 conseils lors de L’utilisation de Bayes naïves

modèle de probabilité conditionnelle de Classification

en apprentissage automatique, nous nous intéressons souvent à un problème de modélisation prédictive où nous voulons prédire une étiquette de classe pour une observation donnée., Par exemple, classer les espèces de plantes en fonction des mesures de la fleur.

Les problèmes de ce type sont appelés problèmes de modélisation prédictive de classification, par opposition aux problèmes de régression qui impliquent la prédiction d’une valeur numérique. L’observation ou l’entrée du modèle est appelée X et l’étiquette de classe ou la sortie du modèle est appelée Y.

Ensemble, X et y représentent des observations recueillies dans le domaine, c’est-à-dire une table ou une matrice (colonnes et lignes ou caractéristiques et échantillons) de données d’apprentissage utilisées pour adapter un modèle., Le modèle doit apprendre à mapper des exemples spécifiques à des étiquettes de classe ou à y = f (X) qui minimisent l’erreur de classification erronée.

Une approche pour résoudre ce problème est de développer un modèle probabiliste. D’un point de vue probabiliste, nous sommes intéressés à estimer la probabilité conditionnelle de l’étiquette de classe, compte tenu de l’observation.

Par exemple, un problème de classification peut avoir k étiquettes de classe y1, y2, …, yk et n variables d’entrée, X1, X2, …, Xn., Nous pouvons calculer la probabilité conditionnelle pour une étiquette de classe avec une instance donnée ou un ensemble de valeurs d’entrée pour chaque colonne x1, x2, …, xn comme suit:

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

la probabilité conditionnelle peut alors être calculée pour chaque étiquette de classe du problème et l’étiquette avec la probabilité la plus élevée peut être renvoyée comme classification la plus probable.

la probabilité conditionnelle peut être calculée en utilisant la probabilité conjointe, bien qu’elle soit insoluble. Le théorème de Bayes fournit un moyen de principe pour calculer la probabilité conditionnelle.,

La forme simple du calcul de Bayes le Théorème est comme suit:

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

Où la probabilité que ce qui nous intéresse dans le calcul de P(A|B) est appelée la probabilité a posteriori et la probabilité marginale de l’événement P(A) est appelée avant.,

Nous pouvons définir la classification comme un problème de classification conditionnelle avec le théorème de Bayes comme suit:

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

Le P(yi) antérieur est facile à estimer à partir d’un ensemble de données, mais la probabilité conditionnelle x2,…, xn | Yi) n’est pas réalisable à moins que le nombre d’exemples ne soit extraordinairement grand, par exemple suffisamment grand pour estimer efficacement la distribution de probabilité pour toutes les différentes combinaisons possibles de valeurs.,

en tant que telle, l’application directe du théorème de Bayes devient également insoluble, d’autant plus que le nombre de variables ou de caractéristiques (n) augmente.

vous voulez apprendre la probabilité pour L’apprentissage automatique

suivez mon cours intensif de messagerie gratuit de 7 jours maintenant (avec un exemple de code).

Cliquez pour vous inscrire et obtenez également une version Ebook PDF gratuite du cours.,

Téléchargez votre Mini-cours gratuit

Bayes simplifié ou naïf

la solution à l’utilisation du théorème de Bayes pour un modèle de classification de probabilité conditionnelle est de simplifier le calcul.

Le théorème de Bayes suppose que chaque variable d’entrée Dépend de toutes les autres variables. C’est une source de complexité dans le calcul. Nous pouvons supprimer cette hypothèse et considérer chaque variable d’entrée comme indépendante l’une de l’autre.,

cela change le modèle d’un modèle de probabilité conditionnelle dépendante à un modèle de probabilité conditionnelle indépendante et simplifie considérablement le calcul.

Tout d’abord, le dénominateur est supprimé du calcul P(x1, x2, …, xn) car il s’agit d’une constante utilisée dans le calcul de la probabilité conditionnelle de chaque classe pour une instance donnée et a pour effet de normaliser le résultat.,

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

ensuite, la probabilité conditionnelle de toutes les variables étant donnée l’étiquette de classe est changée en Probabilités conditionnelles distinctes de chaque valeur de variable étant donné l’étiquette de classe. Ces variables conditionnelles indépendantes sont ensuite multipliées ensemble. Par exemple:

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

Ce calcul peut être effectué pour chacun des étiquettes de classe, et l’étiquette avec la plus grande probabilité peut être sélectionnée comme la classification pour l’instance donnée., Cette règle de décision est appelée règle de décision maximale a posteriori.

cette simplification du théorème de Bayes est courante et largement utilisée pour les problèmes de modélisation prédictive de classification et est généralement appelée Bayes naïf.

le mot « naïf” est français et a généralement une diaérèse (umlaut) sur le « i”, qui est généralement laissé de côté pour la simplicité, et « Bayes” est majuscule car il est nommé pour le révérend Thomas Bayes.,

comment calculer les probabilités antérieures et conditionnelles

maintenant que nous savons ce Qu’est naïf Bayes, nous pouvons regarder de plus près comment calculer les éléments de l’équation.

le calcul du p antérieur(yi) est simple. Il peut être estimée en divisant la fréquence des observations dans l’ensemble de données d’apprentissage qui ont la classe de l’étiquette par le nombre total d’exemples (lignes) dans l’ensemble de données d’apprentissage., Par exemple:

  • p(yi) = examples with yi / total examples

la probabilité conditionnelle d’une valeur d’entité donnée par l’étiquette de classe peut également être estimée à partir des données. Plus précisément, les exemples de données qui appartiennent à une classe donnée, et une distribution de données par variable. Cela signifie que s’il y a K classes et n variables, que k * n différentes distributions de probabilité doivent être créées et maintenues.

Une approche différente est requise en fonction du type de données de chaque entité., Plus précisément, les données sont utilisées pour estimer les paramètres de l’un des trois distributions de probabilité.

dans le cas de variables catégorielles, telles que les nombres ou les étiquettes, une distribution multinomiale peut être utilisée. Si les variables sont binaires, telles que oui / non ou Vrai / Faux, une distribution binomiale peut être utilisée. Si une variable est numérique, comme une mesure, souvent une distribution gaussienne est utilisée.

  • Binaire: distribution Binomiale.
  • Catégorique: distribution Multinomiale.
  • Numérique: distribution Gaussienne.,

Ces trois distributions sont si courantes que L’implémentation naïve de Bayes est souvent nommée d’après la distribution. Par exemple:

  • Binomial naïve Bayes: naïve Bayes qui utilise une distribution binomiale.
  • Bayes naïves Multinomiales: Bayes naïves qui utilise une distribution multinomiale.
  • Bayes naïves gaussiennes: Bayes naïves qui utilise une distribution gaussienne.

Un ensemble de données avec des types de données mixtes pour les variables d’entrée peut nécessiter la sélection de différents types de distributions de données pour chaque variable.,

L’utilisation de l’une des trois distributions communes n’est pas obligatoire; par exemple, si une variable à valeur réelle est connue pour avoir une distribution spécifique différente, telle qu’exponentielle, alors cette distribution spécifique peut être utilisée à la place. Si une variable à valeur réelle n’a pas une distribution bien définie, telle que bimodale ou multimodale, alors un estimateur de densité de noyau peut être utilisé pour estimer la distribution de probabilité à la place.

L’algorithme naïf de Bayes s’est avéré efficace et est donc populaire pour les tâches de classification de texte., Les mots d’un document peuvent être codés sous forme de vecteurs d’entrée binaires (mot présent), de nombre (occurrence de mot) ou de fréquence (tf/idf) et de distributions de probabilité binaires, multinomiales ou gaussiennes utilisées respectivement.

exemple travaillé de Naive Bayes

dans cette section, nous allons concrétiser le calcul de Naive Bayes avec un petit exemple sur un jeu de données d’apprentissage automatique.

Nous pouvons générer un petit problème de classification binaire artificiel (2 classes) en utilisant la fonction make_blobs() de l’API scikit-learn.,

l’exemple ci-dessous génère 100 exemples avec deux variables d’entrée numériques, chacune assignée à l’une des deux classes.

L’exécution de l’exemple génère l’ensemble de données et résume la taille, confirmant que l’ensemble de données a été généré comme prévu.

l’argument « random_state” est défini sur 1, ce qui garantit que le même échantillon aléatoire d’observations est généré à chaque exécution du code.

Les éléments d’entrée et de sortie des cinq premiers exemples sont également imprimés, montrant qu’en effet, les deux variables d’entrée sont numériques et les étiquettes de classe sont 0 ou 1 pour chaque exemple.,

Nous modéliserons les variables d’entrée numériques en utilisant une distribution de probabilité gaussienne.

ceci peut être réalisé en utilisant l’API norm scipy. Tout d’abord, la distribution peut être construite en spécifiant les paramètres de la distribution, par exemple la moyenne et l’écart type, puis la fonction de densité de probabilité peut être échantillonnée pour des valeurs spécifiques en utilisant la norme.fonction pdf ().

Nous pouvons estimer les paramètres de la distribution à partir de l’ensemble de données en utilisant les fonctions mean() Et std() NumPy.,

la fonction fit_distribution() ci-dessous prend un échantillon de données pour une variable et correspond à une distribution de données.

Rappelons que nous nous intéressons à la probabilité conditionnelle de chaque variable d’entrée. Cela signifie que nous avons besoin d’une distribution pour chacune des variables d’entrée et d’un ensemble de distributions pour chacune des étiquettes de classe, soit quatre distributions au total.

tout d’Abord, nous devons diviser les données en groupes d’échantillons pour chacune des étiquettes de classe.,

1
2
3
4
5

# trier les données en classes
Xy0 = X
Xy1 = X
print(Xy0.,forme, Xy1.de forme)

Nous pouvons ensuite utiliser ces groupes pour calculer les probabilités antérieures pour un échantillon de données appartenant à chaque groupe.

ce sera exactement 50% étant donné que nous avons créé le même nombre d’exemples dans chacune des deux classes; néanmoins, nous calculerons ces priors pour être complets.,

1
2
3
4
5

…,
# calculer a priori
priory0 = len(Xy0) / len(X)
priory1 = len(Xy1) / len(X)
print(priory0, priory1)

Enfin, nous pouvons appeler le fit_distribution() fonction que nous avons défini pour préparer une distribution de probabilité pour chaque variable, pour chaque classe de l’étiquette.

en liant tout cela, le modèle probabiliste complet de l’ensemble de données est répertorié ci-dessous.,

L’exécution de l’exemple divise d’abord l’ensemble de données en deux groupes pour les deux étiquettes de classe et confirme que la taille de chaque groupe est Pair et que les prieurs sont de 50%.

des distributions de probabilité sont ensuite préparées pour chaque variable pour chaque étiquette de classe et les paramètres de moyenne et d’écart type de chaque distribution sont rapportés, confirmant que les distributions diffèrent.

ensuite, nous pouvons utiliser le modèle probabiliste préparé pour faire une prédiction.,

la probabilité conditionnelle indépendante pour chaque étiquette de classe peut être calculée en utilisant le prior pour la classe (50%) et la probabilité conditionnelle de la valeur pour chaque variable.

la fonction probability() ci-dessous effectue ce calcul pour un exemple d’entrée (tableau de deux valeurs) étant donné la distribution de probabilité antérieure et conditionnelle pour chaque variable. La valeur renvoyée est un score plutôt qu’une probabilité car la quantité n’est pas normalisée, une simplification souvent effectuée lors de l’implémentation de naïve bayes.,

Nous pouvons utiliser cette fonction pour calculer la probabilité d’un exemple appartenant à chaque classe.

Tout d’abord, nous pouvons sélectionner un exemple à classer; dans ce cas, le premier exemple de l’ensemble de données.,

1
2
3

…,
# classer un exemple
Xsample, ysample = X, y

Ensuite, on peut calculer le score de l’exemple appartenant à la première classe, puis de la deuxième classe, puis de faire rapport des résultats.

la classe avec le plus grand score sera la classification résultante.

en liant cela, l’exemple complet d’ajustement du modèle naïf de Bayes et de son utilisation pour faire une prédiction est répertorié ci-dessous.,

L’exécution de l’exemple prépare d’abord les probabilités antérieures et conditionnelles comme auparavant, puis les utilise pour faire une prédiction pour un exemple.

le score de l’exemple appartenant à y=0 est d’environ 0,3 (rappelons qu’il s’agit d’une probabilité non normalisée), alors que le score de l’exemple appartenant à y=1 est de 0,0. Par conséquent, nous classerions l’exemple comme appartenant à y=0.

dans ce cas, le résultat réel ou réel est connu, y=0, ce qui correspond à la prédiction de notre modèle naïf de Bayes.,

1
2
3

P(y=0 | ) = 0.348
P(y=1 | ) = 0.,000
la Vérité: y=0

Dans la pratique, c’est une bonne idée de l’utilisation optimisée des implémentations de l’algorithme Naive Bayes. La bibliothèque scikit-learn fournit trois implémentations, une pour chacune des trois principales distributions de probabilité; par exemple, BernoulliNB, MultinomialNB et GaussianNB pour les variables d’entrée distribuées binomiales, multinomiales et gaussiennes respectivement.

Pour utiliser un modèle Bayes naïf scikit-learn, le modèle est d’abord défini, puis il est adapté à l’ensemble de données d’entraînement., Une fois ajustées, les probabilités peuvent être prédites via la fonction predict_proba() et les étiquettes de classe peuvent être prédites directement via la fonction predict ().

l’exemple complet d’ajustement D’un modèle de Bayes naïf gaussien (GaussianNB) au même ensemble de données de test est répertorié ci-dessous.

L’exécution de l’exemple correspond au modèle sur l’ensemble de données d’entraînement, puis fait des prédictions pour le même premier exemple que nous avons utilisé dans l’exemple précédent.

dans ce cas, la probabilité de l’exemple appartenant à y=0 est de 1,0 ou une certitude. La probabilité de y=1 est une très petite valeur proche de 0.0.,

enfin, l’étiquette de classe est prédite directement, correspondant à nouveau à la vérité au sol pour l’exemple.,iv>

1
2
3

Probabilités Prédites: ]
Prédit de Classe:
la Vérité: y=0

5 Conseils Lors de l’Utilisation de Naive Bayes

Cette section répertorie quelques conseils pratiques lorsque vous travaillez avec des modèles Naive Bayes.,

utiliser un KDE pour des Distributions Complexes

Si la distribution de probabilité d’une variable est complexe ou inconnue, il peut être judicieux d’utiliser un estimateur de densité du noyau ou KDE pour approximer la distribution directement à partir des échantillons de données.

un bon exemple serait le KDE gaussien.

diminution des performances avec une dépendance croissante des variables

Par définition, naïf Bayes suppose que les variables d’entrée sont indépendantes les unes des autres.

Cela fonctionne bien la plupart du temps, même lorsque certains ou la plupart des variables sont en fait dépendants., Néanmoins, les performances de l’algorithme se dégradent plus les variables d’entrée sont dépendantes.

Eviter le sous-flux numérique avec Log

le calcul de la probabilité conditionnelle indépendante pour un exemple pour une étiquette de classe implique de multiplier plusieurs probabilités ensemble, une pour la classe et une pour chaque variable d’entrée. En tant que tel, la multiplication de nombreux petits nombres ensemble peut devenir numériquement instable, d’autant plus que le nombre de variables d’entrée augmente.,

Pour surmonter ce problème, il est courant de changer le calcul du produit des probabilités à la somme de journal des probabilités. Par exemple:

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

Le calcul du logarithme naturel des probabilités a pour effet de créer des nombres plus grands (négatifs) et d’ajouter les nombres ensemble signifiera que les probabilités plus grandes seront Les valeurs résultantes peuvent toujours être comparées et maximisées pour donner l’étiquette de classe la plus probable.,

ceci est souvent appelé log-trick lors de la multiplication des probabilités.

mise à jour des Distributions de probabilité

à mesure que de nouvelles données deviennent disponibles, il peut être relativement simple d’utiliser ces nouvelles données avec les anciennes données pour mettre à jour les estimations des paramètres de la distribution de probabilité de chaque variable.

cela permet au modèle d’utiliser facilement de nouvelles données ou les distributions changeantes de données au fil du temps.

utiliser comme modèle génératif

Les distributions de probabilité résument la probabilité conditionnelle de chaque valeur de variable d’entrée pour chaque étiquette de classe.,

ces distributions de probabilité peuvent être utiles plus généralement que dans un modèle de classification.

Par exemple, les distributions de probabilité préparées peuvent être échantillonnées aléatoirement afin de créer de nouvelles instances de données plausibles. L’hypothèse d’indépendance conditionnelle retenue peut signifier que les exemples sont plus ou moins plausibles en fonction de l’interdépendance réelle entre les variables d’entrée dans l’ensemble de données.

Lecture

Cette section fournit plus de ressources sur le sujet si vous cherchez à aller plus loin.,

Tutoriels

  • Naive Bayes Tutoriel pour l’Apprentissage de la Machine
  • Naive Bayes pour l’Apprentissage de la Machine
  • Mieux Naïf de Bayes: 12 Conseils Pour tirer Le meilleur De L’Algorithme Naive Bayes

Livres

  • l’Apprentissage de la Machine, 1997.
  • apprentissage automatique: une Perspective probabiliste, 2012.
  • reconnaissance des formes et apprentissage automatique, 2006.
  • Data Mining: outils et Techniques pratiques D’apprentissage automatique, 4ème édition, 2016.

API

Articles

  • le théorème de Bayes, Wikipedia.
  • Classificateur naïf Bayes, Wikipedia.,
  • estimation maximale a posteriori, Wikipedia.

résumé

dans ce tutoriel, vous avez découvert L’algorithme naïf de Bayes pour la modélisation prédictive de classification.

plus précisément, vous avez appris:

  • Comment encadrer la modélisation prédictive de classification en tant que modèle de probabilité conditionnelle.
  • comment utiliser le théorème de Bayes pour résoudre le modèle de probabilité conditionnelle de classification.
  • comment implémenter le théorème de Bayes simplifié pour la classification appelé algorithme de Bayes naïf.

avez-vous des questions?,
Posez vos questions dans les commentaires ci-dessous et je ferai de mon mieux pour y répondre.

Obtenir une Poignée sur la Probabilité pour l’Apprentissage de la Machine!

Développer Votre Compréhension de la Probabilité

…avec seulement quelques lignes de code python

Découvrez comment dans mon nouvel Ebook:
probabilité pour L’apprentissage automatique

Il fournit des tutoriels d’auto-étude et des projets de bout en bout sur:
théorème de Bayes, optimisation Bayésienne, Distributions, maximum de vraisemblance, entropie croisée, calibrage des modèles
et bien plus encore…,

enfin exploiter L’incertitude dans vos projets

sauter les universitaires. Seulement Les Résultats.Voir Ce qui est à l’Intérieur de

Tweet partager Partager

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *