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.
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 !