Chapitre 6 Faire de la régression sur R
Les problèmes de régression et de classification supervisée consistent à expliquer et/ou prédire une sortie y∈Y avec
- Y=R pour la régression
- Y de cardinal fini pour la classification supervisée,
par des entrées x∈Rp. Il s’agit donc de trouver une fonction m:Rp→Y à partir de données (X1,Y1),…,(Xn,Yn).
Ces données sont souvent collectées dans un dataframe df
de la forme
Y | X1 | X2 | … | Xp |
---|---|---|---|---|
y1 | x1,1 | x1,2 | … | x1,p |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
yn | xn,1 | xn,2 | … | xn,p |
Le protocole pour construire un algorithme de régression sur R est toujours le même. Il faut spécifier :
- la méthode (ou l’algorithme)
- la variable à expliquer
- les variables explicatives
- le jeu de données
- les éventuelles options de la méthode considérée.
Par exemple la commande
method(Y~X1+X3,data=df,...)
ajustera le modèle method pour expliquer Y par X1 et X3 avec les données dans df (les points représentent d’éventuelles options). Voici quelques exemples de méthodes :
fonction R | algorithme | Package | Problème |
---|---|---|---|
lm | modèle linéaire | Reg | |
glm | modèle logistique | Class | |
lda | analyse discriminante linéaire | MASS | Class |
svm | Support Vector Machine | e1071 | Class |
knn.reg | plus proches voisins | FNN | Reg |
knn | plus proches voisins | class | Class |
rpart | arbres | rpart | Reg et Class |
glmnet | ridge et lasso | glmnet | Reg et Class |
gbm | boosting | gbm | Reg et Class |
randomForest | forêts aléatoires | randomForest | Reg et Class |
Remarque: pour glmnet
, on ne peut pas utiliser de formule de la forme Y~.
. Il faut spécifier une matrice pour les X et un vecteur pour Y. La fonction model.matrix peut se révéler très utile pour calculer la matrice des X.
Puisqu’il existe un grand nombre d’algorithmes pour répondre à un même problème de régression, il est important de définir des critères de performance afin de les comparer. Ces critères sont généralement inconnus et doivent être estimés à l’aide de procédure de type apprentissage/validation ou validation croisée. On a souvent besoin d’utiliser la fonction predict pour calculer ces critères. Cette fonction est une fonction générique : on peut utiliser predict pour une régression linéaire, logistique, un arbre, une forêt aléatoire… Pour obtenir l’aide de cette fonction pour
- la régression linéaire : taper help(predict.lm)
- la régression logisitque : taper help(predict.glm)
- les régressions pénalisées : taper help(predict.glmnet)
- les arbres : taper help(predict.rpart)
- les forêts aléatoires : taper help(predict.randomForest)
- …
Dans la suite on suppose que Y=R et on considère le modèle de régression Y=m(X)+ε. La performance d’un estimateur ˆm de m sera mesurée par son erreur quadratique de prédiction : E[(Y−ˆm(X))2].
6.1 Modèle linéaire : fonctions lm et predict
On considère le modèle de régression linéaire Y=β0+β1X1+⋯+βpXp+ε où X1,…,Xp sont les variables explicatives, Y la variable à expliquer et ε le terme d’erreur. On fixe p=5 et on considère les données suivantes :
1000
n <- 5
p <-set.seed(1234)
matrix(rnorm(n*p),ncol=p)
X.mat <- rnorm(n,mean = 0,sd=0.5)
eps <- data.frame(X.mat,eps)
df <- df %>% mutate(Y=X1+X2+X3+X4+X5+eps) %>% select(-eps) df <-
Construire un modèle linaire permettant d’expliquer Y par X1,…,X5 (utiliser la fonction lm) et afficher les estimateurs de β0,…,β5 (on pourra utiliser les fonctions coef et summary).
On considère le jeu de données test suivant.
500 m <- 5 p <-set.seed(12345) matrix(rnorm(m*p),ncol=5) X.mat <- rnorm(m,mean = 0,sd=0.5) eps <- data.frame(X.mat,eps) df.test <- df.test %>% mutate(Y=X1+X2+X3+X4+X5+eps) %>% select(-eps) df.test <-
Calculer, pour chaque individu de ce nouveau jeu de données, les prédictions faites par le modèle de la question précédente (utiliser la fonction predict avec l’option newdata).
Créer un nouveau dataframe qui contiennent les valeurs prédites ˆyi à la question précédente sur une colonne et les valeurs observées yi du jeu de données
df.test
sur une autre colonne.A l’aide du verbe summarize, calculer l’erreur quadratique moyenne (estimée) du modèle linéaire : 1m∑i∈test(ˆyi−yi)2.
6.2 Sélection de variables
On considère les données suivantes
1000
n <- 105
p <-set.seed(1234)
matrix(rnorm(n*p),ncol=p)
X.mat <- rnorm(n,mean = 0,sd=0.5)
eps <- data.frame(X.mat,eps)
df <- df %>% mutate(Y=X1+X2+X3+X4+X5+eps) %>% select(-eps) df <-
issues du modèle Y=β0+β1X1+⋯+βpXp+ε avec p=105. On remarquera que seules les variables X1,…,X5 sont explicatives.
Ajuster un modèle linéaire (fonction lm) sur
df
et afficher les estimateurs de β0,…,β105.On propose d’utiliser une procédure de sélection de variables backward à partir du critère BIC. Effectuer cette procédure à l’aide de la fonction step (on pourra utiliser les options direction=“backward” et k=log(n)). On appellera ce modèle mod.step.
On a sélectionné un modèle avec 8 variables : les 5 explicatives et 3 variables de bruit.
Calculer les erreurs quadratiques de prévision 1m∑i∈test(ˆyi−yi)2 des deux modèles (le modèle complet et le modèle sélectionné) en utilisant le jeu de données test suivant.
300 m <- 105 p <-set.seed(12345) matrix(rnorm(m*p),ncol=p) X.mat <- rnorm(m,mean = 0,sd=0.5) eps <- data.frame(X.mat,eps) df.test <- df.test %>% mutate(Y=X1+X2+X3+X4+X5+eps) %>% select(-eps) df.test <-
6.3 Régression logistique et arbre
On considère le jeu de données spam disponible ici
library(kernlab)
data(spam)
Le problème est d’expliquer la variable type
(un email est un spam ou non) par les 57 autres variables.
Séparer les données en un échantillon d’apprentissage
dapp
de taille 3000 et un échantillon testdtest
de taille 1601. On pourra utiliser la fonction sample.Construire un modèle logistique permettant de répondre au problème en utilisant uniquement les données d’apprentissage. On utilisera la fonction glm avec l’option
family="binomial"
.A l’aide de la fonction step, effectuer une sélection backward (ça peut prendre quelques minutes).
A l’aide de la fonction rpart du package rpart, construire un arbre de régression (toujours sur les données d’apprentissage) pour répondre au problème. On utilisera les paramètres par défaut de la fonction.
Visualiser l’arbre construit à l’aide des fonctions rpart.plot et visTree des packages rpart.plot et visNetwork
Pour les 3 modèles construits (logistique, backward et arbre) calculer les prédictions de la variable
type
pour les individus de l’échantillondtest
. On pourra regrouper ces prévisions dans un data-frame à 3 colonnes.Ajouter au data-frame précédent une colonne où on mettra les valeurs observées de la variable à expliquer.
A l’aide de summarize_at calculer les erreurs de classification des 3 modèles.
Représenter les courbes ROC et calculer les AUC. On pourra consulter les pages 346 et 347 dans Cornillon et al. (2018) pour le tracé de courbes ROC sur R.
Références
Cornillon, P. A., A. Guyader, F. Husson, N. Jégou, J. Josse, N. Klutchnikoff, E. Le Pennec, E. Matzner-Løber, L. Rouvière, and B. Thieurmel. 2018. R Pour La Statistique et La Science Des Données. PUR. https://r-stat-sc-donnees.github.io.