Analyse statistique sur données de Spam Daniela CIOLAC et

Transcription

Analyse statistique sur données de Spam Daniela CIOLAC et
Analyse statistique sur données de Spam
Daniela CIOLAC et Charles-Abner DADI
20 février 2013
Introduction
L’objectif de cet étude statistique est d’établir le meilleur modèle prédictif dans un problème de classification
supervisé. La variable à prédire est le caractère Spam/Non Spam d’un e-mail à partir de variables explicatives.
1
Table des matières
1 Analyse préliminaire
3
2 Régression logistique
3
3 Analyse discriminante
6
4 Arbre de classification
7
5 Comparaison et interprétation des méthodes sur données Spam
10
6 Conclusion
11
7 Annexes
12
2
1
Analyse préliminaire
Comme toute étude statistique, notre étude débutera par une analyse préliminaire sur les données afin de comprendre la structure de notre base de données, analyser le type de variables explicatives(qualitatives/quantitatives).
Cette analyse explorative nous permet de nous familiariser avec les données, de nettoyer si nécessaire la base de donnée
(valeurs manquantes, aberrantes..), et puis de délimiter précisément notre problème.
Dans notre cas nous disposons d’un échantillon de 4601 observations noté
Dn = {(xi , yi )i≤n , xi ∈ X , yi ∈ {0, 1}}.
Ici, Y = {spam, e − mail} et X notre ensemble de variables explicatives est au nombre de 57, il s’agit de caractères,
ou de mots que contiennent nos e-mail et qui sont considérés comme potentiellement révélateurs d’un spam.
Après avoir récupéré les entêtes des variables de la base de données et après une analyse détaillée, nous observons
que parmi les 57 variables explicatives, on trouve notamment 48 variables continues sur [0,100] qui représentent le
pourcentage d’apparition d’un mot dans un e-mail. Les mots retenus sont explicité dans 1
Table 1 – Add caption
Mots contenus dans les e-mails
address
all
3d
our
over
remove
internet
order
mail
receive
will
people
report
addresses
free
business
email
you
credit
your
font
0
money
hp
hpl
george
650
lab
labs
telnet
857
data
415
85
technology
1999
parts
pm
direct
cs
meeting
original
project
re
edu
table
conference
D’autre variables continues portent sur la fréquence d’apparition de caractères de ponctuation
4.
Table 2 – Ponctuation contenue dans les e-mails
,
$
!
#
Enfin les trois dernières variables explicatives portent sur la longueur moyenne de séquences ininterrompues de
lettres capitales, la longueur de la plus longue sequence ininterrompue de lettres capitales et le nombre total de lettres
capitales dans le mail.
Après un simple calcul de fréquence il apparait que notre base contient 1813 Spam (39.4%) et 2788 Non Spam(60.6%).
2
Régression logistique
Dans un premier temps nous souhaitons déterminer le seuil optimal, qui réalise le meilleur arbitrage entre taux de
faux positifs et faux négatifs. Il est important de noter qu’on veut minimiser les faux positifs, car dans notre cas cela
correspond à classer un e-mail comme un spam. Pour cela on calcule pour des seuils différents les faux positifs et les
faux négatifs.
On choisit donc un seuil à 60%, pour lequel le taux de positif est de 3.5509% et un taux de faux négatif de 12.3000%.
En outre on peut juger du pouvoir prédictif du modèle logistique en traçant la courbe ROC et en calculant l’AUC.
On obtient sur les données complètes un AUC relativement élevé :
AUC=97.68%
3
Table 3 – Faux positifs, Faux négatifs en fonction du seuil
Seuil
FP (%)
FN (%)
0,4
0,41
0,42
0,43
0,44
0,45
0,46
0,47
0,48
0,49
0,5
0,51
0,52
0,53
0,54
0,55
0,56
0,57
0,58
0,59
0,6
0,61
0,62
0,63
0,64
0,65
0,66
0,67
0,68
0,69
0,7
0,71
0,72
0,73
0,74
0,75
0,76
0,77
0,78
0,79
0,8
6,28
6,06
5,77
5,42
5,27
5,20
5,13
4,88
4,73
4,52
4,38
4,16
4,05
3,91
3,80
3,73
3,62
3,59
3,55
3,55
3,44
3,34
3,16
3,16
3,08
2,91
2,91
2,87
2,80
2,80
2,76
2,76
2,69
2,58
2,47
2,44
2,44
2,33
2,26
2,15
2,08
7,72
7,94
8,16
8,38
8,83
9,27
9,71
9,98
10,15
10,48
10,70
10,92
11,31
11,47
11,69
12,08
12,13
12,30
12,80
13,13
13,90
14,12
14,51
14,78
15,39
15,83
16,05
16,49
16,77
17,21
17,60
18,20
18,48
19,19
19,91
20,63
21,40
21,90
22,39
22,95
23,72
4
Figure 1 – Courbe ROC pour modèle logistique
.
D’après la forme de la courbe ROC et le calcul de l’AUC on peut conclure que le modèle logistique est pertinent
dans le but de classifier les Spam/Non Spam. Toutefois, le pouvoir prédictif d’un modèle ne peut être validé qu’à
travers la confrontation du modèle à des données test.
A cette fin, et dans la suite de notre étude nous nous attacherons à diviser nos observations en un échantillon
de données d’apprentissage. Cet ensemble d’apprentissage est généralement constitué de 75% des observations tirées
aléatoirement. Le reste de notre échantillon constituera notre ensemble de test, sur lequel nous analyserons le pouvoir
prédictif de nos modèles.
Dans le cadre d’une classification binaire, nous pouvons commencer par réaliser une régression linéaire puis on
applique une méthode de type AIC pour ne sélectionner que les variables significatives selon le test de Wald.
Nous effectuons sous R, les trois type de AIC à savoir forward, backward et both. Dans les trois cas nous obtenons
le même modèle explicatif à savoir :
Spam A.53 + A.25 + A.7 + A.27 + A.56 + A.16 + A.46 + A.42 + A.17 + A.23 + A.5 + A.21 + A.45 + A.52
+ A.48 + A.44 + A.8 + A.41 + A.20 + A.24 + A.57 + A.6 + A.33 + A.54 + A.49 + A.29 + A.39 + A.4 + A.35
+ A.2 + A.26 + A.28 + A.36 + A.19 + A.1 + A.9 + A.43 + A.15 + A.47 + A.38 + A.12 + A.10 + A.22
Maintenant que nous disposons d’un modèle qui maximise le critère AIC, nous pouvons l’utiliser pour réaliser une
régression logistique uniquement sur l’ensemble d’apprentissage :
A la suite de quoi nous effectuons une prédiction sur notre ensemble test. Une fois les prédiction effectuées, nous
souhaitons déterminer le pouvoir prédictif du modèle sur ces nouvelles données test. Nous calculons donc la matrice de
confusion, de laquelle nous en déduisons la sensibilité et la spécificité, nous traçons la courbe ROC, et nous calculons
l’AUC (Area Under Curve).
Résultat et interprétation
Nos résultats sont les suivant :
5
Figure 2 – Courbe Roc sur Régression Logistique
3
Analyse discriminante
Analyse discriminante descriptive
Elle permet de proposer une représentation la plus pertinente de la variable cible à partir d’un modèle construit
sur les variables explicatives et de discriminer les variables explicatives les plus significatives.
7.0.3 On réalise une analyse discriminante pas-à-pas en maximisant à chaque étape le pouvoir explicatif du modèle
construit.
On représente sur le graphique ?? l’évolution de la performance du modèle construit.
On obtient donc le modèle suivant à 22 variables significatives.
Spam A.23, A.7, A.21, A.16, A.57, A.52, A.25, A.18, A.46, A.24,
6
A.27, A.9, A.33, A.26, A.37, A.12, A.42, A.6, A.45, A.44, A.56, A.50 A partir de ce modèle on peut réaliser
des prédiction sur notre échantillon test. Enfin,pour pouvoir comparer avec nos autres méthodes nous calculons ici
aussi les faux positifs et vrais positifs sur le même échantillon d’apprentissage. On trace ensuite la courbe ROC et on
calcule l’AUC.
On obtient un AUC=98.14%
4
Arbre de classification
Construction d’un arbre de décision
La méthode des arbres de classification est pertinente pour effectuer un partitionnement des observations. L’objectif
est de produire un partitionnement le plus homogène possible des observations du point de vue de la variable à prédire.
L’arbre de classification permet d’obtenir une règle de décision intuitive et facilement compréhensible afin de prédire
la valeur d’une nouvelle observation.
La construction de l’arbre repose sur le choix successif des variables de segmentations qui séparent le mieux
l’échantillon . Notons l’importance des conditions d’arrêt dans l’approfondissement de l’arbre. Ces conditions d’arrêt
peuvent porter sur la profondeur de l’arbre lorsqu’une limite est atteinte (nombre de variables utilisées), sur le nombre
de feuilles qui atteint un maximum fixé ou encore sur l’effectif de chaque nœud qui est inférieur à un minimum fixé
ou encore sur des critères de qualité de l’arbre.
A présent on peut calculer une courbe ROC afin de comparer avec nos méthodes précédentes.
On obtient un AUC=87.02%
On remarque une courbe ROC moins bonne que dans les modèles précédents. Toutefois, sur l’arbre on constate que
les variables sélectionnées lors de la segmentation sont les même que dans l’analyse discriminante. Ceci, peut nous
conforter dans notre sélection des variables les plus prédictives du caractère Spam/NonSpam.
Agrégation de modèles
Les méthodes d’agrégation de modèles sont particulièrement pertinentes en pratique, c’est ce que l’on va souligner
à travers notre expérimentation.
A la base se trouve le principe de boostrap qui repose sur la re génération successive de sous échantillons de notre
ensemble d’apprentissage, puis par l’application de méthodes particulières sur ces sous échantillons successifs. Cette
méthode permet de tester de la robustesse d’un modèle prédictif, en l’occurrence notre arbre de classification et de
renseigner de la stabilité du modèle.
7
Figure 3 – Arbre de Décision : Minimum d’observations dans un nœuds terminal 50, Minimum d’observation dans
un nœud 20,cross validation 20
4.0.1
Bagging
Le bagging est une simple application de ce que nous venons de décrire. Nous fixons un nombre limite d’itération,
ici 25. A chaque itération k, on crée un sous échantillon d’apprentissage et de test, tirés avec remise, sur lesquels on
fait une prédiction sur ce nombre d’arbres k.
8
Enfin, on calcule les faux positifs et les faux négatifs et on garde le nombre d’arbres pour lequel le nombre de faux
positifs est le plus faible.
Figure 4 – Evolution des erreurs, des FP et FN en fonction du nombre d’arbres.Les FP est minimal pour K=22
4.0.2
Ramdom Forest
Il s’agit d’une sorte de bagging, pour lequel on fait varier le nombre d’arbres entre 10 et 25. Mais pour chaque
nombre d’arbres k, on réalise 100 simulation. Le résultat est très couteux en temps mais offre des résultats des plus
pertinents.
Figure 5 – Evolution des erreurs, des FP et FN en fonction du nombre d’arbres.Les FP est minimal pour K=23
9
Table 4 – Nombre d’arbre : 10 à 25, nombre itération : 100
FPForest/n
0.03870853
0.03608618
0.03126861
0.03876679
0.03428289
0.03350983
0.03467013
0.03558768
0.03295617
0.03457764
0.03389038
0.03492678
0.03805125
0.03395365
0.03372818
0.03403976
0.08830812
0.08000140
0.07168984
0.08040015
0.08005169
0.07820492
0.07974350
0.07840772
0.08107519
0.07957859
0.08191868
0.08072277
0.08564734
0.07833006
0.08222990
0.07900979
0.05777585
0.05334492
0.04735013
0.05512598
0.05230235
0.05112945
0.05247611
0.05251955
0.05169418
0.05234579
0.05299739
0.05317116
0.05682016
0.05152042
0.05308427
0.05182450
FNForest/n
ErreurTot/n
5
Comparaison et interprétation des méthodes sur données Spam
Méthodes efficaces sur données Spam
Sur 5, on conclut aisément que le modèle avec le meilleur pouvoir prédictif est le modèle des Random Forest avec
100 simulation et 23 arbres.
Il en ressort également que la régression logistique est pertinente, néanmoins le taux de faux positifs est plus élevé
que pour le Random Forest.
10
(a) Faux Positifs
(b) Faux Négatifs
(c) Erreur
Figure 6 – Comparaisons des méthodes utilisées sur les données Spam
6
Conclusion
Dans le cadre de la régression logistique puis de l’analyse discriminante nous avons tracé la courbe ROC et calculé
l’AUC afin de juger du pouvoir prédictif de notre modèle. Toutefois, nous pouvons également considérer un critère
d’erreur de classifieur R(fˆ) = E[L(Y, fˆ(X))], pour une fonction de perte L particulière. L’avantage se situe d’un point
de vu théorique, grâce aux nombreux théorèmes et propriétés de convergence. Enfin, il serait intéressant d’utiliser
des méthodes de type SVM qui offre une souplesse grâce au choix du noyau et du RKHS. Néanmoins pour une taille
raisonnables de variables (57), les méthodes présentées sont amplement suffisantes.
11
7
Annexes
Chargement et traitement des données :
1
3
5
7
#B i b l i o t h e q u e s u t i l i s e e s
library ( class )
library ( stats )
l i b r a r y (ROCR)
library ( rpart )
library ( tree )
library ( ipred )
l i b r a r y ( randomForest )
9
11
13
15
17
19
21
23
#L e c t u r e e t t r a i t e m e n t d e s d on ne e s
setwd ( ” / U s e r s / dhana / Dropbox /equipeM2MO/ s t a t en e n t r e p r i s e d a n i e l a / code / d o nn ee s / ” )
Spam = r e a d . t a b l e ( ”spam . t x t ” , s e p=” ; ” , head=T)
#on s t o c k e l e s Spam e t Non Spam dans d e s v e c t e u r s d i f f ? r e n t s .
spam . sub = c ( 1 : nrow ( Spam ) ) [ Spam$spam == ’ spam ’ ]
nospam . sub =
c ( 1 : nrow ( Spam ) ) [ Spam$spam == ’ e m a i l ’ ]
# r e g r e s s i o n l i n e a i r e m u l t i p l e de spamm par r a p p o r t a t o u t e s l e s a u t r e s v a r i a b l e s .
r e g<−glm ( spam˜ . , data=Spam , f a m i l y= ’ b i n o m i a l ’ )
summary ( r e g )
# r e g r e s s i o n l i n e a i r e s i m p l e de spamm par r a p p o r t a l a c o n s t a n t e .
r e s 0=glm ( spam˜ 1 , data=Spam , f a m i l y= ’ b i n o m i a l ’ )
summary ( r e s 0 )
25
27
29
#S e l e c t i o n d e s v a r i a b l e s ( on v e u t r ? d u i r e l a d i m e n s i o n )
AicFor=s t e p ( r e s 0 , l i s t ( upper =r e g ) , d i r e c t i o n= ’ f o r w a r d ’ )
AicBack = s t e p ( reg , d i r e c t i o n= ’ backward ’ )
AicBoth=s t e p ( reg , d i r e c t i o n= ’ both ’ )
31
33
35
37
39
41
43
45
47
49
51
53
55
regBack = glm ( AicBack , data = Spam , f a m i l y = ’ b i n o m i a l ’ )
pred = p r e d i c t ( regBack , t y p e= ’ r e s p o n s e ’ )
#c o u r b e r o c s u r do n ne e s c o m p l e t e s
FP=NULL
TP=NULL
FN=NULL
p l o t ( 0 : 1 , 0 : 1 , x l a b=” F a l s e P o s i t i v e Rate ” , y l a b=” True P o s i t i v e Rate ” , c e x =.5)
f o r ( s i n s e q ( 0 , 1 , by =.01) ) {
FP=c (FP , l e n g t h ( which ( ( pred>s )& ( Spam$spam== ’ e m a i l ’ ) ) ) / l e n g t h ( which ( Spam$spam== ’ e m a i l ’ ) ) )
TP=c (TP, l e n g t h ( which ( ( pred>s ) & ( Spam$spam== ’ spam ’ ) ) ) / l e n g t h ( which ( Spam$spam== ’ spam ’ ) ) )
FN=c (FN, l e n g t h ( which ( ( pred<s )& ( Spam$spam== ’ spam ’ ) ) ) / l e n g t h ( which ( Spam$spam== ’ spam ’ ) ) )
}
s e u i l<−s e q ( 0 , 1 , by =.01)
tab<−c b i d ( s e u i l , FP∗ 1 0 0 ,FN∗ 1 0 0 )
w r i t e . c s v ( tab , ” t e s t . c s v ” )
p l o t (FP , TP, main=” Courbe ROC −R e g r e s s i o n l o g i s t i q u e ” , c o l=” b l u e ” )
#C a l c u l de l ’AUC
AUC=0
for ( i in 2:101) {
AUC=AUC+(FP [ i −1]−FP [ i ] ) ∗ 0 . 5 ∗ (TP[ i ]+TP [ i −1])
}
p r i n t (AUC)
57
59
#On r e c u p e r e 2 / 3 d e s Spams e t Non Spam pour t r a i n i n g s e t
t r a i n . spam = sample ( spam . sub , f l o o r ( l e n g t h ( spam . sub ) ∗ 2 / 3 ) )
12
61
63
train
train
train
test .
. e m a i l = sample ( nospam . sub , f l o o r ( l e n g t h ( nospam . sub ) ∗ 2 / 3 ) )
= c ( t r a i n . spam , t r a i n . e m a i l )
. s e t = Spam [ t r a i n , ]
s e t = Spam[− t r a i n , ]
Régression logistique :
1
3
#R e g r e s s i o n L o g i s t i q u e
RegBack=glm ( AicBack , data=t r a i n . s e t , f a m i l y= ’ b i n o m i a l ’ )
# p r e d i c t the l a b e l s f o r the t e s t s e t
pred = p r e d i c t ( RegBack , t y p e= ’ r e s p o n s e ’ , newdata=t e s t . s e t )
5
7
9
11
FP=NULL
TP=NULL
p l o t ( 0 : 1 , 0 : 1 , x l a b=” F a l s e P o s i t i v e Rate ” , y l a b=” True P o s i t i v e Rate ” , c e x =.5)
f o r ( s i n s e q ( 0 , 1 , by =.01) ) {
FP=c (FP , l e n g t h ( which ( ( pred>s )& ( t e s t . s e t $spam== ’ e m a i l ’ ) ) ) / l e n g t h ( which ( t e s t . s e t $spam== ’ e m a i l ’ ) ) )
TP=c (TP, l e n g t h ( which ( ( pred>s ) & ( t e s t . s e t $spam== ’ spam ’ ) ) ) / l e n g t h ( which ( t e s t . s e t $spam== ’ spam ’ ) ) )
}
13
15
17
19
21
p l o t (FP , TP, main=”ROC L o g i s t i q u e s u r d o nn ee s Test ” , c o l=” b l u e ” , lwd = 2 )
#l i n e s ( c (FP) , c (TP) , t y p e=”s ” , c o l =”b l u e ” , lwd = 2 )
#C a l c u l de l ’AUC
AUC=0
for ( i in 2:101) {
AUC=AUC+(FP [ i −1]−FP [ i ] ) ∗ 0 . 5 ∗ (TP[ i ]+TP [ i −1])
}
p r i n t (AUC)
Analyse discriminante :
7.0.3
1
3
5
7
9
11
13
15
17
Selection pas-à-pas selon LDA :
‘ s t e p w i s e c l a s s i f i c a t i o n ’ , u s i n g 10− f o l d c r o s s −v a l i d a t e d c o r r e c t n e s s r a t e o f method l d a ’ .
4601 o b s e r v a t i o n s o f 57 v a r i a b l e s i n 2 c l a s s e s ; d i r e c t i o n : both
s t o p c r i t e r i o n : improvement l e s s than 0 . 1 % .
correctness rate : 0.70528;
i n : ”A. 2 3 ” ;
v a r i a b l e s ( 1 ) : A. 2 3
correctness rate : 0.74897;
i n : ”A. 7 ” ;
v a r i a b l e s ( 2 ) : A. 2 3 , A. 7
correctness rate : 0.78636;
i n : ”A. 2 1 ” ;
v a r i a b l e s ( 3 ) : A. 2 3 , A. 7 , A. 2 1
correctness rate : 0.80309;
i n : ”A. 1 6 ” ;
v a r i a b l e s ( 4 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6
correctness rate : 0.81548;
i n : ”A. 5 7 ” ;
v a r i a b l e s ( 5 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7
correctness rate : 0.8307;
i n : ”A. 5 2 ” ;
v a r i a b l e s ( 6 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2
correctness rate : 0.83917;
i n : ”A. 2 5 ” ;
v a r i a b l e s ( 7 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5
correctness rate : 0.84482;
i n : ”A. 1 8 ” ;
v a r i a b l e s ( 8 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
.18
correctness rate : 0.84895;
i n : ”A. 4 6 ” ;
v a r i a b l e s ( 9 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
. 1 8 , A. 4 6
correctness rate : 0.85373;
i n : ”A. 2 4 ” ;
v a r i a b l e s ( 1 0 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
. 1 8 , A. 4 6 , A. 2 4
correctness rate : 0.85634;
i n : ”A. 2 7 ” ;
v a r i a b l e s ( 1 1 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7
correctness rate : 0.85982;
i n : ”A. 9 ” ;
v a r i a b l e s ( 1 2 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 , A. 9
correctness rate : 0.86351;
i n : ”A. 3 3 ” ;
v a r i a b l e s ( 1 3 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 , A. 9 , A. 3 3
correctness rate : 0.86699;
i n : ”A. 2 6 ” ;
v a r i a b l e s ( 1 4 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 , A. 9 , A. 3 3 , A. 2 6
13
19
21
23
25
27
correctness rate : 0.86808;
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 ,
correctness rate : 0.87025;
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 ,
correctness rate : 0.87221;
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 ,
correctness rate : 0.8746;
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 ,
correctness rate : 0.8759;
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 ,
correctness rate : 0.87742;
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 ,
correctness rate : 0.87873;
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 ,
correctness rate : 0.88068;
. 1 8 , A. 4 6 , A. 2 4 , A. 2 7 ,
hr . e l a p s e d min . e l a p s e d s e c . e l a p s e d
0.0
27.0
32.4
7.0.4
2
i n : ”A. 3 7 ” ;
v a r i a b l e s ( 1 5 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
A. 9 , A. 3 3 , A. 2 6 , A. 3 7
i n : ”A. 1 2 ” ;
v a r i a b l e s ( 1 6 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
A. 9 , A. 3 3 , A. 2 6 , A. 3 7 , A. 1 2
i n : ”A. 4 2 ” ;
v a r i a b l e s ( 1 7 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
A. 9 , A. 3 3 , A. 2 6 , A. 3 7 , A. 1 2 , A. 4 2
i n : ”A. 6 ” ;
v a r i a b l e s ( 1 8 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
A. 9 , A. 3 3 , A. 2 6 , A. 3 7 , A. 1 2 , A. 4 2 , A. 6
i n : ”A. 4 5 ” ;
v a r i a b l e s ( 1 9 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
A. 9 , A. 3 3 , A. 2 6 , A. 3 7 , A. 1 2 , A. 4 2 , A. 6 , A. 4 5
i n : ”A. 4 4 ” ;
v a r i a b l e s ( 2 0 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
A. 9 , A. 3 3 , A. 2 6 , A. 3 7 , A. 1 2 , A. 4 2 , A. 6 , A. 4 5 , A. 4 4
i n : ”A. 5 6 ” ;
v a r i a b l e s ( 2 1 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
A. 9 , A. 3 3 , A. 2 6 , A. 3 7 , A. 1 2 , A. 4 2 , A. 6 , A. 4 5 , A. 4 4 , A. 5 6
i n : ”A. 5 0 ” ;
v a r i a b l e s ( 2 2 ) : A. 2 3 , A. 7 , A. 2 1 , A. 1 6 , A. 5 7 , A. 5 2 , A. 2 5 , A
A. 9 , A. 3 3 , A. 2 6 , A. 3 7 , A. 1 2 , A. 4 2 , A. 6 , A. 4 5 , A. 4 4 , A. 5 6 , A. 5 0
Analyse Discriminante :
#R e g r e s s i o n LDA/QDA
RegLda = l d a ( spam˜A.23+ A.7+ A.21+ A.16+ A.57+ A.52+ A.25+ A.18+ A.46+ A.24+ A.27+ A.9+ A.33+ A.26+
A.37+ A.12+ A.42+ A.6+ A.45+ A.44+ A.56+ A. 5 0 , data=t r a i n . s e t ) # a n a l y s e d i s c r i m i n a n t e l i n e a i r e
pred=p r e d i c t ( RegLda , newdata=t e s t . s e t )
4
6
8
10
r o c o b j <− r o c ( t e s t . s e t $spam , pred )
p l o t ( r o c o b j , main=” Courbe ROC s u r m? thode LD” )
PROC<−p l o t . r o c ( smooth ( r o c o b j ) , add=TRUE, c o l=” b l u e ” )
SE=c i . s e (PROC, s p e c i f i c i t i e s =s e q ( 0 , 1 0 0 , 5 ) )
l e g e n d ( ” b o t t o m r i g h t ” , l e g e n d=c ( ” E m p i r i c a l ” , ” Smoothed ” ) ,
c o l=c ( par ( ” f g ” ) , ” b l u e ” ) , lwd =2)
Methode CART :
1
3
5
7
9
11
13
#Arbre de c l a s s i f i c a t i o n
library ( tree )
library ( rpart )
l i b r a r y ( ElemStatLearn )
temp<−r p a r t . c o n t r o l ( minbucket =50 , m i n s p l i t =50 , cp =0 , x v a l =20)
t r e e . spam = r p a r t ( Spam˜ . , data=t r a i n . s e t , method=” c l a s s ” ,
parms= l i s t ( s p l i t =” g i n i ” ) , c o n t r o l=temp )
p l o t ( t r e e . spam )
t e x t ( t r e e . spam )
p o s t ( t r e e . spam , f i l e n a m e= ’ ’ )
p o s t ( t r e e . spam , f i l e = ” p r e t t y . ps ” , t i t l e = ” ” )
j p e g ( ” spamtreeEsecond . j p g ” , h e i g h t =600 , width =900)
p r e d i c t T r e e=p r e d i c t ( t r e e . spam , t e s t . s e t , t y p e= ’ c l a s s ’ )
15
17
19
#Courbe Roc :
p r e d i c t T r e e = p r e d i c t ( t r e e . spam , t e s t . s e t )
l = s o r t ( u n i q u e ( p r e d i c t T r e e [ , ’ spam ’ ] ) )
sens = c ()
spec = c ()
21
14
23
25
27
29
for ( l l in l ) {
p l a b e l s . spam = r e p ( ’ e m a i l ’ , nrow ( p r e d i c t T r e e ) )
p l a b e l s . spam [ ( p r e d i c t T r e e [ , ’ spam ’ ] >= l l ) ] = ’ spam ’
s = C l a s s i f i c a t i o n f u n c t i o n ( p l a b e l s . spam , t e s t . s e t $spam )
sens = c ( sens , s $ sens )
s p e c = c ( s pec , s $ s p e c )
}
sens = c (1 , sens , 0 )
s p e c = c ( 0 , sp ec , 1 )
31
33
p l o t (1− sp ec , s e n s , t y p e= ’ l ’ , c o l= ’ r e d ’ , lwd =2 , main=” Courbe Roc Arbre de D e c i s i o n ” )
a b l i n e ( 0 , 1 , lwd =2 , l t y =2 , c o l= ’ b l u e ’ )
35
#Bagging
37
library ( ipred )
K=20
FP Bagging=m a t r i x ( 0 ,K, 1 6 )
FN Bagging=m a t r i x ( 0 ,K, 1 6 )
B a g g i n g E r r o r=m a t r i x ( 0 ,K, 1 6 )
39
41
43
45
47
f o r ( i i n 1 :K)
{
i d=sample ( s e q ( 0 , nrow ( spam ) , 1 ) , 0 . 7 5 ∗ nrow ( spam ) )
t r a i n . s e t=spam [ id , ]
t e s t . s e t=spam[− id , ]
49
for ( j in 10:25)
{
51
BagResult=i p r e d b a g g ( t r a i n . s e t $spam ,X=t r a i n . s e t [ , − 5 8 ] , nbagg=j )
g=p r e d i c t ( BagResult , t e s t . s e t )
FP Bagging [ i , j −9]= l e n g t h ( which ( B a g P r e d i c t== ’ spam ’&t e s t . s e t $spam== ’ e m a i l ’ ) ) / l e n g t h ( which ( t e s t . s e t
$spam== ’ e m a i l ’ ) )
FN Bagging [ i , j −9]= l e n g t h ( which ( B a g P r e d i c t== ’ e m a i l ’&t e s t . s e t $spam== ’ spam ’ ) ) / l e n g t h ( which ( t e s t . s e t
$spam== ’ spam ’ ) )
B a g g i n g E r r o r [ i , j −9]= l e n g t h ( which ( B a g P r e d i c t !=t e s t . s e t $spam ) ) / nrow ( t e s t . s e t )
53
55
57
}
59
61
63
65
67
}
FPbagg=r e p ( 0 , 1 6 )
FNbagg=r e p ( 0 , 1 6 )
E r r eu r T o t=r e p ( 0 , 1 6 )
for ( j in 1:16)
{
FPbagg [ j ]= mean (FP Bagging [ , j ] )
FNbagg [ j ]= mean (FN Bagging [ , j ] )
E r re u r T o t [ j ]=mean ( B a g g i n g E r r o r [ , j ] )
69
71
}
m=min ( c ( min ( E rr e u r T ot ) , min ( FPbagg ) , min ( FNbagg ) ) ) /n
M=max( c ( min ( E r r e u rT o t ) ,max( FPbagg ) ,max( FNbagg ) ) ) /n
73
75
77
79
#Random F o r e s t
l i b r a r y ( randomForest )
n=20 #Nb I t e r a t i o n de C r o s s V a l i d a t i o n
FP RandomForest=r e p ( 0 , 1 6 )
FN RandomForest=r e p ( 0 , 1 6 )
E r r eu r T o t=r e p ( 0 , 1 6 )
81
83
#Nombre d a r b r e s
15
for ( j in 10:25)
85
{
87
89
91
93
95
97
99
for ( i in 1: n)
{
i d=sample ( s e q ( 1 , nrow ( spam ) ) , 0 . 7 5 ∗ nrow ( spam ) )
t r a i n . s e t=spam [ id , ]
t e s t . s e t=spam[− id , ]
myForest=randomForest ( spam˜ . , data=t r a i n . s e t , n t r e e=j )
p r e d i c t F o r e s t=p r e d i c t ( myForest , t e s t . s e t )
FauxNeg=l e n g t h ( which ( p r e d i c t F o r e s t== ’ e m a i l ’&t e s t . s e t $spam== ’ spam ’ ) ) / l e n g t h ( which ( t e s t . s e t $spam==
’ spam ’ ) )
FauxPos=l e n g t h ( which ( p r e d i c t F o r e s t== ’ spam ’&t e s t . s e t $spam== ’ e m a i l ’ ) ) / l e n g t h ( which ( t e s t . s e t $spam==
’ email ’ ) )
e r r e u r=l e n g t h ( which ( p r e d i c t F o r e s t !=t e s t . s e t $spam ) ) / nrow ( t e s t . s e t )
FP RandomForest [ j −9]=FP RandomForest [ j −9]+FauxPos
FN RandomForest [ j −9]=FN RandomForest [ j −9]+FauxNeg
E r re u r T o t [ j −9]= E r r e u rT o t [ j −9]+ e r r e u r
}
101
103
105
107
}
FP RandomForest /n
FN RandomForest /n
E r r eu r T o t /n
m=min ( c ( min ( E rr e u r T ot ) , min (FP RandomForest ) , min (FN RandomForest ) ) ) /n
M=max( c ( min ( E r r e u rT o t ) ,max(FP RandomForest ) ,max(FN RandomForest ) ) ) /n
109
111
2
4
p l o t ( y=E r r eu r T o t /n , x=s e q ( 1 0 , 2 5 ) , y l i m=c (m,M) , y l a b= ’ Taux E r r e u r ’ , x l a b= ’ Number o f T r e e s ’ , t y p e= ’ l ’ ,
c o l =2 , lwd =3)
par ( new=T)
C l a s s i f i c a t i o n f u n c t i o n= f u n c t i o n ( p l a b e l s , t l a b e l s ) {
# Vrai P o s i t i f v r a i e v a l e u r s
Spam V a l e u r s p r e d i t e s Spam
TP = sum ( ( p l a b e l s . spam == ’ spam ’ ) ∗ ( t l a b e l s == ’ spam ’ ) )
6
# Faux P o s i t i f v r a i e s v a l e u r s
E−m a i l V a l e u r s p r e d i t e s
Spam
8
FP = sum ( ( p l a b e l s . spam == ’ spam ’ ) ∗ ( t l a b e l s == ’ e m a i l ’ ) )
10
# Vrais Negatifs
vraie valeur
E−m a i l V a l e u r s p r e d i t e s
E−m a i l
12
TN = sum ( ( p l a b e l s . spam == ’ e m a i l ’ ) ∗ ( t l a b e l s == ’ e m a i l ’ ) )
14
# Faux N e g a t i f v r a i e v a l e u r
E−m a i l V a l e u r s p r e d i t e s
spam
16
FN = sum ( ( p l a b e l s . spam == ’ e m a i l ’ ) ∗ ( t l a b e l s == ’ spam ’ ) )
18
# Efficacite
20
A = (TP+TN) / (TP+TN+FP+FN)
22
# sensibilite
24
s e n s = TP / (TP+FN)
26
# Specificite
28
s p e c = TN / (TN+FP)
30
16
# precision
32
p r e c = TP / (TP+FN)
34
#m a t r i c e de c o n f u s i o n
C = m a t r i x ( c (TP, FP , FN,TN) , 2 , 2 )
c o l n a m e s (C) = c ( ’ p r e d i c t e d spam ’ , ’ p r e d i c t e d e m a i l ’ )
rownames (C) = c ( ’ t r u l y spam ’ , ’ t r u l y e m a i l ’ )
36
38
r e t u r n ( l i s t (A=A,TP=TP, FP=FP ,TN=TN, FN=FN, C=C, s e n s=s e n s , s p e c=s p e c ) )
40
}
Comparaison des méthodes
1
#Comparaison d e s methodes
n=10 # nombre de c r o s s −v a l i d a t i o n
3
5
FP RegLog=r e p ( 0 , n )
FN RegLog=r e p ( 0 , n )
E r r o r RegLog=r e p ( 0 , n )
7
9
FPLDA=r e p ( 0 , n )
FNLDA=r e p ( 0 , n )
ErreurLDA=r e p ( 0 , n )
11
13
FPCart=r e p ( 0 , n )
FNCart=r e p ( 0 , n )
E r r e u r C a r t=r e p ( 0 , n )
15
17
FPbagg=r e p ( 0 , n )
FNbagg=r e p ( 0 , n )
B a g g i n g E r r o r=r e p ( 0 , n )
19
21
FP RandomForest=r e p ( 0 , n )
FN RandomForest=r e p ( 0 , n )
E r r e u r F o r e s t=r e p ( 0 , n )
23
25
27
29
31
for ( i in 1: n)
{
train
train
train
train
test .
. spam = sample ( spam . sub , f l o o r ( l e n g t h ( spam . sub ) ∗ 2 / 3 ) )
. e m a i l = sample ( nospam . sub , f l o o r ( l e n g t h ( nospam . sub ) ∗ 2 / 3 ) )
= c ( t r a i n . spam , t r a i n . e m a i l )
. s e t = Spam [ t r a i n , ]
s e t = Spam[− t r a i n , ]
33
#R e g r e s s i o n L o g i s t i q u e
35
37
RegBack=glm ( AicBack , data=t r a i n . s e t , f a m i l y= ’ b i n o m i a l ’ )
pred = p r e d i c t ( RegBack , t y p e= ’ r e s p o n s e ’ , newdata=t e s t . s e t )
p r e d i c t R e g =(pred >0.6)
39
41
FP RegLog [ i ]= l e n g t h ( which ( p r e d i c t R e g== ’TRUE ’ & t e s t . s e t $spam== ’ e m a i l ’ ) ) / l e n g t h ( which ( t e s t . s e t $spam
== ’ e m a i l ’ ) )
FN RegLog [ i ]= l e n g t h ( which ( p r e d i c t R e g== ’FALSE ’& t e s t . s e t $spam== ’ spam ’ ) ) / l e n g t h ( which ( t e s t . s e t $spam
== ’ spam ’ ) )
E r r o r RegLog [ i ]=( l e n g t h ( which ( p r e d i c t R e g== ’FALSE ’&t e s t . s e t $spam== ’ spam ’ ) )+l e n g t h ( which ( pred== ’TRUE
’&t e s t . s e t $spam== ’ e m a i l ’ ) ) ) / nrow ( t e s t . s e t )
43
# A n a ly s e D i s c r i m i n a n t e
17
45
RegLda = l d a ( RegLda , data=t r a i n . s e t ) # a n a l y s e d i s c r i m i n a n t e l i n e a i r e
predictLDA=p r e d i c t ( RegLda , t e s t . s e t )
47
FPLDA[ i ]= l e n g t h ( which ( predictLDA $ c l a s s== ’ spam ’& t e s t . s e t $spam== ’ e m a i l ’ ) ) / l e n g t h ( which ( t e s t . s e t $
spam== ’ e m a i l ’ ) )
FNLDA[ i ]= l e n g t h ( which ( predictLDA $ c l a s s== ’ e m a i l ’&t e s t . s e t $spam== ’ spam ’ ) ) / l e n g t h ( which ( t e s t . s e t $spam
== ’ spam ’ ) )
ErreurLDA [ i ]= l e n g t h ( which ( predictLDA $ c l a s s !=t e s t . s e t $spam ) ) / nrow ( t e s t . s e t )
49
51
53
55
# A r b r e s de d e c i s i o n
mytree=t r e e ( Spam˜ . , t r a i n . s e t )
p r e d i c t T r e e=p r e d i c t ( mytree , t e s t . s e t , t y p e= ’ c l a s s ’ )
57
59
FPCart [ i ]= l e n g t h ( which ( p r e d i c t T r e e== ’ spam ’& t e s t . s e t $spam== ’ e m a i l ’ ) ) / l e n g t h ( which ( t e s t . s e t $spam== ’
email ’ ) )
FNCart [ i ]= l e n g t h ( which ( p r e d i c t T r e e== ’ e m a i l ’&t e s t . s e t $spam== ’ spam ’ ) ) / l e n g t h ( which ( t e s t . s e t $spam== ’
spam ’ ) )
E r r e u r C a r t [ i ]= l e n g t h ( which ( p r e d i c t T r e e !=t e s t . s e t $spam ) ) / nrow ( t e s t . s e t )
61
63
65
# Bagging a v e c 21 a r b r e s
BagResult=i p r e d b a g g ( t r a i n . s e t $spam ,X=t r a i n . s e t [ , − 5 8 ] , nbagg =21)
B a g P r e d i c t=p r e d i c t ( BagResult , t e s t . s e t )
67
69
FPbagg [ i ]= l e n g t h ( which ( B a g P r e d i c t== ’ spam ’&t e s t . s e t $spam== ’ e m a i l ’ ) ) / l e n g t h ( which ( t e s t . s e t $spam== ’
email ’ ) )
FNbagg [ i ]= l e n g t h ( which ( B a g P r e d i c t== ’ e m a i l ’&t e s t . s e t $spam== ’ spam ’ ) ) / l e n g t h ( which ( t e s t . s e t $spam== ’
spam ’ ) )
B a g g i n g E r r o r [ i ]= l e n g t h ( which ( B a g P r e d i c t !=t e s t . s e t $spam ) ) / nrow ( t e s t . s e t )
71
73
75
#Random F o r e s t a v e c 20 a r b r e s
myForest=randomForest ( Spam˜ . , data=t r a i n . s e t , n t r e e =25)
p r e d i c t F o r e s t=p r e d i c t ( myForest , t e s t . s e t )
77
79
FP RandomForest [ i ]= l e n g t h ( which ( p r e d i c t F o r e s t== ’ spam ’ &t e s t . s e t $spam== ’ e m a i l ’ ) ) / l e n g t h ( which ( t e s t .
s e t $spam== ’ e m a i l ’ ) )
FN RandomForest [ i ]= l e n g t h ( which ( p r e d i c t F o r e s t== ’ e m a i l ’&t e s t . s e t $spam== ’ spam ’ ) ) / l e n g t h ( which ( t e s t .
s e t $spam== ’ spam ’ ) )
E r r e u r F o r e s t [ i ]= l e n g t h ( which ( p r e d i c t F o r e s t !=t e s t . s e t $spam ) ) / nrow ( t e s t . s e t )
81
83
}
18

Documents pareils