Naive Bayes Classifier pour Machine Learning

de | 26 juillet 2017

Naive Bayes Classifier est un algorithme populaire en Machine Learning. C’est un algorithme du Supervised Learning utilisé pour la classification. Il est particulièrement utile pour les problématiques de classification de texte. Un exemple d’utilisation du Naive Bayes est celui du filtre anti-spam.

Regardons de plus prés comment fonctionne cet algorithme.

Probabilités conditionnelles

Le naive Bayes classifier se base sur le théorème de Bayes. Ce dernier est un classique de la théorie des probabilités. Ce théorème est fondé sur les probabilités conditionnelles.

Probabilités conditionnelles : Quelle est la probabilité qu’un événement se produise sachant qu’un autre événement s’est déjà produit.

Exemple :

Supposons qu’on ait une classe de lycéens. Soit A et B les deux événements suivants :

  • l’événement A : l’élève est une fille.
  • L’événement B : l’élève pratique l’allemand.

Quelle est la probabilité qu’on choisisse au hasard une fille pratiquant l’allemand ?

Le théorème de Bayes permet de calculer ce genre de probabilité.

Notons P la probabilité d’un événement.

P(eleve \ est \ une \ fille \ ET \ eleve \ pratique \ allemand) = P(eleve \ est \ une \ fille) * P(eleve \ pratique \ allemand \mid eleve \ est \ une \ fille)

Cela équivaut à calculer

P(eleve \ est \ une \ fille \ ET \ eleve \ pratique \ allemand) = P(eleve \ pratique \ allemand) * P(eleve \ est \ une \fille \mid eleve \ pratique \ allemand)

Le terme P(A | B) se lit : la probabilité que l’événement A se réalise sachant que l’événement B s’est déjà réalisé.

On appelle le terme A : l’évidence (faux ami avec le mot anglais Evidence). Le terme B s’appelle Outcome.

Théorème de Bayes

Naive Bayes Classifier

Formule du théorème de Bayes

Reprenons l’exemple des lycéens pratiquant l’allemand. Imaginons le jeu de données suivant :

Fille (A) Garçon (\neg A) Totaux
Allemand (B) 10 7 17
Autre langue (\neg B) 4 9 13
Totaux 14 16 30

Calculons la probabilité suivante : Quelle est la probabilité qu’on tire au hasard un élève parlant Allemand sachant qu’elle est une fille ?

Selon la formule de Bayes on a :

P(Allemand \mid Fille) = P(B \mid A) = \frac{P( B \cap A)} {P(A)} = \frac{P(A \mid B) * P(B)}{P(A)}

  • P(A) est la probabilité de prendre au hasard une fille de la population des élèves de la classe. On appelle P(A) la probabilité antérieure (prior probability).

P(A) = \frac{cardinal(A)}{cardinal(\Omega)} = \frac{14}{30} \approx 0.4666

P(B \cap A) = \frac{cardinal(B \cap A)}{cardinal(\Omega)} = \frac{10}{30} \approx 0.3333

Ce qui donne :

P(B \mid A) = \frac{\frac{10}{30}}{\frac{14}{30}} \approx \frac{0.3333}{0.4666} \approx 0.7143

Note:

  • le cardinal d’un ensemble est le nombre d’éléments dans ce dernier
  • cardinal (\Omega) représente l’ensemble des lycéens de notre exemple (l’univers de probabilités)

Naive Bayes Classifier

Lors de l’exemple précédent, nous avons appliqué le théorème de Bayes avec une seule variable prédictive (Evidence) : A savoir le sexe de l’élève. Dans les vraies applications du Naive Bayes, on calcule le résultat (Outcome) en se basant sur plusieurs variables. L’application du théorème de Bayes sur plusieurs variables rend le calcul complexe. Pour contourner cela, une approche consiste à prendre en considération ces variables indépendamment les unes des autres. Il s’agit d’une hypothèse forte. Généralement, les variables prédictives sont liées entre elles. Le terme « naïve » vient du fait qu’on suppose cette indépendance des variables.

Naïve Bayes est particulièrement prisé dans les problèmes de classification de texte

Si on prend l’exemple de classification de mails en \{SPAM, NON SPAM\}, Naïve Bayes se basera sur la fréquence d’occurrence des mots dans le mail pour en définir la catégorie. Lors de sa classification, l’algorithme supposera que les mots du mail « apparaissent » indépendamment les uns des autres. Évidemment, d’un point de vue linguistique et sémantique, cette supposition est fausse !

Classification multi-classes avec Naive Bayes

Pour mieux comprendre le Naive Bayes Classifier, déroulons le sur un exemple simple.

Note : l’exemple ci-dessus est inspiré d’une discussion sur le site StackOverflow.

Supposons qu’on ait un jeu de données sur 1000 fruits. On dispose de trois types : Banane, Orange, et « autre ». Pour chaque fruit, on a 3 caractéristiques :

  • Si le fruit est long ou non
  • S’il est est sucré ou non
  • Si sa couleur est jaune ou non

Notre jeu de données se présente comme suit :

Type Long petit ( \neg long) sucré \neg sucré Jaune Pas jaune Total
Banane 400 100 350 150 450 50 500
Orange 0 300 150 150 300 0 300
Autre fruit 100 100 150 50 50 150 200
Total 500 500 650 350 800 200 1000

Note:

  • le symbole \neg signifie la négation ( \neg froid = chaud)

L’idée du jeu est de prédire le type d’un fruit (orange, banane ou autre) qu’on n’a pas encore vu. Ceci en se basant sur ses caractéristiques.

Supposons que quelqu’un nous demande de lui donner le type d’un fruit qu’il a. Ses caractéristiques sont les suivantes :

  • Il est jaune
  • Il est long
  • Il est sucré

Pour savoir s’il s’agit d’une banane, ou d’une orange ou d’un autre fruit, il faut qu’on calcule les trois probabilités suivantes:

  • P(Banane \mid long, jaune, sucre) : La probabilité qu’il s’agisse d’une banane sachant que le fruit est long, jaune et sucré
  • P(Orange \mid long, jaune, sucre) : La probabilité qu’il s’agisse d’une orange sachant que le fruit est long, jaune et sucré
  • P(Autre fruit \mid long, jaune, sucre) : La probabilité qu’il s’agisse d’un autre fruit sachant que ce dernier est  long, jaune et sucré

Le type du fruit « inconnu » qu’on cherche à classifier sera celui où on a la plus grande probabilité.

Selon la formule de Bayes, on a :

  • P(Banane \mid long, jaune, sucre) = \frac{P(Long \mid Banane) * P(Sucre \mid Banane) * P(Jaune \mid Banane) * P(Banane)}{P(Long) * P(Sucre) * P(Jaune)}

Avec notre jeu de données, on peut calculer facilement un certain nombre de probabilités :

P(Banane) = \frac{cardinal(Banane)}{cardinal(Tous \ les \ fruits)} = \frac{50}{100} = 0.5

De même :

  • P(Orange) = 0.3
  • P(Autre fruit) = 0.2
  • P(Long) = 0.5
  • P(Sucre) = 0.65
  • P(Jaune) = 0.8

Calculons maintenant le terme : P(Long | Banane) : Probabilité que le fruit est long sachant qu’il s’agit d’une banane.

P(Long | Banane) = \frac{cardinal (Banane \ ET \ Long)}{cardinal (Banane)}  = \frac {400}{500}= 0.8

Avec la même logique, on peut calculer les probabilités suivantes : P(Sucre | Banane) et P(Jaune | Banane). Je vous invite à les calculer comme guise d’entraînement. 😉

Maintenant, qu’on a toutes nos probabilités utiles pour notre calcul, on peut calculer la probabilité suivante :

P(Banane \mid long, jaune, sucre) = \frac{0.8 * 0.7 * 0.9 * 0.5}{0.5*0.65*0.8} = \frac{0.252}{0.26} \approx 0.969

Avec la même logique on obtient :

P(Banane \mid long, jaune, sucre) = 0

P(Autre \ fruit \mid long, jaune, sucre)  \approx 0.072

 

On remarque que la probabilité que notre fruit soit une banane P(Banane \mid long, jaune, sucre) est largement plus grande que celle des autres probabilités. On classifie notre fruit inconnu comme étant une banane.

 

Avantages et limitations du Naive Bayes Classifier ?

Avantages

En se basant sur l’exemple de classification des fruits, on remarque plusieurs avantages pour cet algorithme :

  • le Naive Bayes Classifier est très rapide pour la classification : en effet les calculs de probabilités ne sont pas très coûteux.
  • La classification est possible même avec un petit jeu de données

Inconvénients

  • l’algorithme Naive Bayes Classifier suppose l’indépendance des variables : C’est une hypothèse forte et qui est violée dans la majorité des cas réels.

Contre intuitivement, malgré la violation de la contrainte d’indépendance des variables, Naïve Bayes donne de bons résultats de classification. La publication de Harry Zhang donne une explication sur cette performance contre intuitive (Le publication est assez technique 🙂 ).

 

Vous connaissez maintenant le fonctionnement en coulisse du Naive Bayes Classifier. Si vous avez des questions sur son fonctionnement n’hésitez pas à les poster en commentaire. Et si l’article vous plait, n’oubliez pas de le faire partager ! 🙂

6 réflexions au sujet de « Naive Bayes Classifier pour Machine Learning »

  1. Ping : Créer son premier filtre Anti-spam avec Naïve Bayes et Python - Apprendre le Machine Learning de A à Z

  2. Christophe Bunn

    Bonjour, article très instructif pour quelqu’un comme moi qui entend souvent parler du Naive Bayes Classifier et n’a aucune idée de ce dont il s’agit.

    Je pense qu’il y a une coquille : P (Orange | long, jaune, sucré) = 0 et non pas Banane comme vous l’avez écrit.

    Bien cordialement.

    Répondre
  3. Stephane

    Bonjour,
    très bon article de vulgarisation !
    Comme Christophe, je pense qu’il y a une micro coquille sur le P(Orange|long, jaune,sucré) 🙂
    Cdt

    Répondre
  4. Grégory

    Bonjour,

    je pense qu’il y a une erreur sur le dénominateur (erreur qu’on retrouve sur de nombreux sites web). L’hypothèse utilisée dans un classifieur naïf bayésien est l’hypothèse d’indépendance **conditionnelle** entre les caractéristiques, c’est-à-dire que les caractéristiques « long », « jaune » et « sucré » sont indépendantes SACHANT une classe donnée (par exemple « banane »).
    Mais un classifieur bayésien ne fait pas l’hypothèse d’indépendance « classique », c’est-à-dire que vous ne pouvez pas écrire P(long, sucré, jaune) = P(long) * P(sucré) * P(jaune) ; les propriétés que vous calculez sont fausses (il suffit de voir que la somme des propriétés P(classe | caractéristiques) n’est pas égale à 1 dans votre exemple).

    En pratique cependant, ce dénominateur étant commun à toutes les classes, il agit comme un coefficient de proportionnalité / normalisation et il ne fausse pas le principe du maximum a posteriori (la classe retenue sera bien celle ayant la plus grande probabilité). Autrement dit, vous tomberez sur un résultat correct, mais avec un raisonnement contenant une erreur.

    Répondre
    1. Younes Benzaki Auteur de l’article

      Bonjour Grégory,

      Merci pour votre commentaire.

      L’hypothèse d’indépendance des variables est justement supposée dans le cas « naïf ». C’est pour cela qu’on a pu faire le produit des probabilités conditionnelles. Par ailleurs, et c’est la ou je suis d’accord avec vous, si on ne suppose pas cette indépendances, effectuer un produit des probabilités conditionnelles n’est pas pertinent.

      Bien à vous

      Répondre
  5. Grégory

    (dans mon message précédent, il faut bien sûr lire « probabilité » à la place des mots « propriétés »)

    Répondre

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.