Classifieur Naïf Bayésien

August 5, 2013
By

(This article was first published on Learning Data Science , and kindly contributed to R-bloggers)

Introduction

Le classifieur naïf bayésien est l’une des méthodes les plus simples en apprentissage supervisé basée sur le théorème de Bayes.
il est peu utilisé par les praticiens du data mining au détriment des méthodes traditionnelles que sont les arbres de décision ou les régressions logistiques.
Un avantage de cette méthode est la simplicité de programmation, la facilité d’estimation des paramètres et sa rapidité (même sur de très grandes bases de données). Malgré ses avantages, son peu d’utilisation en pratique vient en partie du fait que ne disposant pas d’un modèle explicite simple (l’explication de probabilité conditionnelle à priori), l’intérêt pratique d’une telle technique et remise en question.

Le classifieur naïf bayésien : L’indépendance conditionnelle

On considère deux variables aléatoires X et Y. Et on essaye de prédire Y à partir de X. Imaginons par exemple que :
Y = “Acheter” ou “ Ne pas acheter” X = “Cher” ou “ Moins cher”

Acheter Ne pas acheter
Cher 50 60
Pas cher 120 90

La règle de Bayes indique que :
\(P( Y = Acheter | X =cher ) =P( Y = Acheter et X = cher ) / P( X = cher)\) ou encore \[P( Y = Ne pas acheter | X = cher ) = P( Y = Ne pas acheter et X = cher )/ P( X = cher )\]
La règle de décision sera de dire : Si la première proabilité est plus grande, alors l’achat sera effectué.
Le classifieur naïf bayésien découle directement de cette formule. Ainsi donc, \(P( Y = Acheter | X =cher ) =P(X= cher et Y = Acheter ) * P( Y= Acheter) P( X = cher)\)
Le terme naïf désigne ici le fait que les descripteurs sont conditionnellement indépendants. Ce qui en pratique n’est presque jamais vrai. Mais cela ne remet pas en cause les résultats comme on peut le lire ici : http://www.cs.iastate.edu/~honavar/bayes-lewis.pdf
En résumé :
Pour mettre en place un classifieur naïf de Bayes :

  • On détermine un ensemble d’apprentissage
  • On détermine des probabilités à priori de chaque classe (par exemple en observant les effectifs)
  • On applique la règle de Bayes : \(P(y=c/X=x)= P(X=x/Y=c) * P(Y=c) /(PX=x)\) pour obtenir la probabilité à posteriori des classes au point x.
  • On choisit la classe la plus probable.

Dans la formule de Bayes :
\(P(Y=c)\) : La proabilité à priori
\(P(X=x/Y=c)\) : La probailité conditionnelle d’appartenance à la classe c, qui peut être interprété comme la vraisemblance de cette classe.

Mise en oeuvre sous R

Le logiciel R fournit à travers plusieurs packages des fonctions pour mettre en oeuvre une classification à l’aide d’un bayésien naïf.
Nous allons utiliser le package e1071.
Pour une application, nous allons utiliser un jeu de données de G. Saporta qui contient les données relatives aux pronostics de survie suite à un infacrtus des patients selon des cractéristiques observées telles que : la fréquence cardiaque, le nombre de pulsations, etc…

rm(list = ls())
setwd("F:/NaivesBayes")
library(e1071)
## Loading required package: class

# Les données
survie <- read.table(file = "Data/survie.txt", header = T)
head(survie)
##   FRCAR INCAR INSYS PRDIA PAPUL PVENT REPUL  PRONO
## 1 90 1.71 19.0 16 19.5 16.0 912 SURVIE
## 2 90 1.68 18.7 24 31.0 14.0 1476 DECES
## 3 120 1.40 11.7 23 29.0 8.0 1657 DECES
## 4 82 1.79 21.8 14 17.5 10.0 782 SURVIE
## 5 80 1.58 19.7 21 28.0 18.5 1418 DECES
## 6 80 1.13 14.1 18 23.5 9.0 1664 DECES
# Echantillon d'apprentissage & de test
set.seed(1)
n = dim(survie)[1]
index = sample(n, 0.7 * n)
Appren = survie[index, ]
Test = survie[-index, ]
# Modélisation
nb.model <- naiveBayes(PRONO ~ ., data = Appren)

l’implémentation du modèle est simple en utilisant la fonction. Les résultats en sortie sont les suivants

## 
## Naive Bayes Classifier for Discrete Predictors
##
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
##
## A-priori probabilities:
## Y
## DECES SURVIE
## 0.3878 0.6122
##
## Conditional probabilities:
## FRCAR
## Y [,1] [,2]
## DECES 92.16 14.87
## SURVIE 87.13 14.69
##
## INCAR
## Y [,1] [,2]
## DECES 1.366 0.3519
## SURVIE 2.353 0.6219
##
## INSYS
## Y [,1] [,2]
## DECES 15.01 3.834
## SURVIE 27.93 9.500
##
## PRDIA
## Y [,1] [,2]
## DECES 21.42 5.409
## SURVIE 15.03 4.560
##
## PAPUL
## Y [,1] [,2]
## DECES 28.55 7.695
## SURVIE 20.93 5.519
##
## PVENT
## Y [,1] [,2]
## DECES 11.87 4.216
## SURVIE 8.75 3.997
##
## REPUL
## Y [,1] [,2]
## DECES 1777.0 630.9
## SURVIE 766.3 292.9

La qualité du modèle dépend de sa capacité à bien classer dans le jeu de données test

PRONOTH <- predict(object = nb.model, newdata = Test)
Test.mod <- cbind(Test, PRONOTH)
head(Test.mod, 5)
##   FRCAR INCAR INSYS PRDIA PAPUL PVENT REPUL  PRONO PRONOTH
## 2 90 1.68 18.7 24 31.0 14.0 1476 DECES DECES
## 3 120 1.40 11.7 23 29.0 8.0 1657 DECES DECES
## 5 80 1.58 19.7 21 28.0 18.5 1418 DECES DECES
## 6 80 1.13 14.1 18 23.5 9.0 1664 DECES DECES
## 9 78 2.16 27.7 15 20.5 11.5 759 SURVIE SURVIE
tail(Test.mod, 5)
##    FRCAR INCAR INSYS PRDIA PAPUL PVENT REPUL  PRONO PRONOTH
## 50 75 1.21 16.1 19 24 4 1587 DECES DECES
## 51 80 2.41 30.9 19 24 7 797 SURVIE SURVIE
## 64 100 1.76 17.6 23 33 2 1500 SURVIE DECES
## 70 87 2.51 28.8 16 24 20 765 DECES SURVIE
## 71 100 2.31 23.1 8 12 1 416 SURVIE SURVIE
# Taux de bien classé
(Confusion = table(Test.mod$PRONO, Test.mod$PRONOTH))
##         
## DECES SURVIE
## DECES 9 1
## SURVIE 2 10
# En pourcetages:
round(prop.table(Confusion), 2)
##         
## DECES SURVIE
## DECES 0.41 0.05
## SURVIE 0.09 0.45

Soit un taux de bien classé de 86.3636 %
Comparons la classification naïve bayésienne à des méthodes traditionnelles comme une régession logistique

log.model <- glm(PRONO ~ ., data = Appren, family = "binomial")
log.model
## 
## Call: glm(formula = PRONO ~ ., family = "binomial", data = Appren)
##
## Coefficients:
## (Intercept) FRCAR INCAR INSYS PRDIA
## -36.27863 0.22251 -0.22697 1.25918 -0.41212
## PAPUL PVENT REPUL
## -0.49393 0.26358 0.00785
##
## Degrees of Freedom: 48 Total (i.e. Null); 41 Residual
## Null Deviance: 65.4
## Residual Deviance: 20.2 AIC: 36.2
LOG.PRONOTH <- predict(object = log.model, newdata = Test, type = "response")
Log.test <- cbind(Test, LOG.PRONOTH = ifelse(LOG.PRONOTH >= 0.5, "SURVIE", "DECES"))
# Taux de bien classé
(LOG.Confusion = table(Log.test$PRONO, Log.test$LOG.PRONOTH))
##         
## DECES SURVIE
## DECES 9 1
## SURVIE 2 10
# En pourcetages:
round(prop.table(LOG.Confusion), 2)
##         
## DECES SURVIE
## DECES 0.41 0.05
## SURVIE 0.09 0.45

Soit un taux de bien classé de 86.3636 %
On peut par ailleurs vérifier si les erreurs sont commises au même endroit, ce qui indiquerait le même comportement des algorithmes : Ce qui est bien le cas

(ConfMethode = table(Log.test$LOG.PRONOTH, Test.mod$PRONOTH))
##         
## DECES SURVIE
## DECES 11 0
## SURVIE 0 11

A faire :

  • Tester si ce comportement est identique sur une volumétrie plus importante.
  • D’autres classifieurs naïfs
  • Implémenter manuellement un classifieur naïf
  • Détailler un exemple numérique sur un exemple

To leave a comment for the author, please follow the link and comment on their blog: Learning Data Science .

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...



If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.

Search R-bloggers


Sponsors

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)