Initiation à l’utilisation de R pour le Machine Learning

de | 15 mai 2018

 

Note : cet article invité a été écrit par Claire Della Vedova du blog Statistiques et logiciel R.

C’est quoi R ?

R c’est à la fois un logiciel (libre de droit), et un langage de programmation, orienté objet et interprété (il ne nécessite donc pas de compilation). Au départ, R était surtout utilisé dans les domaines des statistiques et des mathématiques. Aujourd’hui il est, avec Python, l’un des deux outils les plus utilisés en data science. R est donc tout à fait adapté au Machine Learning.

Fonctionnement de R

R dispose d’un environnement (ou IDE pour Integrated Development Environment), nommé RStudio.

R Studio est composé de 4 fenêtres qui permettent, entre autres, l’écriture et l’exécution de scripts, la visualisation des données, la gestion du workspace, l’importation de packages, la consultation de l’aide, et même de faire du versionnage.

machine learning avec R

De façon plus précise :

  • La première fenêtre est dédiée à l’édition (ouverture, création, modification) des scripts.
  • La seconde fenêtre contient la console du logiciel, qui permet l’exécution du code. Les lignes de commandes peuvent y être entrées directement, ou envoyées depuis la fenêtre supérieure en se positionnant en début de ligne et à l’aide des touches CTRL+ENTER
  • la troisième fenêtre est dédiée à la gestion du workspace, il s’agit de tous les objets (données, tableau , constante etc…) créés par l’exécution du code. Cette fenêtre permet également d’avoir accès à l’historique des commandes exécutées, ou encore de faire du versionnage.
  • La quatrième fenêtre dispose également de plusieurs onglets qui permettent entre autres :
    • d’accéder à un explorateur de fichier
    • la visualisation les plots réalisés
    • l’importation de packages
    • d’accéder à l’aide sur les fonctions.

Pour plus de détails sur l’installation et l’utilisation du logiciel R et de son environnement R Studio, vous pouvez consulter cet article.

Les outils R dédiés au Machine Learning

Le logiciel R et les packages « officiels » sont disponibles sur le site du CRAN (Comprehensive R Archive Network).

Ce site propose également des Task Views. Il s’agit de pages listant l’ensemble des packages « officiels » spécifiques à un domaine particulier. Il existe, par exemple, une task view pour les séries temporelles, ou encore pour les analyses spatiales. Et il en existe une dédiée au Machine Learning et Statistical Learning !

Si vous allez y faire un tour, vous verrez que les packages sont regroupés par sous-thème, et qu’ils sont extrêmement nombreux !

Mais rassurez vous, pour débuter le machine learning avec R, le package « caret », développé par Max Kuhn est largement suffisant. Il est l’équivalent du package « Scikit Learn » sous Python.

caret permet de préparer les données (pre processing), de les splitter en test/train, de réaliser l’apprentissage et les prédictions et d’évaluer l’ensemble. Il permet également d’utiliser d’autres approches de cross validation, et il intègre un nombre très important d’algorithmes d’apprentissage de classification et de régression, soit directement, soit en faisant appel à d’autres packages.

Le package caret dispose enfin d’une documentation en ligne très complète, ainsi qu’une cheat sheet.

Pour importer le package caret (ou un autre), il suffit de cliquer sur l’onglet « Packages » de la 4ème fenêtre (en bas à droite), puis sur « Install », et d’écrire le nom du package souhaité.

machine learning avec R

Un exemple de Machine Learning avec R

Pour vous montrer un exemple simple de Machine Learning avec R, nous allons traiter un problème de classification binaire avec le package caret.

Les données

Pour cela, nous allons utiliser un jeu de données provenant du site « Institute for Digital Research and Education », de l’Université de Californie à Los Angeles. Ce jeu de données concerne 400 candidats et s’intéresse à leur admission, ou non, dans une école supérieure.

# importation des données depuis le site de l'idre ucla
mydata <- read.csv("https://stats.idre.ucla.edu/stat/data/binary.csv")

Le jeu de données comporte une variable réponse de type binaire
(variable admit), et trois variables prédictives :

  • gre (graduate record exam score),
  • gpa (grade point average),
  • rank(prestige of the undergraduate institution) qui va de 1
    (meilleur prestige) à 4 (prestige plus faible).

 # visualisation de la structures des données
    str(mydata)

    ## 'data.frame':    400 obs. of  4 variables:
    ##  $ admit: int  0 1 1 1 0 1 1 0 1 0 ...
    ##  $ gre  : int  380 660 800 640 520 760 560 400 540 700 ...
    ##  $ gpa  : num  3.61 3.67 4 3.19 2.93 3 2.98 3.08 3.39 3.92 ...
    ##  $ rank : int  3 3 1 4 4 2 1 2 3 2 ...

L’admission correspond à valeur 1 de la variable admit.

Afin d’utiliser ce jeu de données dans un algorithme de classification binaire, nous allons passer les variables admit et rank en facteurs.

mydata$rank <- as.factor(mydata$rank)
mydata$admit <- as.factor(mydata$admit)

La sortie de la commande summary nous permet de vérifier que le jeu de données ne comporte pas de donnneés manquantes.

 
summary(mydata)

    ##  admit        gre             gpa        rank   
    ##  0:273   Min.   :220.0   Min.   :2.260   1: 61  
    ##  1:127   1st Qu.:520.0   1st Qu.:3.130   2:151  
    ##          Median :580.0   Median :3.395   3:121  
    ##          Mean   :587.7   Mean   :3.390   4: 67  
    ##          3rd Qu.:660.0   3rd Qu.:3.670          
    ##          Max.   :800.0   Max.   :4.000

Le modèle

Il s’agit ici d’entraîner un modèle de classification afin de prédire l’admission, ou non, des candidats en fonction des variables gre, gpa, et rank.

Pour cela, j’ai choisi d’utiliser un modèle de régression logistique car il s’agit d’un modèle relativement simple et répandu.

Pour utiliser l’algorithme de régression logistique, le package caret à besoin du package e1071 ; il est donc nécessaire de l’importer également. Une fois importés (comme expliqué plus haut), les packages doivent être chargés dans R, à l’aide de la fonction library().

library(caret) # sert à charger le package caret préalablement installé
library (e1071)# sert à charger le package e1071 préalablement installé

Processus

Split du jeu de données en deux parties

J’ai choisi d’utiliser une approche de cross validation de type « Valiation set approach ». Cela consiste à séparer, aléatoirement le jeu de données en 2 parties, avec une stratification sur la variable réponse (pour obtenir environ les mêmes pourcentages d’admission et non admission dans les deux parties). La première partie, appelée « training » contiendra 70% des données et servira à l’apprentissage du modèle de régression logistique. Le second, nommé « testing », sera constitué des 30% de données restantes et servira à
évaluer la qualité de prédiction du modèle en comparant l’admission prédite avec l’admission réelle des candidats.

La fonction createDataPartition() est utilisée pour créer la partition du jeu de données. Cette fonction renvoi un vecteur d’indices des observations qui feront partie de la partie « training ».

set.seed(2) #sert à fixer le graine du tirage aléatoire

training.idx <- createDataPartition(mydata$admit, p=0.7, list = FALSE) 

training <- mydata[training.idx,] # creation du jeu de données "train" 
testing <- mydata[-training.idx,] # creation du jeu de données "test"

dim(training)

## [1] 281   4

round(table(training$admit)/nrow(training),2)

## 
##    0    1 
## 0.68 0.32

Le jeu de données « training », comporte 281 données. Les pourcentages d’admission et de non-admission sont respectivement de 32 et 68%.

dim(testing)

## [1] 119   4

round(table(testing$admit)/nrow(testing),2)

## 
##    0    1 
## 0.68 0.32

Le jeu de données « training », comporte 119 données, avec des pourcentages d’admission et de non-admission identiques à ceux de la partie training.

Entrainement du modèle de régression logistique

La seconde étape consiste à entraîner le modèle avec les données « training ». Pour cela, on utilise la fonction train.

logit.fit <- train(admit ~ ., data = training,method="glm")

Les coefficients du modèle, et d’autres informations, peuvent être consultés avec la fonction summary.

summary(logit.fit)

    ## 
    ## Call:
    ## NULL
    ## 
    ## Deviance Residuals: 
    ##     Min       1Q   Median       3Q      Max  
    ## -1.5611  -0.8904  -0.6394   1.1836   2.0986  
    ## 
    ## Coefficients:
    ##              Estimate Std. Error z value Pr(>|z|)   
    ## (Intercept) -3.845127   1.333519  -2.883  0.00393 **
    ## gre          0.002081   0.001339   1.555  0.12006   
    ## gpa          0.767896   0.378486   2.029  0.04247 * 
    ## rank2       -0.673402   0.389861  -1.727  0.08412 . 
    ## rank3       -0.922505   0.420541  -2.194  0.02826 * 
    ## rank4       -1.642864   0.512834  -3.204  0.00136 **
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    ## 
    ## (Dispersion parameter for binomial family taken to be 1)
    ## 
    ##     Null deviance: 350.90  on 280  degrees of freedom
    ## Residual deviance: 323.76  on 275  degrees of freedom
    ## AIC: 335.76
    ## 
    ## Number of Fisher Scoring iterations: 4

Prédiction sur l’échantillon testing

La troisième étape consiste à réaliser les prédictions sur le jeu de données testing, comme cela :

 pred <- predict(logit.fit,newdata=testing)
 table(pred)

    ## pred
    ##   0   1 
    ## 110   9

Evaluation

Il s’agit enfin d’évaluer le modèle de classification, en créant une matrice de confusion (tableau à double entrée, celle des observations et celle des prédictions), et en calculant divers paramètres statistiques associés. Cela se fait très simplement à l’aide de la fonction confusionMatrix, comme cela :

mat <- confusionMatrix(data=pred,reference=testing$admit)
    mat

    ## Confusion Matrix and Statistics
    ## 
    ##           Reference
    ## Prediction  0  1
    ##          0 79 31
    ##          1  2  7
    ##                                           
    ##                Accuracy : 0.7227          
    ##                  95% CI : (0.6332, 0.8008)
    ##     No Information Rate : 0.6807          
    ##     P-Value [Acc > NIR] : 0.1888          
    ##                                           
    ##                   Kappa : 0.2             
    ##  Mcnemar's Test P-Value : 1.093e-06       
    ##                                           
    ##             Sensitivity : 0.9753          
    ##             Specificity : 0.1842          
    ##          Pos Pred Value : 0.7182          
    ##          Neg Pred Value : 0.7778          
    ##              Prevalence : 0.6807          
    ##          Detection Rate : 0.6639          
    ##    Detection Prevalence : 0.9244          
    ##       Balanced Accuracy : 0.5798          
    ##                                           
    ##        'Positive' Class : 0               
    ##

Le paramètre « Accuracy » nous indique que 72% des prédictions sont correctes. Néanmoins, nous pouvons voir que la spécificité (la capacité du test à prédire une admission quand celle-ci a réellement eu lieu), est faible, puisqu’elle est seulement de l’ordre de 18% ! Le jeu de données testing comportait 38 admissions, le modèle n’en a prédit que 7.

Il est alors très facile d’essayer un autre algorithme de classification. Par exemple, ici, une classification naïve bayésienne.

 nb.fit <- naiveBayes(admit ~ ., data = training)
    nb.pred <- predict(nb.fit,newdata=testing)
    table(nb.pred)

    ## nb.pred
    ##   0   1 
    ## 100  19

    nb.mat <- confusionMatrix(data=nb.pred,reference=testing$admit)
    nb.mat

    ## Confusion Matrix and Statistics
    ## 
    ##           Reference
    ## Prediction  0  1
    ##          0 72 28
    ##          1  9 10
    ##                                           
    ##                Accuracy : 0.6891          
    ##                  95% CI : (0.5977, 0.7707)
    ##     No Information Rate : 0.6807          
    ##     P-Value [Acc > NIR] : 0.465554        
    ##                                           
    ##                   Kappa : 0.1753          
    ##  Mcnemar's Test P-Value : 0.003085        
    ##                                           
    ##             Sensitivity : 0.8889          
    ##             Specificity : 0.2632          
    ##          Pos Pred Value : 0.7200          
    ##          Neg Pred Value : 0.5263          
    ##              Prevalence : 0.6807          
    ##          Detection Rate : 0.6050          
    ##    Detection Prevalence : 0.8403          
    ##       Balanced Accuracy : 0.5760          
    ##                                           
    ##        'Positive' Class : 0               
    ##

Le taux de prédiction est un peu plus faible, mais la spécificité a été augmentée ; ici 10 admissions ont été prédites sur les 38 réelles.

Envie d’en savoir plus?

J’espère que ce petit exemple vous aura convaincu qu’il est plutôt facile de faire du Machine Learning avec R. Si vous voulez aller plus loin, je vous recommande les quatre ressources suivantes, elles sont disponibles gratuitement :

Et si vous voulez en savoir plus sur l’utilisation de R, n’hésitez à consulter le blog Statistiques et logiciel R 😉

Crédits photos : mohamed_hassan

2 réflexions au sujet de « Initiation à l’utilisation de R pour le Machine Learning »

  1. Ben Romdhane

    Bonjour,
    J’ai pas compris s’il vous plait « Le jeu de données testing comportait 38 admissions, le modèle n’en a prédit que 7. » dans la partie évaluation du modèle .
    D’où vient ces deux valeurs et comment vous avez analiser qu’i y’a 7 prédites sur 38 réélles???
    Merci par avance

    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.