Nous disposons de données recueillies à Hewlett-Packards Labs, qui classe 4601 e-mails comme spam ou non spam. Ces données sont disponnibles sous la librarie kernlab du logiciel R. Il s’agit d’identifier les messages électroniques frauduleux à partir de leurs caractéristiques. Le donneur des e-mails c’est George Forman de HP Labs.

library(tidyverse)
library(kernlab)
library(caret)
data(spam)

La variable cible est la variabletype. Il y a 57 variables explicatives indiquant la fréquence de certains mots et de caractères dans l’e-mail. Regarder l’aide avec la commande help(spam) si vous avez besoin de plus d’information.

Calculons la proportion des classes :

#proportion estimée des classes 
prop.table(table(spam$type))
## 
##   nonspam      spam 
## 0.6059552 0.3940448

39.4% des messages sont frauduleux et 60.6% ne le sont pas.

Motivation : utilisation du package caret

Metrique : validation croisée avec avec B blocs

La fonction trainControl() de caret permet de fixer les paramètres du processus d’apprentissage. Sous caret, il suffit de modifier la fonction trainControl() puis de relancer le processus de modélisation. Nous demandons une validation croisée (method=cv) avec (number=5) blocs (folds).

set.seed(2019)
param_train <- trainControl(method="cv",number=5) 

Dans la suite on va réutiliser les données complètes (data = spam) et utiliser 5-Fold validation croisée pour estimer l’erreur de prediction.

Méthode k plus proches voisins avec caret (méthode knn)

#méthode : k plus proches voisins
# (Exemple 7 plus proches voisins)

k <- data.frame(k=c(7))

set.seed(2019)
fit_knn<- train(type ~ ., data = spam, method = "knn", 
                trControl = param_train , tuneGrid = k)
fit_knn
## k-Nearest Neighbors 
## 
## 4601 samples
##   57 predictor
##    2 classes: 'nonspam', 'spam' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 3680, 3682, 3680, 3681, 3681 
## Resampling results:
## 
##   Accuracy   Kappa    
##   0.7909136  0.5606428
## 
## Tuning parameter 'k' was held constant at a value of 7

Pour k=7, l’accuracy par VC vaut (dans cet experience) 0.79. Il faut remarquer que ici l’erreur de prediction estimé par validation croisé est égale à 1-Accuracy = 1-0.79=0.21. On a un erreur de VC de 21%.

Nous disposons du détail des résultats, l’accuracy pour chaque fold, avec le champ $resample

fit_knn$resample
##    Accuracy     Kappa Resample
## 1 0.8023887 0.5858301    Fold1
## 2 0.7976061 0.5744820    Fold2
## 3 0.7926167 0.5634562    Fold3
## 4 0.7891304 0.5556220    Fold4
## 5 0.7728261 0.5238237    Fold5

On peut remarquer que dans cette experience l’accuracy par VC (validation croisée) vaut :

mean(fit_knn$resample$Accuracy)
## [1] 0.7909136

A quoi correspond cette valeur ?

#k plus proches voisins
set.seed(2019)
k<- seq(1, 150, 2)
k <- data.frame(k)

fit_knn<- train(type ~ ., data = spam, method = "knn", 
                trControl = param_train , tuneGrid = k)
fit_knn
## k-Nearest Neighbors 
## 
## 4601 samples
##   57 predictor
##    2 classes: 'nonspam', 'spam' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 3680, 3682, 3680, 3681, 3681 
## Resampling results across tuning parameters:
## 
##   k    Accuracy   Kappa    
##     1  0.8206861  0.6241571
##     3  0.8024339  0.5846446
##     5  0.8022123  0.5840043
##     7  0.7900443  0.5588221
##     9  0.7898233  0.5580641
##    11  0.7843914  0.5453803
##    13  0.7822187  0.5406221
##    15  0.7800450  0.5359974
##    17  0.7802631  0.5374214
##    19  0.7761350  0.5290016
##    21  0.7730894  0.5221446
##    23  0.7704807  0.5158199
##    25  0.7639578  0.5017739
##    27  0.7626537  0.4987789
##    29  0.7626553  0.4994865
##    31  0.7576577  0.4885705
##    33  0.7574386  0.4883694
##    35  0.7537453  0.4804425
##    37  0.7524436  0.4774985
##    39  0.7489679  0.4694625
##    41  0.7465759  0.4644382
##    43  0.7487508  0.4700935
##    45  0.7478833  0.4684820
##    47  0.7457061  0.4635827
##    49  0.7476626  0.4683709
##    51  0.7470112  0.4672495
##    53  0.7483165  0.4697206
##    55  0.7478817  0.4683790
##    57  0.7463616  0.4651364
##    59  0.7435353  0.4582810
##    61  0.7413606  0.4531251
##    63  0.7396232  0.4496236
##    65  0.7398401  0.4500288
##    67  0.7380974  0.4460048
##    69  0.7367921  0.4437600
##    71  0.7367926  0.4439959
##    73  0.7389660  0.4479501
##    75  0.7396187  0.4485239
##    77  0.7394018  0.4484663
##    79  0.7394025  0.4481636
##    81  0.7402699  0.4501768
##    83  0.7396184  0.4489656
##    85  0.7385329  0.4466256
##    87  0.7367973  0.4432935
##    89  0.7354913  0.4401607
##    91  0.7372311  0.4435346
##    93  0.7374490  0.4444083
##    95  0.7359266  0.4412217
##    97  0.7378859  0.4449986
##    99  0.7374507  0.4436000
##   101  0.7370147  0.4430126
##   103  0.7341888  0.4375004
##   105  0.7350584  0.4389352
##   107  0.7335386  0.4356742
##   109  0.7331050  0.4348837
##   111  0.7335400  0.4355823
##   113  0.7335407  0.4358935
##   115  0.7313682  0.4314999
##   117  0.7298474  0.4288543
##   119  0.7298476  0.4289914
##   121  0.7309322  0.4314368
##   123  0.7304974  0.4301675
##   125  0.7296291  0.4281294
##   127  0.7289781  0.4269258
##   129  0.7289771  0.4267799
##   131  0.7276728  0.4242670
##   133  0.7250653  0.4183294
##   135  0.7246295  0.4176418
##   137  0.7246305  0.4170501
##   139  0.7248488  0.4176597
##   141  0.7239783  0.4165298
##   143  0.7231099  0.4145690
##   145  0.7220230  0.4125478
##   147  0.7228913  0.4137952
##   149  0.7233261  0.4148180
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 1.
plot(fit_knn)

Quel valeur de k chosir ?

Modèle logistique avec caret

set.seed(2019)
fit_glm  <- train(type~ ., data = spam, method="glm",
                  trControl=param_train)

# modèle ajusté avec les coefficients estimés, AIC,...
fit_glm$finalModel
## 
## Call:  NULL
## 
## Coefficients:
##       (Intercept)               make            address  
##        -1.569e+00         -3.895e-01         -1.458e-01  
##               all              num3d                our  
##         1.141e-01          2.252e+00          5.624e-01  
##              over             remove           internet  
##         8.830e-01          2.279e+00          5.696e-01  
##             order               mail            receive  
##         7.343e-01          1.275e-01         -2.557e-01  
##              will             people             report  
##        -1.383e-01         -7.961e-02          1.447e-01  
##         addresses               free           business  
##         1.236e+00          1.039e+00          9.599e-01  
##             email                you             credit  
##         1.203e-01          8.131e-02          1.047e+00  
##              your               font             num000  
##         2.419e-01          2.013e-01          2.245e+00  
##             money                 hp                hpl  
##         4.264e-01         -1.920e+00         -1.040e+00  
##            george             num650                lab  
##        -1.177e+01          4.454e-01         -2.486e+00  
##              labs             telnet             num857  
##        -3.299e-01         -1.702e-01          2.549e+00  
##              data             num415              num85  
##        -7.383e-01          6.679e-01         -2.055e+00  
##        technology            num1999              parts  
##         9.237e-01          4.651e-02         -5.968e-01  
##                pm             direct                 cs  
##        -8.650e-01         -3.046e-01         -4.505e+01  
##           meeting           original            project  
##        -2.689e+00         -1.247e+00         -1.573e+00  
##                re                edu              table  
##        -7.923e-01         -1.459e+00         -2.326e+00  
##        conference      charSemicolon   charRoundbracket  
##        -4.016e+00         -1.291e+00         -1.881e-01  
## charSquarebracket    charExclamation         charDollar  
##        -6.574e-01          3.472e-01          5.336e+00  
##          charHash         capitalAve        capitalLong  
##         2.403e+00          1.199e-02          9.119e-03  
##      capitalTotal  
##         8.437e-04  
## 
## Degrees of Freedom: 4600 Total (i.e. Null);  4543 Residual
## Null Deviance:       6170 
## Residual Deviance: 1816  AIC: 1932

Nous disposons du détail des résultats, l’accuracy pour chaque fold, avec le champ $resample

fit_glm$resample
##    Accuracy     Kappa Resample
## 1 0.9098806 0.8112113    Fold1
## 2 0.9194777 0.8300479    Fold2
## 3 0.9261672 0.8448066    Fold3
## 4 0.9304348 0.8526821    Fold4
## 5 0.9173913 0.8254191    Fold5

Note que l’accuracy par VC (validation croisée) vaut

mean(fit_glm$resample$Accuracy)
## [1] 0.9206703

On peut avoir le résultat directement en tappant directement la commande suivante

fit_glm
## Generalized Linear Model 
## 
## 4601 samples
##   57 predictor
##    2 classes: 'nonspam', 'spam' 
## 
## No pre-processing
## Resampling: Cross-Validated (5 fold) 
## Summary of sample sizes: 3680, 3682, 3680, 3681, 3681 
## Resampling results:
## 
##   Accuracy   Kappa    
##   0.9206703  0.8328334

L’accuracy par VC vaut (dans cet experience) 0.92. Cette valeur correspond à la moyenne des accuraccy’s. Il faut remarquer que l’erreur estimé par validation croisé est égale à 1-Accuracy = 1-0.92=0.08. On a un erreur de VC de 8%.

Pourquoi la méthode de knn marche moins bien dans cet exemple ? Avez-vous une idée ?

N’hesitez pas à toujours appliquer une méthode logistique (avec glm) et d’autres méthodes sur vos données. Chaqque experience est differente est glm marche bien pour beaucoup des données. Après tout depend de votre problème métier. De la question et complexité du problème.

Autres méthodes

La liste des méthodes utilisables est enorme. Voir la site https://topepo.github.io/caret/train-models-by-tag.html

A vous de jouer ! Utiliser d’autres méthodes…Bon courage pour la suite

Remarque : Vous pouvez faire également de la sélection de variables à l’aide d’une méthode que permet de faire la sélection de variables. Mais dans 4 heures on a pas de temps d’apprendre tout !